• 1. 第二章struts2拦截器
  • 2. 预习检查为什么需要拦截器? 拦截器是什么? 怎样开发拦截器? 2011-05-092
  • 3. 本章任务Struts2拦截器的意义和优势? 拦截器和AOP的关系 配置拦截器 开发拦截器 拦截结果的监听器 拦截器的执行过程 struts2内建拦截器 总结2011-05-093
  • 4. 理解拦截器理解DRY规则代码段1代码段2代码段3相同的 代码段相同的 代码段相同的 代码段重复的代码2011-05-094
  • 5. 理解拦截器通过方法调用实现系统功能 JNDI文本JTA代码段1代码段2代码段3调用方法调用方法调用方法相同的代码段2011-05-095
  • 6. 理解拦截器通过拦截器机制自动调用方法 代码段1代码段2代码段3通过拦截器 自动调用方法相同的代码段通过拦截器 自动调用方法通过拦截器 自动调用方法2011-05-096
  • 7. 拦截器的实现原理 拦截器和AOP的关系 目标对象:包含被拦截方法的原始对象 被插入的处理方法:拦截方法之前后的自动执行方法 代理对象:以目标对象为蓝本,由系统创建的新对象 A O P 代 理 的 方 法拦截器方法一目标对象的原有方法拦截器方法二2011-05-097
  • 8. 拦截器在Struts2中的作用FilterDispatcherActionProxy类型转换拦截器文件上传拦截器等ActionResult初始化并调用execute方法拦截并处理用户请求, 然后到Action的execute 方法处理用户请求返回逻辑视图, 系统负责将逻辑视图 对应的资源显示给用户2011-05-098
  • 9. 拦截器配置配置拦截器 参数值 2011-05-099
  • 10. 拦截器配置使用多个拦截器 参数值一 参数值二 2011-05-0910
  • 11. 拦截器配置使用拦截器 简单拦截器 /error.jsp /welcome.jsp 改名后的拦截器 加入自己的拦截器后,一定要把系统的拦截器栈也配置到Action中。2011-05-0911
  • 12. Struts2内建拦截器Struts2内建拦截器的简单介绍 alias:实现在不同请求中相似参数别名的转换 autowiring:自动装配拦截,整合Spring使用 chain:构建action链,使当前action访问前一个action属性。 conversionError:负责处理类型转换错误。 createSession:负责创建一个httpsession对象 debugging:使用struts2的开发模式,提供调试信息 execAndWait:后台执行Action,将等待页面发送给用户 exception:处理异常的拦截器 fileUpload:文件上传,解析表单中文件域的内容 i18n:国际化拦截器,解析表单中文件域的内容 logger:负责日志记录的拦截器 ……2011-05-0912
  • 13. login.actionpublic String login() { UserDTO dto = dao.login(userName, password); if(dto != null){ session.put("user", dto); return "success"; }else{ return “input"; } }将用户存入到session中。2011-05-0913
  • 14. 拦截器完成权限控制实现权限控制拦截器public class AuthorityInterceptor extends AbstractInterceptor{ public String intercept(ActionInvocation invocation) throws Exception{ ActionContext ctx = invocation.getInvocationContext(); Map session = ctx.getSession(); if (session.get("user") != null) { return invocation.invoke(); } ctx.put("tip" , "您还没有登陆,请输入scott,tiger登陆系统"); return Action.LOGIN; } }2011-05-0914
  • 15. 配置权限控制拦截器 /login.jsp /WEB-INF/jsp/viewBook.jsp 如果直接在action中引用你自定义的拦截器,就会发现只调用了你自己的拦截器,没有调用Struts2中内置的拦截器 。 {1}.jsp book_list.action 2011-05-0915
  • 16. 功能更加强大的权限拦截器角色能够动态添加(不是只用管理员,用户,各个角色那么简单)? 每个页面做权限判断? 有没有项目的权限是在功能全部完成之后统一完成的? 2011-05-0916
  • 17. 功能比较强大的权限拦截器用户表user uid name address 1 Zhangsan wuhan 2 Lisi hannan 3 Wangwu beijing角色表role rid name 部门经理 研发工程师 市场权限表auth aid name action 1 添加图书 book_add 2 查询图书 book_list 3 添加用户 user_add用户角色表user_role Id uid rid 1 1 1 2 1 2 3 2 3角色权限表role_auth Id rid aid 1 1 1 2 1 2 3 2 12011-05-0917
  • 18. 权限拦截器浏览者book_add.action是否已经登陆, Session中有bean表示已经登陆是否有访问权限,没有就回退,有就继续向前。将UserBean放到session中将某个用户所有的权限查询出来: select distinct a.action from user_role ur inner join role_auth ra on ur.rid=ra.rid inner join auth a on a.aid=ra.aid 保存到session中;没有登陆登陆2011-05-0918
  • 19. login.actionpublic String login() { UserDTO dto = new UserDTO(); dto.setUserName("lisi"); session.put("user", dto); List list = new ArrayList(); list.add("boke_add"); list.add("boke_list"); session.put("rights", list); return "success"; }将权限存入list中。2011-05-0919
  • 20. 拦截器管理AuthorityInterceptorpublic String intercept(ActionInvocation invocation) throws Exception { ActionContext ctx = invocation.getInvocationContext(); Map session = ctx.getSession(); UserDTO user = (UserDTO)session.get("user"); List list = (List)session.get("rights"); if (user == null || list == null) { ctx.put("tip" , "您还没有登陆,请输入scott,tiger登陆系统"); return Action.LOGIN; } if(!list.contains(ctx.getName())){ ctx.put("tip" , "您没有当前操作的权限"); return Action.LOGIN; } return invocation.invoke(); }获取当前请求的名字: 如请求为:boke_list.action ctx.getName()为boke_list2011-05-0920
  • 21. 拦截器配置 boke/list.action login.jsp {1}.jsp 2011-05-0921
  • 22. 更加实用的设计权限表auth aid name action parent_aid show_order 图书管理 0 1 添加图书 book_add 1 2 查询图书 book_list 1 3 用户管理 0 4 添加用户 user_add 3 5用户表user uid name address 1 Zhangsan wuhan 2 Lisi hannan 3 Wangwu beijing角色表role rid name 部门经理 研发工程师 市场用户角色表user_role Id uid rid 1 1 1 2 1 2 3 2 3角色权限表role_auth Id rid aid 1 1 1 2 1 2 3 2 1可以根据权限表的设计,自动生成菜单2011-05-0922
  • 23. 更加实用的设计添加图书book_add2HashMapkeyvalueList查询图书添加图书修改图书图书管理添加用户查询用户用户管理Class Auth{ int id; String name; String actionName; String order; }List list1 = new ArrayList(); list1.add(new Auth(“查询图书”,”book_list”)); list1.add(new Auth(“添加图书”,”book_add”));Map map = new HashMap(); Map.put(“图书管理”, list1); Map.put(“用户管理”, list2);session.put(“auths”, map);2011-05-0923
  • 24. Struts2标签生成2011-05-0924
  • 25. 拦截器管理AuthorityInterceptorString actionName = arg0.getInvocationContext().getName(); Map auths = (Map)obj; Set keySet = auths.keySet(); for(String key : keySet){ List list = auths.get(key); for(AuthDTO dto : list){ if(actionName.equalsIgnoreCase( dto.getAuthAction())){ return arg0.invoke(); } } }2011-05-0925
  • 26. SiteMesh简介页面页面页面页面页面页面页面页面风格迥异2011-05-0926
  • 27. SiteMesh处理流程JTA公司主页原始公司主页公司主页原始产品介绍页JNDI文本装饰器页面公司 banner导 航内容版权信息JNDI文本装饰后产品介绍页公司 banner导 航内容版权信息JNDI文本装饰后的公司主页公司 banner导 航内容版权信息2011-05-0927
  • 28. SiteMesh准备工作1.导入SiteMesh库和struts2插件(jar包)2.添加核心配置文件web.xml3.配置decorators.xml3个filter和顺序Struts2自带的sitemesh-2.3的包和struts2-sitemesh-plugin配合有问题,换成sitemesh-2.4.1的包就可以了。2011-05-0928
  • 29. web.xml struts-cleanup /* sitemesh /* struts /* struts-cleanup org.apache.struts2.dispatcher.ActionContextCleanUp sitemesh org.apache.struts2.sitemesh.FreeMarkerPageFilter struts org.apache.struts2.dispatcher.FilterDispatcher 2011-05-0929
  • 30. 基本配置 /login.jsp /* /admin/*   <%@ page language="java" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <%@ taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %> <%@ taglib uri="http://www.opensymphony.com/sitemesh/page" prefix="page"%> <decorator:title default="Mysterious page..." /> 2011-05-0930
  • 31. 本章总结struts2拦截器机制 拦截器的作用和意义 如何开发自定义的拦截器 Struts2的内建拦截器2011-05-0931