[标题]:[原]Struts2校验框架
[时间]:2009-7-27
[摘要]:校验框架配置、客户端校验
[关键字]:浪曦视频,Struts2应用开发系列,WebWork,Apache,validation
[环境]:struts-2.1.6、JDK6、MyEclipse7、Tomcat6
[作者]:Winty (wintys@gmail.com) http://www.blogjava.net/wintys

[正文]:
    Struts校验框架提供了一种不用编写代码,只需修改配置文件即可对输入进行校验的功能。代码方式校验,即重写validate()方法。实际应用中,validate()与校验框架一般只选其一

1、校验框架配置
    在RegisterAction.java相同目录新建校验框架配置文件RegisterAction-validation.xml。RegisterAction-validation.xml的DTD可以复制struts自带的示例struts2-mailreader-2.1.6中的DTD:
<!DOCTYPE validators PUBLIC
          "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
          "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

xwork-validator-1.0.2.dtd:
<?xml version="1.0" encoding="UTF-8"?>

<!--
  XWork Validators DTD.
  Used the following DOCTYPE.
 
  <!DOCTYPE validators PUBLIC
          "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
          "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-->


<!ELEMENT validators (field|validator)+>

<!ELEMENT field (field-validator+)>
<!ATTLIST field
    name CDATA #REQUIRED
>

<!ELEMENT field-validator (param*, message)>
<!ATTLIST field-validator
    type CDATA #REQUIRED
    short-circuit (true|false) "false"
>

<!ELEMENT validator (param*, message)>
<!ATTLIST validator
    type CDATA #REQUIRED
    short-circuit (true|false) "false"
>

