第一讲:
在 server.xml 中配置context 标签,来配置Tomcat。让它知道目录。
配置org.apache.struts2.dispatcher.FilterDispather类,来启动Struts2。
JSP EL表达式 ${requestScope.属性}
Struts.xml 配置文件
<struts>
<package name = "struts2" extends= "struts-default">
<action name = "login" class = "com.test.action.LoginAction">
<result name = "success">/result.jsp</result>
</action>
</package>
</struts>
第二讲 类型转换
Struts2 的标签
导入标签:<@ taglib prefix= "s" uri="/struts-tags">
<s:form action= "login">
<s:textfield name="username" label="username"></s:textfield>
</s:form>
Action类中要继承ActionSuppport类。它提供了一些便利方法。com.opensymphony.xwork2.ActionSupport
执行execute() throws Exception方法。
验证在类中的validate()方法完成。添加错误:addFieldError("username","username required");
注意:应该配置struts.xml文件,<result name ="input">/login2.jsp</result>。在Struts2中当FieldError中有错误信息时候,将请求转发到input指定的页面中。
struts2自定义了一些类型转换器 如 int 转化。一般的逻辑是对用户的输入我们先转化,在验证,如果转化不成功,则不需要验证。
第三讲 类型转化续
ognl.jar表达式语言 转换得用到这个jar 包
WebWork 网站:www.opensymphony.com
1 自定义转换类
我们的转化类可以实现 TypeConverter接口 来实现转换的功能;或者继承DefaultTypeConverter类
例子:继承DefaultTypeConverter重写convertValue(Map context, Object value, Class toType)。当从页面到服务器时,toType表示转换到什么。value是字符串的数组。
value是字符串的数组:因为jsp页面中的标签可以同名。
注:把字符串转化成整数:Interger.parseInt(string);
代码:
converterValue(Map context, Object value, Class toType){
if(Point.class == toType){ //要从页面转化到服务器中的类
Point point = new Point();
String[] str = (String[])value;
String[] paramValues = str[0].split(",");
return point;
}
}
2 配置,让Struts知道存在这个转换
A 当然要定义一个Action了。
B 配置struts.xml,定义返回页面,<s:property value="point"> Action 中的属性值。
C 定义一个属性文件,该属性文件和目标xxAction在同一包下,文件名为xxAction-conversion.properties (这是局部转换)
文件格式: point=com.test.converter.PointConverter //表示对Action中的那个属性进行转换 point对应Action类中的属性
第四讲 类型转换
全局类型转换:
建立一个配置文件,在class目录下。名字固定。xwork-conversion.properties
com.test.bean.Point = com.test.converter.PointConverter 要转换的类 = 用这个类转换
转换者可以继承StrutsTypeConverter 类。
还有一种方法是对象的方式: <s:textfield name="point.x" label = "x">
第五讲 输入校验
当转换不成功,改变struts2页面标签的提示。
在Action中的validate()方法中进行验证。
可以调用addFieldError()方法来添加错误。可以在相应的Jsp中调用<s:fielderror></s:fielderror>来显示错误信息。也可以在<s:fielderror> 中定义子元素,来指定显示那个错误。
注:日期的用法: Calendar c1 = Calendar.getInstance(); c1.setTime(birthday); //birthday 是一个Date 类型的实例。c1.before(c2),//表示c1在c2前面返回true。
第六讲 输入校验续
遇到类型转换错误的时候(也就是说不能进行类型转换),struts2框架自动生成一条错误信息,并且将该错误信息放到addFieldError里面。
1 全局的错误信息提示
在struts2文件中 <constant name = "struts.custom.i18n.resources" value="message"> 替换struts2的默认转换错误的提示信息。
文件为message.propertise。放在classpath目录下。
2 局部的错误信息提示
文件与要验证的Action类在同一目录下。
文件名为Action.properties
资源文件的国际化:你可以用jdk 自带的 native2asvii 工具来转化
在struts2的核心包中有个default.properties 文件,里面定义了一些struts2的默认属性。
样式为:invalid.fieldvalue.age = age conversion error //age 为Action 中的字段
类型转换与输入校验的流程
1 首先Struts2对客户端传来的数据进行类型转换
2 类型转换完成后在进行输入验证
3 如果类型转换和输入验证都没有错误发生,那么进入execute方法(调用业务逻辑)
第七讲 输入校验续
ActionSurport 实现了ValidationAware接口(验证知晓),里面有addFieldError();addActionError(String anErrorMessage)等方法。看来有两个级别的错误消息提示。
ActionError 是用一个Collection来维护的,添加信息一个一个的添加。
FieldError 是用Map来维护的,添加信息需要key和value。
页面上我们用的是Struts的标签库。别的不需要配置。但是标签库只能显示FieldError里面的错误信息。页面却一定返回到错误的页面。
当处理Action级别的错误时,要在页面中添加<s:actionerror/>。
Struts2中的每一个标签都有一个theme属性。当我们不需要时可以theme="simple"。这是Struts2 的验证的提示信息都不会自动显示了。
扩展execute()方法,在struts.xml中指定Action类的方法来完成execute()的功能。这样一个Action可以处理不同的业务逻辑。
方法:在struts2中的struts.xml中,<action name="xxname" class="yyclass" method="zzmethod">则指定了yyclass中的zzmethod来处理。validateZzmethod来验证。
zzmethod和validateZzmethod方法都在yyclass类中我们自己编写,就是方法名字不一样,其他都要和execute和validate方法一样。
还可以通过XML格式的验证。下节课讲解。
第八讲 校验框架(用XML来完成输入校验)
Struts2的校验框架,该框架是基于XML的。针对每个Action提供一个相应的校验配置文件。
对校验配置文件的名字有要求,xxAction-validation.xml(可以参照Struts2下载包中提供的例子来写该文件)
还可以写成xxAction-test-validation.xml,其中test为xxAction类中的一个方法,这表明xxAction-test-validation.xml校验只对test方法生效,即只有执行了test方法,才校验。当两个文件都提供时,struts2先执行xxAction-validation.xml,在执行xxAction-test-validation.xml,两个都要执行。错误信息添加到fielderror里。所以页面要调用fielderror级别的现实
该校验文件支持两种校验格式:
1 field 校验 可以简述为:先定义我要校验谁,在定义怎么校验。
<validators>
<field name="username"> //表示对相应类的对应字段进行验证,本例中对username字段检验。
<field-validator type="requiredstring"> //对该字段的校验方式(可以有多种),本例中表示“必须有”。requiredstring对应了一个类的名字。
<param name="trim">true</param> //对应string的trim()方法,trim对应类中的set方法(set注入)。
<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> //在运行时,会用6、10替换${minLength}和${maxLength}。
</field-validator>
</field>
</validators>
xwork.jar中的com.opensymphony.xwork2.validator.validators包中的每个类。其中有个default.xml文件,配置了校验器对应的名字和相应的java类。
注意:requiredstring 是要求字符串必须有,required 是要求其他类型必须有。expression和fieldexpression是表达式验证。regex是正则表达式验证。
2 validation 校验
第九讲 validation 校验
strust2 支持javascript 客户端验证(这里的form当然只的是Struts2的form)
1 form的主题(theme)一定不能设定为simple。
2 将form的validate属性设置为true
struts2 自动的根据xxAction-validation.xml文件来产生javascript代码,在客户端验证。真正工程中,很少用。
validation 校验 简述为:先定义我用那个校验器来校验,再定义校验那个字段。
<validator type = "requiredstring"> //指定校验器
<param name="fieldName">username</param> //指定校验的字段为username,fieldName不变。
<message>username should not be blank!</message>
</validator>
<validator type = "stringlength"> //指定校验器
<param name="fieldName">username</param> //指定校验的字段为username,fieldName不变。
<param name="minLength">6</param>
<param name="maxLength">10</param>
<message>username should not be blank!</message>
</validator>
第十讲 拦截器
1. 真正存放field级别错误信息的对象是LinkedHashMap
2. 该LinkedHashMap的key是String类型的,value是ArrayList类型的
3. 对于Action级别的错误信息,实际上是放置在ArrayList中的
4 拦截器:Interceptor:在Action之前,之后做些事情,当然可以阻止Action运行。主要是应用Java的动态代理来实现的。
1 拦截谁
2 拦截器 : 就是一个Java类。
3 代理对象
第十一讲 拦截器
1 定义拦截器
在xwork.jar中的com.opensymphony.xwork2.interceptor包中的Interceptor类。
该Interceptor接口中有三个方法:
1 init() 只在服务器初始化时候执行一次,且只执行一次
2 destroy()
3 intercept(ActionInvocation invocation) throws Exception
拦截器可以组成拦截器栈
2 配置拦截器
1 在struts.xml中定义拦截器
<interceptors>
<interceptor name="myInterceptor" class="com.test.intercepor.MyInterceptor">
<para name="">value</para> //为拦截器的相应参数赋值
</interceptor>
</interceptors>
2 在Action中配置拦截器
<action name="">
<result name=""></result>
<interceptor-ref name="myInterceptor">
<para name="">value</para>
</interceptor-ref>
</action>
struts2.core.jar中的struts2-default.xml中定义了struts2的默认拦截器栈。
注意:
1 可以为struts.xml的每个包定义一个默认拦截器栈。
2 当你为某个Action定义了拦截器后,默认拦截器将失效,必须手工添加。
3 可以在定义拦截器时设置参数,也可以在配置拦截器时设置参数
4 一般我们开发中拦截器继承AbstractInterceptor类
5 struts2提供一个方法拦截器,可以指定拦截器将拦截的方法,可以参见MethodFilterInterceptor。
例子如下: 1) class MyInterceptor3 extends MethodFilterInterceptor{
protected String doIntercept(ActionInvocation invocation) throws Exception{}
}
2) 定义MyInterceptor3 拦截器 <interceptor name="" class=""></interceptor>
3)添加拦截器 <interceptor-ref name = "">
<param name="includeMethods">test,execute</param> //拦截器将拦截test,execute方法
</interceptor-ref>
Struts2 框架还提供了监听器。如PreResultListener接口,它提供了Action执行完,返回结果前的那一时刻的监听。