Struts2小结
一 Struts2内容简介:
2.struts2的应用
3.拦截器Interceptor的工作原理
4.校验
5.Struts2的执行过程
二 Struts2的应用
1.安装JDK,Tomcat与Eclipse
2.建立web项目:Dynameic Web Project
导入Struts2需要的jar包:struts2-core-2.x.x.jar,xwork-core-2.x.x.jar,ognl-2.6.x.jar,freemarker-2.3.x.jar,commons-fileupload-1.2.1.jar
配置Tomcat服务器:点击window->Preferences->Server->Runtime Environments->add
web项目添加Tomcat:右键项目->Build Path->Configure Build Path->Add Libaray->Server Runtime,选择Tomcat添加
3.web.xml中配置Struts2的核心Filter
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>webTest01</display-name> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> <!-- 添加struts2过滤器 --> <filter> <filter-name>struts2</filter-name> <filter-class> <!-- 添加核心Filter --> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
4.在src里建立struts.xml(必须是这个名字),配置Action类(约定优于配置)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="webTest01" value="true" /> <!-- 所有Action都定义在package下 --> <package name="gusixue" namespace="/" extends="struts-default"> <!-- *为通配符,{1}为取*得值,jsp定位使用.action --> <action name="*_status" class="com.nsu.web.action.UserAction" method="{1}"> <!-- 定义两个逻辑视图和物理资源之间的映射 --> <result name="success">/welcome.jsp</result> <result name="fail">/login.jsp</result> </action> </package> </struts>
三 拦截器Interceptor的工作原理
1.内置拦截器配置:
在struts.xml文件下添加
<interceptors> <interceptor name="拦截器名1" class="拦截器类1"></interceptor> <interceptor name="拦截器名2" class="拦截器类2"></interceptor> ... <interceptor name="拦截器名n" class="拦截器类n"></interceptor> </interceptors> <action name="Action名" class="Action类"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="拦截器1"></interceptor-ref> <interceptor-ref name="拦截器2"></interceptor-ref> </action>
一旦继承了struts-default包(package),所有Action都会默认调用拦截器栈 ---defaultStack。但是当在Action配置中加入“<interceptor-ref name=”..“ />”则会覆盖defaultStack,所以在action中写拦截器引用时,需要显示引用defaultStack(而且最好在第一句)。
2.自定义拦截器:
1)实现方法
- 实现Interceptor接口
- 继承AbstractInterceptor类
- 继承MethodFilterInterceptor类
2)拦截器必须是无状态的,换句话说,在拦截器类中不应该有实例变量。这是因为struts2对每一个Action的请求使用的是同一个拦截器实例来拦截调用,如果拦截器有状态,在多个线程(客户端的每个请求将由服务器端的一个线程来服务)同时访问一个拦截器实例的情况下,拦截器的状态将不可预测。
3.其他:在struts2的工作原理下
四 校验
1.校验:
1)输入校验分为客户端校验和服务器端校验
2)服务器端校验分为:手工校验和配置校验,但是都必须要继承ActionSupport类
3)手工校验:
方式一:重写validate()方法: validate()方法会校验action中所有与execute方法签名相同的方法。
方式二:重写validateXxx()方法:validateXxx()只会校验action中方法名为Xxx的方法。
当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport )
如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。在input视图中可以通过<s:fielderror/>显示失败信息。
4)校验框架:
校验文件和action类放在同一个包下,文件的取名格式为:ActionClassName(struts.xml中的action的name)-validation.xml,其中ActionClassName为action的简单类名,-validation为固定写法
当为某个action提供了ActionClassName-validation.xml和ActionClassName-ActionName-validation.xml两种规则的校验文件时,系统按下面顺序寻找校验文件:
先检查全Action的AconClassName-validation.xml再检查某个方法的ActionClassName-ActionName-validation.xml;如果两个校验文件中指定的校验规则冲突,则只使用后面文件中的校验规则;当 action继承了另一个action,父类action的校验文件会先被搜索到。
2.自定义类型转换:
1)建立一个新类
- 实现ognl.TypeConverter接口
- 继承DefaultTypeConverter类(一般使用这个)
- 继承StrutsTypeConverter类
类中添加转换判断与转换过程
2)特定类型转换器:只有特定的Action才可以使用
注册方法:在Action所在的包中建立properties文件,文件名格式:Action类名-conversion.properties,内容如下:要转换的Action类的属性名=类型转换器全限定名
3)全局类型转换器:所有Action都可以使用
注册方法:在classpath下建立名为xwork-conversion.properties的文件,内容如下:目标类型(全限定名)=类型转换器全限定名
五 Struts的执行过程
- 首先jsp传递参数并发出请求
- 根据请求名在Struts.xml中找到Action
- 在Actin中根据传递出来的名字找到对用的set方法,检查是否有有自定义类型转换
- 从配置文件中找到要转换的属性极其转换类
- 进入转换类判断转换方向,将字符串转换为给定类类型
- 如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息添加到fieldErrors里。不管类型转换是否出现异常,都会进入下一步
- 系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。再调用action中的validate()方法。(此为输入校验)
- 如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。