<!ELEMENT param (#PCDATA)>
<!ATTLIST param
    name CDATA #REQUIRED
>

<!ELEMENT message (#PCDATA)>
<!ATTLIST message
    key CDATA #IMPLIED
>


RegisterAction-validation.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
          "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
          "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
 
 <validators>
 <!--  
     与field等价的validator
     <validator type="requiredstring">
         <param name="fieldName">name</param>
         <param name="trim">true</param>
         <message>name required</message>
     </validator>
     <validator type="stringlength">
         <param name="fieldName">name</param>
             <param name="trim">true</param>
             <param name="minLength">6</param>
             <param name="maxLength">10</param>
             <message>name length range : ${minLength} ~ ${maxLength}</message>
     </validator>
 -->    
     <field name="name">
         <field-validator type="requiredstring" >
             <param name="trim">true</param>
             <message>name required</message>
         </field-validator>
         <field-validator type="stringlength">
             <param name="trim">true</param>
             <param name="minLength">6</param>
             <param name="maxLength">10</param>
             <message>name length range : ${minLength} ~ ${maxLength}</message>
         </field-validator>
     </field>
     
     <field name="age">
         <field-validator type="conversion" short-circuit="true">
             <message>the field age conversion error</message>
         </field-validator>
         <field-validator type="int">
             <param name="min">1</param>
             <param name="max">150</param>
             <message>age range: ${min} ~ ${max}</message>
         </field-validator>
     </field>
     
     <field name="birthday">
         <field-validator type="required">
             <message>birthday required</message>
         </field-validator>
         <field-validator type="date">
             <param name="min">2009-01-01</param>
             <param name="max">2009-12-31</param>
             <message>birthday range: ${min} ~ ${max}</message>
         </field-validator>
     </field>
     
     <field name="email">
         <field-validator type="email">
             <message>invalid email address</message>
         </field-validator>
     </field>
 </validators>

说明:
a.校验框架有两种校验方式:field和validator。
field校验:先指定需要校验的属性,再指定校验方式。validator校验:先指定校验方式,再指定需要校验的属性。两种方式是等价的。

field校验:
<field name="name">
    <field-validator type="requiredstring" >
        <param name="trim">true</param>
        <message>name required</message>
    </field-validator>
    <field-validator type="stringlength">
        <param name="trim">true</param>
        <param name="minLength">6</param>
        <param name="maxLength">10</param>
        <message>name length range : ${minLength} ~ ${maxLength}</message>
    </field-validator>
</field>

validator校验:
<validator type="requiredstring">
    <param name="fieldName">name</param>
    <param name="trim">true</param>
    <message>name required</message>
</validator>
<validator type="stringlength">
    <param name="fieldName">name</param>
    <param name="trim">true</param>
    <param name="minLength">6</param>
    <param name="maxLength">10</param>
    <message>name length range : ${minLength} ~ ${maxLength}</message>
</validator>

b.<field-validator type="requiredstring" >中的type及其对应的xwork类可以在xwork-2.1.2.jar/com.opensymphony.xwork2.validator.validators/default.xml中查找到。
default.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//OpenSymphony Group//XWork Validator Config 1.0//EN"
        "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">

<!-- START SNIPPET: validators-default -->
<validators>
    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
    <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
    <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
    <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>
<!--  END SNIPPET: validators-default -->

c. 对于校验<field-validator type="requiredstring" >:String用requiredstring,其它类型用required。
d. 验证错误将默认产生FieldError。
e. short-circuit="true" : 一个校验失败,是否是继续执行后续校验。
f. 对于相同属性的FieldError,validate()方法中的验证和RegisterAction-validation.xml中的验证都会执行,并且FieldError都会显示。
执行顺序: RegisterAction-validation.xml => validate()。


2、特定于业务逻辑的局部校验:
对于struts.xml中<action>的method="register"指定的业务方法register(),使用校验RegisterAction-register-validation.xml(与RegisterAction.java在同一目录下)。同时,RegisterAction-validation.xml会被执行。执行顺序:  RegisterAction-validation.xml => RegisterAction-register-validation.xml

3、Struts2客户端校验
    设置struts标签<s:form>中validate="true"。这样就会根据RegisterAction-validation.xml生成页面Javascript,在客户端执行校验。
 
 注意:
 a.struts标签不能使用simple主题
 b.Struts2客户端校验功能较弱,一般不用。

4、FieldError和ActionError的实现
a.真正存放field级别错误信息的对象是LinkedHashMap。
b.该LinkedHashMap的key是String类型的,value是ArrayList类型,所以同一个key可以对应多个错误消息。
c.对于Action级别的错误信息,实际上是放置在ArrayList中的。
    
[参考资料]:
    《浪曦视频之Struts2应用开发系列》
posted @ 2010-07-27 10:01 勒紧皮带向前冲| 编辑 收藏
 

一.WebContextLoaderListener 监听类
它能捕捉到服务器的启动和停止,在启动和停止触发里面的方法做相应的操作!
它必须在web.xml 中配置才能使用,是配置监听类的

二.下面是搜集的一些listener方面的知识
简例一
监听用户上线与退出,显示在线用户

1、登陆页面 Login.jsp

<%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" %>
<%
session=request.getSession(false);
if(session!=null)session.invalidate();
%>
<html>
<head><title></title></head>
<body>
<form action="isOnline.jsp" method="post">
用户名:<input type="text" name="uName"/>
<input type="submit" value="上线">
</form>
</body>
</html>

2、控制页面(只是为了说明监听器问题,所以简单了点...) isOnline.jsp

<%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" %>
<html>
<head><title></title></head>
<body>
<%
session=request.getSession();
session.setAttribute("userName",request.getParameter("uName"));
response.sendRedirect("showOnline.jsp");
%>
</body>
</html>


3、显示页面 showOnline.jsp

<%@page pageEncoding="gb2312" contentType="text/html; charset=gb2312" import="java.util.ArrayList" %>
<html>
<head><title></title></head>
<body>
<%
ArrayList showList=(ArrayList)(getServletContext().getAttribute("list"));
out.print("在线人数 "+showList.size()+"<br>");
for(int i=0;i<showList.size();i++){
out.print(showList.get(i)+"在线"+"<br>");
}
%>
<br>
<a href="Login.jsp">退出</a>
</body>
</html>

4、配置页面 web.xml

<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<listener>
    <listener-class>org.xiosu.listener.onlineListener</listener-class>
</listener>
</web-app>

5、监听器 onlineListener.java

package org.xiosu.listener;

import java.util.ArrayList;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class onlineListener implements HttpSessionListener,
HttpSessionAttributeListener {
// 参数
ServletContext sc;
ArrayList list = new ArrayList();
// 新建一个session时触发此操作
public void sessionCreated(HttpSessionEvent se) {
sc=se.getSession().getServletContext();
System.out.println("新建一个session");
}
// 销毁一个session时触发此操作
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("销毁一个session");
if (!list.isEmpty()) {
   list.remove((String) se.getSession().getAttribute("userName"));
   sc.setAttribute("list", list);
}
}
// 在session中添加对象时触发此操作,在list中添加一个对象
public void attributeAdded(HttpSessionBindingEvent sbe) {
list.add((String) sbe.getValue());
sc.setAttribute("list", list);
}
// 修改、删除session中添加对象时触发此操作
public void attributeRemoved(HttpSessionBindingEvent arg0) {
}
public void attributeReplaced(HttpSessionBindingEvent arg0) {
}
}


说明:本例只为简单介绍监听器,并未进行安全方面设置。

监听器也叫Listener,是Servlet的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作,比如监听在线的用户的数量。当增加一个HttpSession时,就激发sessionCreated(HttpSessionEvent   se)方法,这样
就可以给在线人数加1。常用的监听接口有以下几个:
ServletContextAttributeListener监听对ServletContext属性的操作,比如增加、删除、修改属性。
ServletContextListener监听ServletContext。当创建ServletContext时,激发contextInitialized(ServletContextEvent   sce)方法;当销毁ServletContext时,激发contextDestroyed(ServletContextEvent   sce)方法。
HttpSessionListener监听HttpSession的操作。当创建一个Session时,激发session   Created(HttpSessionEvent   se)方法;当销毁一个Session时,激发sessionDestroyed   (HttpSessionEvent   se)方法。
HttpSessionAttributeListener监听HttpSession中的属性的操作。当在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent   se)   方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent   se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent   se)   方法。
example:随服务器启动
web-app>

      com.tb.listener.CountStartListener


