(3)Struts2-拦截器和数据校验

拦截器和数据校验

-了解拦截器的执行过程
-熟练掌握拦截器在项目中的应用
-了解Struts的验证机制

拦截器
    例如:表单数据填充到Action的属性中;
                模型驱动自动转换对象
                类型转换器获取到数据转化并传递给Action
Struts就是通过拦截器实现大部分框架的核心操作。

什么是拦截器?
    拦截器用于方法执行的前后插入代码是Struts框架的重要组成部分。

拦截器的执行过程:

 
拦截器的特点:
    基于AOP的设计思想
    提高程序的松耦合性
    提高系统扩展性
    剥离程序的逻辑块,结构更清晰。


Struts的拦截器分为
    內建拦截器(Struts框架已经写好的拦截器,如表单数据的传递等)
    自定义拦截器(由开发者自己编写的拦截器)



拦截器的实现
    (1) 编写拦截器类,实现Interceptor或者继承AbstractInterceptor类
    (2)重写intercept方法
    (3)在struts.xml配置<interceptor>    
    
    
  1. public class MyInterceptor implements Interceptor{
  2. public void destroy() {
  3. // TODO Auto-generated method stub
  4. System.out.println("拦截器被销毁");
  5. }
  6. public void init() {
  7. // TODO Auto-generated method stub
  8. System.out.println("拦截器被初始化");
  9. }
  10. /**
  11. * 拦截处理
  12. */
  13. public String intercept(ActionInvocation invocation) throws Exception {
  14. System.out.println("进行了拦截处理");
  15. String value = invocation.invoke();
  16. System.out.println("拦截处理完毕");
  17. return value;
  18. }
  19. }
     
     
  1. <package name="niit" extends="struts-default">
  2. <!-- 配置拦截器 -->
  3. <interceptors>
  4. <interceptor name="myInterceptor" class="com.niit.interceptor.MyInterceptor"></interceptor>
  5. <interceptor name="myInterceptor2" class="com.niit.interceptor.MyInterceptor2"></interceptor>
  6. <!-- 配置拦截器栈,将多个拦截器作为整体一起作用 -->
  7. <interceptor-stack name="myStack">
  8. <interceptor-ref name="myInterceptor2"></interceptor-ref>
  9. <interceptor-ref name="myInterceptor"></interceptor-ref>
  10. </interceptor-stack>
  11. </interceptors>
  12. <global-results>
  13. <result name="success">WEB-INF/success.jsp</result>
  14. </global-results>
  15. <action name="login" class="com.niit.action.LoginAction">
  16. <!-- 当作用自定义拦截器时,必须要手动作用系统拦截器 -->
  17. <interceptor-ref name="defaultStack"></interceptor-ref>
  18. <!-- 作用拦截器
  19. <interceptor-ref name="myInterceptor2"></interceptor-ref>
  20. <interceptor-ref name="myInterceptor"></interceptor-ref>
  21. -->
  22. <interceptor-ref name="myStack"></interceptor-ref>
  23. <result name="input">WEB-INF/error.jsp</result>
  24. <result name="success">login.jsp</result>
  25. <result name="login">tag.jsp</result>
  26. </action>
  27. </package>
注意点:
       自定义拦截器一定要手动作用系统拦截器,否则就会连数据的传递都传递不了,类型无法自动转换等等。
defaultStack是struts定义的拦截器栈         
      
      
  1. <!-- 当作用自定义拦截器时,必须要手动作用系统拦截器 -->
  2. <interceptor-ref name="defaultStack"></interceptor-ref>
        Action可以作用多个拦截器
        拦截器的配置顺序决定了调用顺序

拦截器栈:就是一组拦截器,形成了逻辑上的拦截器整体。
拦截器栈的使用和拦截器的使用类似:
       
       
  1. <!-- 配置拦截器 -->
  2. <interceptors>
  3. <interceptor name="myInterceptor" class="com.niit.interceptor.MyInterceptor"></interceptor>
  4. <interceptor name="myInterceptor2" class="com.niit.interceptor.MyInterceptor2"></interceptor>
  5. <!-- 配置拦截器栈,将多个拦截器作为整体一起作用 -->
  6. <interceptor-stack name="myStack">
  7. <interceptor-ref name="myInterceptor2"></interceptor-ref>
  8. <interceptor-ref name="myInterceptor"></interceptor-ref>
  9. </interceptor-stack>
  10. </interceptors>


   
Interceptor的生命周期
    (1)项目加载时构建Inteceptor实例
    (2)请求相应Action时进行拦截
    (3)拦截处理完毕等待下一次请求
    (4)程序卸载Inteceptor销毁


拦截器的属性使用(没用过)
        拦截器中编写属性并提供setter和getter方法
      配置文件中加入param属性
 
 





数据校验
    数据校验是所有web应用都应该处理的事情。
校验方式分为:
    客户端校验:通过客户端脚本实现,缓解服务器压力。
    服务器校验:数据有效性的校验


Struts服务端的校验的方式:
        使用Action校验(主要)
        使用验证框校验


(1)Action校验
            继承ActionSupport类
            配置input-result
            重写validate方法
            使用addFieldError添加错误信息
            使用<s:fieldError>呈现错误信息
      
      
  1. <action name="login" class="com.niit.action.LoginAction">
  2. <!-- 当作用自定义拦截器时,必须要手动作用系统拦截器 -->
  3. <interceptor-ref name="defaultStack"></interceptor-ref>
  4. <interceptor-ref name="myStack"></interceptor-ref>
  5. <result name="input">WEB-INF/error.jsp</result>
  6. <result name="success">login.jsp</result>
  7. <result name="login">tag.jsp</result>
  8. </action>
      
      
  1.   @Override
  2. public void validate() {
  3. System.out.println("调用了验证方法");
  4. System.out.println(userName);
  5. //一旦验证方法中添加了FieldError,则框架会根据input-result找到对应的视图进行返回,从而跳过Action的执行
  6. addFieldError("error", "validate error!");
  7. }
       
       
  1. <s:fielderror name="error"></s:fielderror>


Action校验的流程

一旦验证方法添加了FieldError,则框架或根据input-result找到对应的视图进行返回,从而跳过Action的执行。
验证方法在拦截器前执行。






    



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值