JAVA Struts2 DAY05

  1. 拦截器HelloWorld
  2. 扩展拦截器HelloWorld
  3. NetCTOSS登录检查
  4. 上传文件

1 拦截器HelloWorld

1.1 问题

写一个拦截器的HelloWorld程序。

1.2 方案

拦截器的使用步骤

  1. 创建拦截器组件,实现接口Interceptor
  2. 在struts.xml中注册拦截器
  3. 在action的配置中引用拦截器

这里我们复用StrutsDay04项目的修改客户功能,并对打开修改页面的action引用自定义的拦截器。

1.3 步骤

步骤一:创建拦截器

创建包interceptor,在该包下创建拦截器组件FirstInterceptor,并实现接口Interceptor,在拦截方法中调用action业务方法,并且在调用action前后分别输出一些内容,以模拟对action请求的拦截。代码如下:

  1. package interceptor;
  2. import com.opensymphony.xwork2.ActionInvocation;
  3. import com.opensymphony.xwork2.interceptor.Interceptor;
  4. /**
  5. * 第一个拦截器
  6. */
  7. public class FirstInterceptor implements Interceptor {
  8.     @Override
  9.     public void destroy() {
  10.     }
  11.     @Override
  12.     public void init() {
  13.     }
  14.     @Override
  15.     public String intercept(ActionInvocationai) throws Exception {
  16.         System.out.println("FirstInterceptor拦截前...");
  17.         // 执行action业务方法
  18.         ai.invoke();
  19.         System.out.println("FirstInterceptor拦截后...");
  20.         /*
  21.          * 返回值匹配对应的result,但是一旦代码中调用了
  22.          * ai.invoke时,则此返回值无效,Struts2会根据
  23.          * action的返回值匹配result。如果当前代码中没有
  24.          * 调用ai.invoke,则此返回值生效。
  25.          * */
  26.         return "error";
  27.     }
  28. }

步骤二:注册拦截器

在struts.xml中,客户package下注册拦截器组件FirstInterceptor,代码如下:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
  4. "http://struts.apache.org/dtds/struts-2.1.7.dtd">
  5. <struts>
  6.     <!--客户配置信息 -->
  7.     <package name="customer"
  8.         namespace="/customer" extends="struts-default">
  9.         <interceptors>
  10.             <!--注册拦截器 -->
  11.             <interceptor name="first"
  12.                 class="interceptor.FirstInterceptor"/>
  13.         </interceptors>
  14.         
  15.         <!--打开修改页面 -->
  16.         <action name="toUpdateCustomer"
  17.             class="action.ToUpdateCustomerAction">
  18.             <result name="success">
  19.                 /WEB-INF/customer/update_customer.jsp
  20.             </result>
  21.         </action>
  22.     </package>
  23. </struts>

步骤三:引用拦截器

在修改客户action的配置下,引用已注册的拦截器,代码如下:

  1. <?xmlversion="1.0"encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
  4. "http://struts.apache.org/dtds/struts-2.1.7.dtd">
  5. <struts>
  6.     <!--客户配置信息 -->
  7.     <package name="customer"
  8.         namespace="/customer" extends="struts-default">
  9.         <interceptors>
  10.             <!--注册拦截器 -->
  11.             <interceptor name="first"
  12.                 class="interceptor.FirstInterceptor"/>
  13.         </interceptors>
  14.         
  15.         <!--打开修改页面 -->
  16.         <action name="toUpdateCustomer"
  17.             class="action.ToUpdateCustomerAction">
  18.             <!--引用拦截器 -->
  19.             <interceptor-ref name="first"/>
  20.             <result name="success">
  21.                 /WEB-INF/customer/update_customer.jsp
  22.             </result>
  23.         </action>
  24.     </package>
  25. </struts>

步骤四:测试

为了便于观察拦截器与Action的执行顺序,在Action的构造方法及业务方法中,输出一些内容,代码如下:

  1. package action;
  2. importjava.util.List;
  3. importdao.CustomerDAO;
  4. importentity.City;
  5. importentity.Customer;
  6. importentity.Sex;
  7. public class ToUpdateCustomerAction {
  8.     // output
  9.     private Customer customer; // 客户
  10.     private List<Sex> sexes; // 性别
  11.     private List<City> cities; // 城市
  12.     publicToUpdateCustomerAction() {
  13.         System.out.println("实例化ToUpdateCustomerAction...");
  14.     }
  15.     
  16.     public String execute() {
  17.         System.out.println("调用ToUpdateCustomerAction业务方法...");
  18.         
  19.         CustomerDAOdao = new CustomerDAO();
  20.         // 模拟查询客户
  21.         customer = dao.findById();
  22.         // 模拟查询全部的性别
  23.         sexes = dao.findAllSex();
  24.         // 模拟查询全部的城市
  25.         cities = dao.findAllCities();
  26.         return "success";
  27.     }
  28.     public Customer getCustomer() {
  29.         return customer;
  30.     }
  31.     public void setCustomer(Customer customer) {
  32.         this.customer = customer;
  33.     }
  34.     public List<Sex>getSexes() {
  35.         return sexes;
  36.     }
  37.     public void setSexes(List<Sex> sexes) {
  38.         this.sexes = sexes;
  39.     }
  40.     public List<City>getCities() {
  41.         return cities;
  42.     }
  43.     public void setCities(List<City> cities) {
  44.         this.cities = cities;
  45.     }
  46. }