package com.tb.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpServlet;
import com.tb.timertask.DoCountTask;
public class CountStartListener extends HttpServlet implements ServletContextListener
{
private static final long serialVersionUID = 1824920962239905170L;
public CountStartListener()
{
   // TODO Auto-generated constructor stub
}
public void contextDestroyed(ServletContextEvent arg0)
{
   // TODO Auto-generated method stub
}
   public void contextInitialized(ServletContextEvent arg0)
{   
   DoCountTask.dotask();
}
}

posted @ 2010-06-01 10:33 勒紧皮带向前冲 阅读(12647) | 评论 (0)编辑 收藏
 
     摘要: Flex+Spring+Hibernate整合  阅读全文
posted @ 2010-05-23 18:03 勒紧皮带向前冲 阅读(3907) | 评论 (2)编辑 收藏
 
在分享这几种配置之前,先简单的介绍一下需要用到的一些资源。
1、 MyEclipse+Flex 插件(官网下载)
2、 Tomcat6.0作为服务器(官网下载)
3、 用 BlazeDS(免费)代替 LCDS(收费) :没钱啊,只能先使用免费的了。从 Adobe
官方网站上下载下来,将 blazeds.war、ds-console.war、samples.war 三个文件放在
tomcat的webapps目录下。
Flex+Java配置
第一种: Java工程和 Flex 工程独立,这种方式也是很多人使用的方式, Flex程序员和 Java
程序员相互独立的工作,这种方式网上有很多的资料,在这里就不再 赘述了。
第二种:Flex工程加入 Java 元素
1、 切换到 Flex视图,新建 Flex project,如下图

