actionerror/>(它只能显示Actionerror级别的错误信息);
《--------------------校验---------------》
4,遇到内型转换错误时,不能进行转换,struts框架自动生成一条错误信息。
并且将错误信息放到addFiledError里面。
那么如何克服内置的错误信息的避免,因为这样客户端是看不懂的。
如何避免呢。
在struts.xml里面多加一个属性是为了替代它的内置错误信息
.
他们分别表示的意思为:
name(国际化的资源文件名字),value(国际化资源文件),这里的message不用写.properties
《---------------全局类型转换验证--------------------》
Message.properties中写的内容如下:
xwork.default.invalid.fieldvalue={0}error
表示哪个出错,就用哪个取代替。
是动态的。
这表示一个全局的
在我们的Struts.xml中的相应得配置为:
《---------------局部类型转换-验证-------------------》
1,当全局和局部并存时,局部会替代全局的。
2,要验证的Action的名字+properties
3,内容:
invalid.filedvalue.属性名字(age)=…….(内容自定)
invalid.fieldvalue.age=ageconversionerrorliutao
当类型转换错误的时候才出现ageconversionerrorliutao的错误的信息。
类型转换和输入校验的关系:
先进行的是类型的转换,然后才是输入校验。
校验是建立在类型转换的基础上的。
内容和message是不一样的。
在我们的Struts.xml中的相应得配置为:
◆我们的类型转换
1属性所在Action+(-conversion.properties)和xwork-conversion.properties是一对的,一个是全局的一个是局部的。
◆我们的验证类型转换
2message.properties和要验证的Action的名字+properties是一对的,一个是全局一个是局部的。
《=========输入校验和类型转换的流程==========》
1,首先struts对客户端传来的信息进行类型转换
2,类型转换完毕后再进行输入校验
3,如果都没有错误的发生,就进入execute方法(调用商业逻辑)
注意:
如果类型转换不成功,也同样进入输入校验。
1,如果想不保留struts标签表格的默认形式,就在struts标签里每个都加上theme=””表主题的意思。
一般参数写simple.这样我们就能随便的修改格式了。
可以把他放在div里面,表格里面。
也不再会有struts给他的错误提示。
2,如果你在XXXAction.java类里面定义了多个yxu方法,那么你的验证方法方法名则为ValidateYxu().则在struts的配置文件里,加上相应的
3,例子:
(在RegisterAction.java中)
publicStringabc()throwsException{
System.out.println("abc======");
returnSUCCESS;
}
//验证方法
publicvoidvalidateAbc(){
System.out.println("thisvalidateAbcmethod!
");
}
在(struts.xml中)
/print.jsp
/register2.jsp
在Action类中因为extends了ActionSupport,所以有validate()方法。
这时和自定义的validateAbc方法执行的先后顺序是:
先执行validateAbc后再执行validate。
所以建议不要用validate,但又由于有execute方法,所以把validate改为validateExecute()方法。
这样就避免了validate的无论怎么都要执行的问题。
《=========struts2的校验框架=========》
---------------------(基于xml的表单的输入校验,功能非常的强大)
《====字段校验器====》
1,要校验Action的名字+(-validation.xml),后面一部分都是一样的。
2,里面的内容是:
3,
4,
5,
6,
7,
8,分别得说明:
一个表示对一个Action属性的验证。
里面可以有多个。
一个是对这个属性的一个校验方式。
在RegisterAction-validate.xml文件中
//表示我们Action中的一个属性名字
//这里的type表示我们的username必须要出现。
所以用requiredstring。
Requiredstring等参数在我们的的struts2的jar包里xwork/com/opensymphony/xwork2/validator/validators/default.xml的文件中能找到。
short-circuit表示短路。
默认为FALSE当定义为TRUE是。
我们的这个校验器不成功是不会执行下一个的。
true//trim表示去掉左右两边的空格.一个可以对应多个
usernameshouldnotbenull!
//这是校验当出错时在客户端显示的信息.
//这是验证username的长度必须在6-10之间。
6
10
usernamemustbetween${minLength}and${maxLength}
二,Struts2可以进行客户端的校验.
1,form的(theme)主题一定不能设置为simple。
2,将标签中的form的validate方法设置为true。
3,我们写的RegisterAction-validate.xml既可以作为服务器端的验证又可以做为客户端的验证。
注意:
不建议使用struts2给我们提供的客户端校验。
因为太死板。
《====非字段校验器====》
1,我们使用非字段校验器(validator)和字段校验器(filed)。
2,两者的区别在于:
字段校验时字段优先,(就是我先去校验谁,我用谁来校验)
非字段校验校验器优先(就是我用谁去校验谁)
usernaem
usernameisnull!
!
username
6
10
usernamemustbetween${minLength}and${maxLength}
补充知识:
1,真正存放filed级别的错误的信息是LinkedHashMap.
2,该LinkedHashMap的key是String类型的。
Value是ArrayList类型的。
3,对于Action级别的错误信息实际存放在ArrayList里面的。
《==========拦截器(Interceptor)===========》
1,说明:
在执行一个放法之前给你添加信息。
(它就是一个普通的类,没有什么高级的功能。
)和现在的开发模式aop(面向放面编程)很类似,是spring最核心的知识之一。
我们通过匹配它的url去用interceptor。
它是从webwork中衍生出来的。
会拦截程序中所有的Action方法。
3,角色:
1)目标对象;(拦截谁?
)
2)拦截对象;(拦截器,就是普通的类)
3)代理对象;是系统自动产生出来的。
这是真正去执行的。
综合了目标对象,拦截对象的所有方法。
4,作用:
实际就是拦截我们的Action。
在执行Action之前会执行我们预先处理的代码,再执行我们Action里面相关的方法,在执行完Action之后又会回到我们的拦截器,执行后续的一些操作。
相当于入口和出口,把我们的Action方法包在中间了。
5,拦截器的底层代码。
在项目的TestStruts中.
6,要使用拦截器,我们要实现Interceptor接口。
里面包括destroy(在销毁的时候调用),init(数组初始化的时候调用,只能执行一次,在服务器启动时就能执行。
),intercpt(在真正的执行的时候调用,真正处理拦截的一个方法;只要执行目标方法执行一次该方法就要执行一次。
)方法。
publicStringintercept(ActionInvocationarg0)throwsException{
System.out.println("intercept");
Stringresult=arg0.invoke();//invoke方法的作用:
判断如果还有下一拦截器就调用下一个拦截器。
如果没有就直接跳到execute方法。
returnresult;
}
7,拦截器很像过滤器。
过滤器可以组成过滤器链,拦截器可以组成拦截器栈。
在系统启动时就能执行。
8,我们定义interceptor类后再在Struts.xml中配置。
9,这是在声明拦截器;
//name是我们intercptor的名字,可以随便起,class是我们的interceptor类的名字。
world//这是在给我们的拦截器添加一个元素,并赋值。
并且在拦截器interceptor类中要定义hello的参数。
这是第一种定义时,参数配置和赋值方式。
可以称为默认的赋值。
第二种是在使用时。
引用系统中配置好的拦截器:
(为了告诉我们的interceptor是哪个Action引用它)
/print.jsp
/register2.jsp
welcome//这是第二种参数的配置和赋值方式。
这是在使用它。
可以称为动态的赋值。
如果两处都赋了值,那么最后的值会覆盖掉原来的值。
10,如果你手动的在Action里面添加一个拦截器,而他的默认拦截器就不会起作用。
就像上面定义了一个
这就是在手动的拦截器。
除非你手动的添加默认拦截器。
如下:
※如何实现自己定义拦截器栈?
?
关键的是使用里面的
在我们的Struts.xml里面直接定义就可以了。
world
在我们Action里面的引用
/print.jsp
/register2.jsp
我们用拦截器栈方便了,直接引用拦截器名字,就把它里的拦截器栈和自定义的拦截器一起都引用过来了。
※如何更改我们的默认拦截器?
?
※以下是在我们的Struts.xml中配置的。
※
※
※位置:
在之下。
之上的范围。
※我们之前是实现interceptor接口,里面要求我们必须实现destroyinitintercept方法。
但是我们最常用的是intercept方法,现在想能有什么办法让我们只有intercept方法呢?
?
解决办法:
就是继承AbstractInterceptor.因为它是实现了interceptor的。
只是把其他的两个不常用的方法,都实现下来了,并让他们什么都不做。