重新部署并重启tomcat,然后重新访问修改客户页面,控制台输出结果如下图:

图-1

从输出结果中可以看出,拦截器是在实例化Action之后,调用业务方法之前开始调用的。

1.4 完整代码

本案例的完整代码如下所示:

FirstInterceptor完整代码

代码

ToUpdateCustomerAction完整代码:

代码

struts.xml完整代码:

代码

2 扩展拦截器HelloWorld

2.1 问题

扩展拦截器HelloWorld示例,练习使用拦截器栈,并观察多个拦截器的执行顺序。

2.2 方案

创建一个新的拦截器,与第一个拦截器打包成栈,然后让修改客户的action引用这个拦截器栈,并观察控制台中这两个拦截器与Action的执行顺序。

2.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:创建一个新的拦截器

创建一个新的拦截器组件SecondInterceptor,代码如下:

  1. package interceptor;
  2. import com.opensymphony.xwork2.ActionInvocation;
  3. import com.opensymphony.xwork2.interceptor.Interceptor;
  4. /**
  5. * 第二个拦截器
  6. */
  7. public class SecondInterceptor implements Interceptor {
  8.     @Override
  9.     public void destroy() {
  10.     }
  11.     @Override
  12.     public void init() {
  13.     }
  14.     @Override
  15.     public String intercept(ActionInvocationai) throws Exception {
  16.         System.out.println("SecondInterceptor拦截前...");
  17.         ai.invoke();
  18.         System.out.println("SecondInterceptor拦截后...");
  19.         return "error";
  20.     }
  21. }

步骤二:注册新拦截器,并打包成栈

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
  4. "http://struts.apache.org/dtds/struts-2.1.7.dtd">
  5. <struts>
  6.     <!--客户配置信息 -->
  7.     <package name="customer"
  8.         namespace="/customer" extends="struts-default">
  9.         <interceptors>
  10.             <!--注册拦截器 -->
  11.             <interceptor name="first"
  12.                 class="interceptor.FirstInterceptor"/>
  13.             <interceptor name="second"
  14.                 class="interceptor.SecondInterceptor"/>    
  15.             <!--注册拦截器栈 -->
  16.             <interceptor-stack name="myStack">
  17.                 <interceptor-ref name="first"/>
  18.                 <interceptor-ref name="second"/>
  19.             </interceptor-stack>
  20.         </interceptors>
  21.         
  22.         <!--打开修改页面 -->
  23.         <action name="toUpdateCustomer"
  24.             class="action.ToUpdateCustomerAction">
  25.             <!--引用拦截器 -->
  26.             <interceptor-ref name="first"/>
  27.             <result name="success">
  28.                 /WEB-INF/customer/update_customer.jsp
  29.             </result>
  30.         </action>
  31.     </package>
  32. </struts>

步骤三:引用拦截器栈

可以在action的配置下引用拦截器,也可以给一个包下所有的action统一设置默认使用的拦截器,代码如下:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
  4. "http://struts.apache.org/dtds/struts-2.1.7.dtd">
  5. <struts>
  6.     <!--客户配置信息 -->
  7.     <package name="customer"
  8.         namespace="/customer" extends="struts-default">
  9.         <interceptors>
  10.             <!--注册拦截器 -->
  11.             <interceptor name="first"
  12.                 class="interceptor.FirstInterceptor"/>
  13.             <interceptor name="second"
  14.                 class="interceptor.SecondInterceptor"/>    
  15.             <!--注册拦截器栈 -->
  16.             <interceptor-stack name="myStack">
  17.                 <interceptor-ref name="first"/>
  18.                 <interceptor-ref name="second"/>
  19.             </interceptor-stack>
  20.         </interceptors>
  21.         <!--设置当前包下所有Action默认引用的拦截器 -->
  22.         <default-interceptor-ref name="myStack"/>
  23.         
  24.         <!--打开修改页面 -->
  25.         <action name="toUpdateCustomer"
  26.             class="action.ToUpdateCustomerAction">
  27.             <!--引用拦截器 -->
  28.             <!--<interceptor-ref name="first"/> -->
  29.             <result name="success">
  30.                 /WEB-INF/customer/update_customer.jsp
  31.             </result>
  32.         </action>
  33.     </package>
  34. </struts>

