1、类型转换就是客户端用户输入的参数转化为服务器端java的对象,不管用户输入什么样的内容,到客户端都是以字符串的形式存在。
2、int与Date的转换是struts2的内置拦截器自动转换的。
3、输入校验是验证用户输入的信息是否合法是否有效。
4、输入校验是建立在类型转换的基础之上的误显示的功能,。
5、struts2的标签库已经内置了错但是必须使用struts2的标签<s:fielderror></s:fielderror>才能显示错误信息。
6、ActionSupport在com.opensymphony.work2下。ActionSupport实现的Action,而Action里面的常量代表的是与它相对应的小写字符串。
7、如果返回页面没有input页面的话当类型转换或校验出错的时候会出现404No result defined for action action类 and result input错误。
8、struts2一但发现类型转换或输入校验失败它会去寻找一个名字叫做input的页面,然后转到这个页面。
9、验证方法validate是ActionSupport实现接口Validateable里的方法。在ActionSupport里这个方法没有实现任何东西,是让子类重写此方法来实现自己想要的验证。
10、为了防止用户直接从浏览器的地址栏里输入action地址,action里的属性就为null,所以要进行非空验证。
11、Calendar c1=Calendar.getInstance();
c1.setTime(birthday);
Calendar c2=Calendar.getInstance();
c2.setTime(graduation);
让时间与Calendar关联起来。c1.before(c2)时间c1是否在c2之间。
12、在HTML表单里可以用EL方式得到错误信息时返回用户原来的信息。
13、在struts.xml里<result>有一个转发的方式一般情况下是dispatcher,也是默认方式,它有很多种。
14、如果用<s:fielderror>来显示错误信息,它会以<ul><li>的方式来显示错误的信息。
15、遇到类型转换错误的时候(也就是说不能进行类型转换),struts2框架自动生成一条错误信息,并且将该错误信息放到addFieldError里面。
16、当年龄不可以转换的时候,struts2有内置的错误显示:"Invalid field value for field 'age'",age对应表单里的数据,这种错误信息一定要被替换掉。
17、struts2提供一个资源文件来解决这个问题,用于类型转换的错误信息,这个文件是用于类型转换的。
18、全局:struts.xml里加上一个constant标签,它不在package里。它表示在struts整个框架里要使用那些常量就把它写进去。要替换struts2自带的错误信息应加上<constant name="struts.custom.i18n.resources" value="message"></constant>它就把struts里源有的资源文件替换成为message的资源文件,不需要加properties,message.properties文件放在src目录下,即放在classes目录下。
19、在建立的属性文件里定下xwork.default.invalid.fieldvalue={0} error它前面不变的,xwork.default.invalid.fieldvalue当任何的一个属性转换出问题的时候就会显示后面的信息,后面表示的是“属性名 error”显示在页面上。
20、类型转换也有全局和局部的,上面的是全局的。局部的是验证某一个action里的局性。如果要验证某一个action里的属性,在action的包下建一个 “Action类名.properties”属性文件,内容格式:invalid.fieldvalue.属性名=要现实的信息 。显示信息若是中文时不能直接在文件中写中文,否则会出错,应该将中文转换为encoder的编码方式,可以用jdk中bin目录下的native2ascii.exe工具进行转换。
21、当局部与全局转换同在的时候局部会替换掉全局的错误信息。
22、struts2里的表单默认提交方式为post,它默认的有自动显示错误信息功能,也可以保存用户原来输入的数据。
23、当时间转换失败时给时间属性添加一个null值,所以就不需要添加null值判断。int类型的属性如果转换不成功将默认是0;
24、类型转换与输入校验的流程
1. 首先Struts2对客户端传来的数据进行类型转换
2. 类型转换完毕后再进行输入校验
3. 如果类型转换和输入校验都没有错误发生,那么进入execute方法(调用商业逻辑)
注意:如果类型转换不成功,也同样要进行输入校验
25、实际应用中从不用struts内置的错误信息。
26、addFieldError用于存放类型转换的错误信息或验证的错误信息。addFieldError是ActionSupport实现ValidationAware里的方法,还有一种addActionError方法,实现上action有两种错误级别一种是field级别的错误信息显示的时候用struts的form表单或<s:fielderror>标签,别一种是action级别的错误信息显示的时候只可以用<s:actionerror/>标签显示。
27、addFieldError是把错误信息存放在Map里面,addActionError是把信息存放到Collection里面去。
28、struts的form标签只可以显示field级别的信息,它不可以显示action级别的信息。
29、有时会同时出现field与action级别的错误信息,如类型转换写验证同时出问题,解决这一个问题把每一个struts标签里加上一个theme="simple"表示不让struts对标签进行封装,它也不生成多于的代码,也就没有struts给的错误提示。theme=”simple”如果在<s:form>标签中,则会使struts的标签格式取出,自己生成的表格页消除,便于自定义格式。
30、struts生成的控件id是:form的action值_控件名。
31、struts2里没有像struts1里的dispatchaction类,它是在struts.xml里的action里加一个method属性,它的值就是对应的逻辑方法名,如果有多个业务逻辑方法,就把这个类写成多个<action>标签。当method出现时就不走execute方法。如:<action name="register"
class="com.test.action.RegisterAction" method="abc">
32、应该是一个业务逻辑方法对应一个验证方法,它是用validate+业务逻辑方法,方法名的第一个字母大写。其中在action类中不管有多少个验证方法都会执行validate方法。如:public void validateAbc()。
33、当多个验证方法时validate是验证所有。而validateExecute方法是专用于来验证execute方法的。
34、校验也可以用xml来校验,xml是通用的,建议在一般情况下用xml验证,只有当业务校验非常非常复杂时才用validate来校验。
35、xml校验方法:
在action包下建xml文件,程序运行时会自动寻找此xml校验文件,命名规则为“Action类名-validation.xml”,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 name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>username should not be blank!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>username should be between ${minLength} and ${maxLength}</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<message>password should not be blank!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>password should be between ${minLength} and ${maxLength}</message>
</field-validator>
</field>
<field name="repassword">
<field-validator type="requiredstring">
<message>repassword should not be blank!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>repassword should be between ${minLength} and ${maxLength}</message>
</field-validator>
</field>
<field name="age">
<field-validator type="required">
<message>age should not be blank!</message>
</field-validator>
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>age should be between ${min} and ${max}</message>
</field-validator>
</field>
<field name="birthday">
<field-validator type="required">
<message>birthday should not be blank!</message>
</field-validator>
<field-validator type="date">
<param name="min">2001-01-01</param>
<param name="max">2003-12-31</param>
<message>birthday should be between ${min} and ${max}</message>
</field-validator>
</field>
<field name="graduation">
<field-validator type="required">
<message>graduation should not be blank!</message>
</field-validator>
<field-validator type="date">
<param name="min">2005-01-01</param>
<param name="max">2007-12-31</param>
<message>graduation should be between ${min} and ${max}</message>
</field-validator>
</field>
</validators>
36、struts2也支持客户端的js验证,但比较弱,进行客户端验证的同时也必须进行服务器端验证,因为如果用户直接从地址栏中输入action请求,则客户端失效!
37、客户端js验证的方法:
(1)form(一下都是说的struts的标签form)的主题(theme)不能为simple
(2)将form的validate属性设为true
建议最好不要使用struts给定客户端校验,了解即可。我们可以自己写js进行客户端验证,方法是:
在struts2标签form中加入οnsubmit=”return validate();”,待验证的每个struts标签中都加入一个唯一标志id,通过id获得提交的属性值
Javascript代码如下:
<script type="text/javascript">
function validate(){
var usernameValue=document.getElementById("usernameId").value;
var passwordValue=document.getElementById("passwordId").value;
var repasswordValue=document.getElementById("repasswordId").value;
if(usernameValue.length==0){
alert("用户名不能为空");
return false;
}
else if(usernameValue.length<6||usernameValue.length>10){
alert("用户名必须在6到10位之间");
return false;
}
if(passwordValue.length==0){
alert("请输入密码");
return false;
}
else if(passwordValue.length<6||passwordValue.length>10){
alert("密码必须在6到10位之间");
return false;
}
if(repasswordValue.length==0){
alert("密码不能为空");
return false;
}
else if(repasswordValue.length<6||repasswordValue.length>10){
alert("密码必须在6到10位之间");
return false;
}
}
</script>
38、xml校验也有全局校验和局部校验,上面说的就是全局校验,校验的xml文件是: “Action类名-validation.xml”。也可以对一个Action类的某一个方法进行校验,如对 public String test(){ return SUCCESS;}校验,则xml文件名应写为:”Action类名-test-validation.xml”.当一个类中有多个需要校验的方法是应对每个方法写一个校验文件,而不必再去写全局校验文件,否则,程序会先执行全局校验在执行局部校验,造成混乱。局部xml校验文件与全局校验文件书写方式一样。
39、xml校验器分为字段校验器(field)和非字段校验器(validator),两者的功能是一样的,所以学会一种即可,建议是用字段校验器,他更直观,就是上边说的那种。
39、short-circuit=“true”表实校验短路,当校验出错时不再执行下边的校验,如:
<field name="username">
<field-validator type="requiredstring" short-circuit=”true”>
<param name="trim">true</param>
<message>username should not be blank!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>username should be between ${minLength} and ${maxLength}</message>
</field-validator>
</field>