说明: Java source folder 就是你自己 java业务源码存放的根目录,在 FB3 里, LCDS
项目旨在将 Java J2ee 项目和 FlexLcds 项目混合。

当然如果你不选择 combined 两个在一起,那么就麻烦些:要么你再单独新建一个
Flex 项目,而这个项目只写 java代码。要么再建一个J2ee工程写 java代码,而这

因为我们是要 java 和 flex结合,所
以在服务器选择上我们选择 J2EE

存放java类的源文件,我们的目的
就是Flex和 java在一个工程里,所
以我们这里选择上
个项目只写 Flex 代码,但最后要把 Java 编译后的 class 文件放到这个项目下的
webroot\web-inf\classes 目录中。即不管怎样,最后发布时,java 编译后的 class
文件必须和 lcds 部署的项目在一起。
2、 点击Next,配置 J2EE服务器,如下图

说明:Target runtime 实际上没什么用(后来我删除了配置文件里的对应信息,也
没问题),但是不指定就不能继续,如果这里显示的是<none>那么就新建一个
Tomcat 的runtime,简单的只需要指定tomcat 的安装目录即可。

Content folder 实际上就是最终编译后的容器目录,因此,BlazeDS 的 blazeds.war
文件将会发布到 该目录 下的 web-inf 下的 flex 目录中。同时因为教程采用的是
MyEclipse,他默认的就是发布 WebRoot 里的内容,为了自动化,因此这里改为了
WebRoot(这也是 java 开发的习惯)

Flex WAR file 指的是安装了 lcds 后的 flex.war 文件的路径,但是在这里我们采用
的是BlazeDS来取代 lcds,所以这里设置的是 blazeds.war的路径。

Compilation options 指定了 flex 文件的编译方式,选择推荐的在 FlexBuilder 里编
译吧,虽然开发时多耗点时间,但是在发布后不会占用服务器的编译处理时间,对
用户来说是有好处的。

Output folder 指的是 Flex 编译后的 swf 和 html 等文件存放的路径,这里改为了
WebRoot,意思是发布到根目录就可以了。当然你可以根据你的需要和习惯自行设
置其他的路径

因为我们采用的 BlazeDS,所
以这里要设置 BlazeDS 的路

这里我们可以自定义输出路径,
一般情况下设置成根目录
WebRoot 就可以了
3、 点击下一步,采用默认的配置就可以,点击完成,该工程就建立完成。下图为该工
程的目录结构

4、 让它变成 web工程由MyEclipse发布吧


Flex 文件的源文件夹Java 源文件夹自动生成的flex 的配置文件
Flex 编译后发布的文件。我们发布在根目录下


点击Finish,现在我们的工程的图标变成了 J2EE Web 工程了,这意味着,你可以


注意,不要点的太快了,要把这里的
对号勾掉,这样就不会覆盖 BlazeDS
创建的 web.xml 用MyEclipse来发布它或者添加更多容器,比如hibernate、spring等

5、 工程建好以后,你可以通过右键—>属性来进行更多的设置。

6、 这样一个 Flex+Java的工程就建立完成。
7、 编写例子,测试在介绍完第三种方式以后统一介绍。

第三种:由 Web project反向加入 Flex,也就是Java+Flex
1、 先建立一个 web工程:flexweb。(略)
2、 向flexweb 工程手工添加 Flex需要的元素。
1)首先将 BlazeDS需要的jar文件拷到工程的 lib 目录下。可以将上面建的那个 flex
工程的 lib下的jar文件拷到该工程下的 lib目录下。
2)然后要加入 Flex BlazeDS需要的配置文件。在 WEB-INF下新建一个名为 flex 的文
件夹,然后将我们上面建立的那个 firstFlex 该文件夹下的四个 xml 文件拷到该文件
夹下。
3)最后,修改 web.xml 文件,加入 Flex 的配置。做法一个简单的把上面我们新建
的那个 flex工程的web.xml的部分代码拷过来。