步骤四:测试

重新部署项目并重启tomcat,重新访问修改客户页面时,控制台输出结果如下图:

图-2

从图中可以看出,多个拦截器拦截Action的顺序满足先进后出的原则,其顺序可以按照下图来理解和记忆:

图-3

Struts2学习三拦截器相关推荐

  1. struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo

    理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...

  2. struts2如何使用拦截器进行用户权限控制

    大多数网站会设置用户权限,如过滤非法用户,用户不登录时不能进行访问,或者设置访问的权限,如部分内容仅对VIP开放等等,这些权限的控制都可以用struts2中的拦截器来实现. 下面通过一个简单的Demo ...

  3. struts2 过滤器和拦截器的区别和使用

    struts2 过滤器和拦截器的区别和使用 java web 过滤器和拦截器的区别和使用  1.1 什么是拦截器:      拦截器,在AOP(Aspect-Oriented Programming) ...

  4. Struts2→拦截器、工作原理、拦截器计算Action执行时间、Struts2自带拦截器、拦截器栈

    工作原理 实现拦截器 样例 Struts2自带拦截器 拦截器栈(先进后出) TOKEN防表单重复提交 文字拦截器 AJAX

  5. Struts2框架之拦截器

    1:拦截器类似web过滤器,在action执行之前或者执行之后去取一些操作 2:拦截器栈就是递归调用 strust2的工作流程: 客户端通过HttpServletRequest向Tomcat容器发送请 ...

  6. struts2控制器及拦截器返回JSON格式数据

    1.     JSON插件 想要使用json必定会用到jquery. 1.1        导入相关的Ajax-jar包-01资料中ajax文件中. commons-beanutils-1.8.0.j ...

  7. Struts2中的拦截器与过滤器学习

    拦截器是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法 ,比如动态代理就是拦截器的简单实现,过滤器是在java web中,你传入的request,res ...

  8. struts2基础----自定义拦截器

    这一章,我们开始struts2中拦截器的学习. 自定义拦截器 一.增加一个自定义的拦截器为类 package com.huhx.interceptor;import com.opensymphony. ...

  9. Struts2自己定义拦截器实例—登陆权限验证

    版本号:struts2.1.6 此实例实现功能:用户须要指定username登陆,登陆成功进入对应页面运行操作,否则返回到登陆页面进行登陆,当直接訪问操作页面(登陆后才干訪问的页面)时则不同意,须返回 ...

最新文章

  1. SDUT2608(Alice and Bob)
  2. 你确定你真的喜欢编程吗??
  3. 使用def导出动态链接库(VC6)
  4. 网络流最大流Edmonds-Karp算法(模板)
  5. linux应用程序调试方法,Linux应用程序使用写文件调试程序的方法
  6. VC2010 MFC文档类菜单快捷键无法加载问题
  7. android编译 预装apk,Android系统使用Shell脚本预装apk
  8. opencv 的norm_OpenCV学习笔记(一)之图像金字塔-上采样与降采样与DOG
  9. 2022年道路运输企业安全生产管理人员考题及答案
  10. 移动音视频的质量和带宽的关系
  11. mysql多表关联数据删除
  12. 设计模式学习--观察者模式(Observer Pattern)
  13. ASEMI线性稳压电源芯片AMS1117-3.3参数及接线电路图
  14. 坐牢后,我被安排去写代码...
  15. UINavigation导航栏和UITabbar布局和样式
  16. Windows Sockets 规范及应用
  17. PHP语言之华为应用内支付IAP验签
  18. L1-070 吃火锅 (15 分)
  19. 隐语v0.8.2版本更新,首次发布TEEU
  20. vue echarts 多个图表 后台数据填充到页面,并自适应

热门文章

  1. CSS实现背景图片详解全屏铺满自适应的方式
  2. 正向代理与反向代理的理解以及区别
  3. 与米老师的谈话之我的总结误区
  4. HDUOJ 2063 过山车
  5. 计算机网络中的分组交换思想
  6. AI开发之——Leonardo—用户工具-AI图形制作(2)
  7. 记一次keep-alive没有生效的排查
  8. 关刀机器人_官方披露:歼-20隐身涂层使用机器人喷涂
  9. 科目三C1考试(新丰驾校)
  10. 云计算,下一个互联网爆点!