拦截器和数据校验
-了解拦截器的执行过程
-熟练掌握拦截器在项目中的应用
-了解Struts的验证机制
拦截器
例如:表单数据填充到Action的属性中;
模型驱动自动转换对象
类型转换器获取到数据转化并传递给Action
Struts就是通过拦截器实现大部分框架的核心操作。
什么是拦截器?
拦截器用于方法执行的前后插入代码是Struts框架的重要组成部分。
拦截器的执行过程:
拦截器的特点:
基于AOP的设计思想
提高程序的松耦合性
提高系统扩展性
剥离程序的逻辑块,结构更清晰。
Struts的拦截器分为
內建拦截器(Struts框架已经写好的拦截器,如表单数据的传递等)
自定义拦截器(由开发者自己编写的拦截器)
拦截器的实现
(1) 编写拦截器类,实现Interceptor或者继承AbstractInterceptor类
(2)重写intercept方法
(3)在struts.xml配置<interceptor>
public class MyInterceptor implements Interceptor{
public void destroy() {
// TODO Auto-generated method stub
System.out.println("拦截器被销毁");
}
- public void init() {
// TODO Auto-generated method stub
System.out.println("拦截器被初始化");
}
/**
* 拦截处理
*/
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("进行了拦截处理");
String value = invocation.invoke();
System.out.println("拦截处理完毕");
return value;
}
}
<package name="niit" extends="struts-default">
<!-- 配置拦截器 -->
<interceptors>
<interceptor name="myInterceptor" class="com.niit.interceptor.MyInterceptor"></interceptor>
<interceptor name="myInterceptor2" class="com.niit.interceptor.MyInterceptor2"></interceptor>
<!-- 配置拦截器栈,将多个拦截器作为整体一起作用 -->
<interceptor-stack name="myStack">
<interceptor-ref name="myInterceptor2"></interceptor-ref>
<interceptor-ref name="myInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<global-results>
<result name="success">WEB-INF/success.jsp</result>
</global-results>
<action name="login" class="com.niit.action.LoginAction">
<!-- 当作用自定义拦截器时,必须要手动作用系统拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 作用拦截器
<interceptor-ref name="myInterceptor2"></interceptor-ref>
<interceptor-ref name="myInterceptor"></interceptor-ref>
-->
<interceptor-ref name="myStack"></interceptor-ref>
<result name="input">WEB-INF/error.jsp</result>
<result name="success">login.jsp</result>
<result name="login">tag.jsp</result>
</action>
</package>
注意点:
自定义拦截器一定要手动作用系统拦截器,否则就会连数据的传递都传递不了,类型无法自动转换等等。
defaultStack是struts定义的拦截器栈
<!-- 当作用自定义拦截器时,必须要手动作用系统拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
Action可以作用多个拦截器
拦截器的配置顺序决定了调用顺序
拦截器栈:就是一组拦截器,形成了逻辑上的拦截器整体。
拦截器栈的使用和拦截器的使用类似:
<!-- 配置拦截器 -->
<interceptors>
<interceptor name="myInterceptor" class="com.niit.interceptor.MyInterceptor"></interceptor>
<interceptor name="myInterceptor2" class="com.niit.interceptor.MyInterceptor2"></interceptor>
<!-- 配置拦截器栈,将多个拦截器作为整体一起作用 -->
<interceptor-stack name="myStack">
<interceptor-ref name="myInterceptor2"></interceptor-ref>
<interceptor-ref name="myInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
(1)项目加载时构建Inteceptor实例
(2)请求相应Action时进行拦截
(3)拦截处理完毕等待下一次请求
(4)程序卸载Inteceptor销毁
拦截器的属性使用(没用过)
拦截器中编写属性并提供setter和getter方法
配置文件中加入param属性
数据校验
数据校验是所有web应用都应该处理的事情。
校验方式分为:
客户端校验:通过客户端脚本实现,缓解服务器压力。
服务器校验:数据有效性的校验
Struts服务端的校验的方式:
使用Action校验(主要)
使用验证框校验
(1)Action校验
继承ActionSupport类
配置input-result
重写validate方法
使用addFieldError添加错误信息
使用<s:fieldError>呈现错误信息
<action name="login" class="com.niit.action.LoginAction">
<!-- 当作用自定义拦截器时,必须要手动作用系统拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="myStack"></interceptor-ref>
<result name="input">WEB-INF/error.jsp</result>
<result name="success">login.jsp</result>
<result name="login">tag.jsp</result>
</action>
@Override
public void validate() {
System.out.println("调用了验证方法");
System.out.println(userName);
//一旦验证方法中添加了FieldError,则框架会根据input-result找到对应的视图进行返回,从而跳过Action的执行
addFieldError("error", "validate error!");
}
<s:fielderror name="error"></s:fielderror>
Action校验的流程
一旦验证方法添加了FieldError,则框架或根据input-result找到对应的视图进行返回,从而跳过Action的执行。
验证方法在拦截器前执行。