(注意:这样会出错,可以把

<web-app version="2.4"
xmlns="
http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

改为:<web-app>)(本人提示:这里经本人测试,并不需要这样更改,本人的测试环境为Eclipse3.4+MyEclipse7.5,不排除在此版本前不需要做更改)


<context-param>
<param-name>flex.class.path</param-name>

<param-value>/WEB-INF/flex/hotfixes,/WEB-INF/flex/jars</param-val
ue>
</context-param>

<!-- Http Flex Session attribute and binding listener support -->
<listener>

<listener-class>flex.messaging.HttpFlexSession</listener-class>
</listener>

<!-- MessageBroker Servlet -->
<servlet>
<servlet-name>MessageBrokerServlet</servlet-name>
<display-name>MessageBrokerServlet</display-name>

<servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
<init-param>
<param-name>services.configuration.file</param-name>

<param-value>/WEB-INF/flex/services-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>MessageBrokerServlet</servlet-name>
<url-pattern>/messagebroker/*</url-pattern>
</servlet-mapping>
3、 将该工程发布到tomcat下,并启动 tomcat。(注:一定要启动tomcat,因为在后面
的设置中,它要验证工程的路径)
4、 然后在该工程上右键Flex Project NatureAdd Flex Project Nature



5、 设置完成后,会发现 web工程的目录结构已经发生了改变,如下图。
我们发现以这种形式建立的工程的目录结构和第二种方法有少许的不同,flex 的
mxml文件默认的放在 src文件夹中,和java文件共用一个目录。并且没有像上一个
工程那样自动的编译出可运行的文件。

配置服务器路径
配置正确的显示
建议不要修改这里的配置

6、 如果你对这个目录结构不太满意,还想让 flex 的文件放在 flex_src 目录下,别急,
我们可以通过右键属性来设置。如下图

在这里你可以重新设置你的 flex源文件夹和输出目录
7、 配置 flex 默认的 sdk。这样配置完,还不行,程序可能还不能正常地运行,还需要
配置他使用的 sdk。如下图

8、 马上就大功告成了,让我们来写个程序测试一下吧。
1)新建一个 java类:Hello.java
package com;

public class Hello {
public String hello(String name){
System.out.println("flex调用我了,真好~~~~");
return "hello "+name;
}
}
2)为flex配置这个要调用的对象,修改WEB-INF/flex下remoting-config.xml
加入:
<destination id="hello">
<properties>
<source>
com.Hello
</source>
</properties>
</destination>

3)编写一个Flex程序
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute">
<mx:Script>
<![CDATA[
import mx.rpc.events.ResultEvent;

function gg(evnet:ResultEvent):void{
var ff:String = evnet.result as String;
ggg.text = ff;
}

function remotingSayHello():void{
var sname:String = nameInput.text;
h.hello(sname);
}
]]>
</mx:Script>

<mx:RemoteObject destination="hello" id="h"
result="gg(event)"
endpoint="http://localhost:8080/flexweb/messagebroker/amf" >

</mx:RemoteObject>


<mx:TextArea id="ggg" x="109" y="122"/>

<mx:Button label="say hello" click="remotingSayHello();"
x="144" y="193"/>
<mx:TextInput id="nameInput" x="109" y="73"/>
<mx:Label text="name" x="47" y="75"/>
</mx:Application>
4)重启tomcat,运行flexweb.mxml.
第三种方法,在编译完后,访问网页会出现 404 异常。具体原因不详。但是它仍会编译出
一个 swf文件,访问这个 swf 即可。而第二种方式可以编译出一个 html 文件。访问一下会出
现一下界面:
输入 dfdff,则输出 hello dfdff。说明调用 java 类成功。不信我们可以看看 java
类在控制台上的打印。

配置成功,高兴吧,o(∩_∩)o…哈哈。
如果用 lcds,则不需要预编译,可以直接访问 mxml 文件,lcds 会动态编译返回结果。(本人提示:其实你可以通过在上面配置中的flex输出目录中访问其html文件例如:http://127.0.0.1:8080/xxx/xxx_debug/xxx.html

解决:

倒数第11行的404 异常,我对比第二种和第三种发现第三种漏了


这个文件夹,所以解决办法:把漏的文件夹整个从第二种拷一份到项目中、刷新,一定要刷新到到出现

这个文件夹有这些内容,才可以成功。

注:文章中出现的“本人提示”是转载者,不是原作者。
(本人提示:对于第三种方式整合,建议其需要修改的文件全从第二种拷贝,这样能避免一个status404错误)。
posted @ 2010-05-18 23:34 勒紧皮带向前冲 阅读(3443) | 评论 (1)编辑 收藏
 

不可否认MyEclipse现在越做越强大(毕竟是收费的嘛),强大到开始排斥第三方插件,这有些不符合Eclipse的初衷,Eclipse就是靠良好的扩展性发展起来的。

MyEclipse从7.5开始(7.0没用过,不知道),完全改变了程序结构,现在扩展第三方插件 再也没有以前那么方便了,特别是link方式,这对程序员来说是致命的。Flex Plugin 安装时需要选择Eclipse目录,7.5中根本没有Eclipse目录,所以想直接在myeclipse中安装flex plugin是不太可能。我试过将flex里的features和plugins目录拷贝到myeclipse中进行强制安装,还是失败,所以最后只能将Eclipse,Flex plugin和myeclipse分开进行安装。

MyEclipse 7.5对应的Eclipse 版本为3.4,先到www.Eclipse.org官网去下载Eclipse3.4的版本。然后再到Myeclipse官网(已屏蔽大陆IP,需代理,但下载可以用迅雷直接下)去下载增量升级包,注意,一定要是增量升级包,即archived update site.zip 这个包,不能下载集成安装包,flex builder plugin 的版本也必须为3.02,这一点很重要,Adobe官网已经很明确的说明了3.0本版存在bug,不能再Eclipse3.4  中安装,已经下载3.0本版的可以到Adobe官网或google 中去下载补丁。安装顺序是,先解压Eclipse3.4 ,然后安装 Flex plugin ,和以前的安装方法一样,选好目录,直接下一步就行,然后再通过Eclipse的Help->Software Updates->Available Software ->Add site->Archive安装刚才下载的MyEclipse7.5 的增量升级包。如果你RP不是特别差的话,应该就大功告成了,Enjoy this !

同样,MyEclipse8.0中的Flex plugin 也可以这样安装。需要说明的是MyEclipse8.0 对应的Eclipse版本是3.5 。Eclipse3.5 对应的Flex plugin为4.0.目前Flex plugin 4.0的正式版还没出,还是Beta 版 ,Flex builder4 已经正式更名为 Flash builder4了 ,还是喜欢Flex builder的命名,感觉更加专业点,哈哈!


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/turejackon/archive/2010/03/10/5365821.aspx

posted @ 2010-05-17 09:46 勒紧皮带向前冲 阅读(1539) | 评论 (0)编辑 收藏
 
     摘要: Ext:让Grid支持中文排序  阅读全文
posted @ 2010-04-01 11:02 勒紧皮带向前冲 阅读(653) | 评论 (0)编辑 收藏
 
开发环境:Struts2.0.11.1
问题描述:当点击页面链接时候,随机出现以下对话框,Internet Explorer无法打开Internet站点http://localhost:8080/kmtcm/login.action 已终止操作
问题原因:页面使用了My97DatePicker这个日期控件,大概是在IE下载完了源文件但没有加载完,这个时候用JS的DOM对象的AppdenChid和innerHTML就会出错。我用FireFox试下,完全没有问题。
解决方法使用其他日历控件代替。
在此我替换使用的是jquery ui的日历插件。
关于使用方法(转自:http://hi.baidu.com/fairywood/blog/item/638bee30e4d4649ea8018ec8.html):
JQuery 日期控件
2009-02-12 13:16
    JQuery提供了很多控件, 例如用于选择日期的日期控件(Date Picker)。这些控件并没有随Jquery的核心库一并发布。而是作为一个叫做"JQuery UI"的子项目——或者叫做插件——的形式发布。
所以, 我们除了要在页面中引用jquery的那个js文件外, 还需要在http://jqueryui.com/下载与我们使用JQuery对应版本的JQuery UI的程序包。
目前, 最新的JQuery版本是1.3。 与这个版本对应的JQuery UI版本是1.6rc6。
由于JQuery UI采取了显示和功能分离的设计(皮肤, 或者叫”换肤“)。所以, 我们需要为日期控件附加样式。JQuery UI最神奇的特点之一就是提供了一个网站来给我们修改控件的样式:http://jqueryui.com/themeroller/。在这个页面中, 将控件样式调整满意后, 点击左侧的"Download theme"按钮。就可以把样式下载下来了。现在, 下载的是JQuery UI1.6rc5版本所使用的样式库。如果您用的较低的1.5, 那么请注意在点击”Download theme“按钮后出现页面的右侧选择相应的版本。不然, 不同版本的样式是不兼容的。
将下载下来的zip包解开, 我们可以看到里面已经准备好我们要用jquery核心库和JQuery UI的库。首先, 我们把jquery-1.3.x.js复制到网站的js目录下,jquery-ui-personalized-1.6rc6.min.js、i18n目录、theme目录复制到网站js/ui目录下。
JQuery核心库的安装非常简单, 我们把jquery.1.3.x.js文件引入页面即可。一般来说, 我们会把这个js文件改名为jquery.js, 放到“/js"目录下。
然后, 我们将jquery-ui-personalized-1.6rc6.min.js引入页面。如果觉得它的文件名太长。可以直接改成jquery-ui.js或者其他比较短的名字。
最后, 引入分别引入js/ui/theme/ui.all.css样式表以及/js/ui/i18n/ui.datepicker-zh-CN.js脚本文件到页面中。就完成了中文日期控件的安装。如果我们需要其他语言的空间, 请更换ui.datepicker-zh-CN.js文件。在js/ui/i18n中有很多其他语言的脚本。
终于, 我们可以在页面中,给某个输入框绑定一个日期控件了。例如, 我们的页面中有这么一个input:
<input type="text" id="birthday" name="birthday"/>
那么, 我们可以在$(document).ready()的事件函数(不懂的可以参见Jquery核心库的说明或者网上的相关资料)中写:$("birthday").datepicker();
现在打开页面, 如果不出意外。当我们点击这个文本框的时候就可以出现一个很炫的日期控件了。

现在修改一下:$("#bithday").attr("readonly", "true").datepicker(); 这样一来,用户就不能手工输入, 而只能通过控件选择日期了。

上面简单介绍了一下日期控件的使用方法。其实, 他们的可定制性是非常高的。今天我们只是使用了它们最简单最基本的功能。
posted @ 2010-02-26 14:03 勒紧皮带向前冲 阅读(1886) | 评论 (0)编辑 收藏
 
晚上做DEMO的时候遇到了这个问题,其实字面意义很明了:一个是display:inline把元素显示为行内元素,float:left让其脱离文档流,浮动起来。但对其具体的用处和区别还是不解。
于是google一下,好像这个问题并不像其它问题一样有很多博客转载,但还是找到了一些可以参考的东西。
细看了下,网上仅有的一些资料都是转载自这篇博文:http://andymao.com/andy/post/42.html。我也看了一下,但说实话只看懂了一半(可能是对标准化页面的设计还了解得不够深)。
于是动手做了一下实验,一目了然:

例:
XHTML部分
<ul class="disp">
<li>aaa</li>
<li>bbb</li>
<p>asdfadsf</p>
</ul>

<ul class="floa">
<li>ccc</li>
<li>ddd</li>
<p>eweweew</p>
</ul>
CSS部分:
ul.disp li
{
display:inline;
}
ul.floa li
{
float:left;
}
结果:
第一个class为disp的UL里LI显示为aaa,bbb为同一行,而
asdfadsf则另起了一行。前两个都均已经设为了行内元素。所以它们还是占着一行,下一个元素就另起了一行。
第二个class为 floa的UL里三个L均I显示在同一行里,因为前两个已经设为了float:left脱离了标准的文档行,而下一个块级元素,则忽略了前面的元素,而继续按照标准的文档进行排列。

最后摘抄一下,浏览到有用的资料:

首先我们要明确,display:inline;与float:left;正确含义。display:inline;(内联)《CSS权威指南》中文字显示:任何不是块级元素的可见元素都是内联元素。其表现的特性是“行布局”形式,这里的“行布局”的意思就是说其表现形式始终以行进行显示。比如,我们设定一个内联元素border-bottom:1px solid #000;时其表现是以每行进行重复,每一行下方都会有一条黑色的细线。如果是块级元素那么所显示的的黑线只会在块的下方出现。

当然这看起来不像是display:inline;与float:left;的区别所在,但是当理解了float:left;的特性那么我们就清楚到底是怎么回事了。float:left;(左浮动)他使得指定元素脱离普通的文档流而产生的特别的布局特性。并且FLOAT必需应用在块级元素之上,也就是说浮动并不应用于内联标签。或者换句话来说当应用了FLOAT那么这个元素将被指定为块级元素。

那么我们很清楚了,内联(display:inline;)元素不能设置宽高,因为内联属于行布局,其特性是在一行里进行布局,所以不能被设定宽高。

posted @ 2010-02-23 10:37 勒紧皮带向前冲 阅读(652) | 评论 (0)编辑 收藏
 
     摘要: 后台报SQL Error: 1064, SQLState: 42000错误,Could not synchronize database state with session   阅读全文
posted @ 2010-01-09 11:25 勒紧皮带向前冲 阅读(9404) | 评论 (1)编辑 收藏
 
新的项目决定使用s2sh框架,于是按文档整合好,在加入tiles后,启动包实例化tles实例化不能。翻篇看文档,找解决。
同事也同样遇到这样的问题。经两人花费两天时间后中解决。
由于jar包的冲突,特别是asm这个包,我和同事,是用了不同的asm版本,他使用低版本,我使用高版本。
因此,将我和他的jar包做个截图,以供以后配置。
先是同事的




我使用的jar包



请一定要注意在s2sht中去掉xerces-2.6.2.jar这个jar包,导致tiles不能启动的元凶。(上面贴出的jar可直接使用)
我和同事用于是用不同版本的asm.jar包,因此将高版本解决方法贴出。(解决方法来自:http://edu.codepub.com/2009/1215/18741.php
解决办法是:
1.去掉类路径上的关于Hibernate的3个lib
asm.jar
asm-attrs.jar
cglib-2.1.3.jar
2.加入Spring中的以下4个lib
asm-2.2.2.jar
asm-commons-2.2.2.jar
asm-util-2.2.2.jar
cglib-nodep-2.1_3.jar

注:我们是用的MyEclipse8自带的jar包。struts2.18,hibernate3.2,spring2.5
posted @ 2010-01-07 13:48 勒紧皮带向前冲 阅读(1146) | 评论 (0)编辑 收藏
仅列出标题
共14页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last