1、第三章,Struts2深入,回顾与作业点评,Struts 2中开发一个Action有几种方法?package元素与Java中的包有什么异同之处?Result结果类型有哪些?有什么区别?,本章目标,掌握Struts 2架构 掌握Struts 2拦截器 掌握Struts 2自定义拦截器,Struts 2架构剖析,Struts 2执行流程,1、客户端向Servlet容器(如Tomcat)提交一个请求2、请求经过一系列过滤器(如ActionContextCleanUp过滤器等)3、核心控制器FilterDispatcher被调用,询问ActionMapper是否需要调用某个Action4、如果Acti
2、onMapper决定需要调用某个Action,核心控制器把控制权委派给ActionProxy,Struts 2执行流程,5、ActionProxy询问Configuration Manager(初始化自struts.xml) 6、ActionProxy创建一个ActionInvocation的实例 7、 ActionInvocation负责调用Action,在此之前会依次调用所有配置的拦截器 8、Action return之后,ActionInvocation负责根据结果码字符串构造Result对象 9、Result被执行 10、拦截器执行后置处理 11、过滤器做后置处理,Struts 2核心
3、接口和类,ActionMapper 根据请求的URI查找是否存在对应Action调用 ActionMapping 保存调用Action的映射信息,如namespace、name等 ActionProxy 在XWork和真正的Action之间充当代理 ActionInvocation 表示Action的执行状态,保存拦截器、Action实例 Interceptor 可以在请求处理之前或者之后执行的Struts 2组件 Struts 2绝大多数功能通过拦截器完成,Struts执行流程简图,HttpServletRequest,HttpServletResponse,核心控制器,Intercepte
4、r1,Intercepter2,Intercepter3,Action,Result,为什么需要拦截器,早期MVC框架将一些通用操作写死在核心控制器中,致使框架灵活性不足、可扩展性降低 Struts 2将核心功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性,有利于系统的解耦,什么是拦截器,Struts 2大多数核心功能是通过拦截器实现的,每个拦截器完成某项功能 拦截器方法在Action执行之前或者之后执行拦截器栈 从结构上看,拦截器栈相当于多个拦截器的组合 在功能上看,拦截器栈也是拦截器 拦截器与过滤器原理很相似,为Action提供附加功能时,无需修改 Action代码,使用拦截
5、器来提供,拦截器工作原理,拦截器的执行过程是一个递归的过程,三阶段执行周期: 1、做一些Action执行前的预处理 2、将控制交给后续拦截器或返回结果字符串 3、做一些Action执行后的处理,拦截器工作原理,拦截器示例,public class MyTimerInterceptor extends AbstractInterceptor public String intercept(ActionInvocation invocation) throws Exception /预处理工作long startTime = System.currentTimeMillis();/执行后续拦截器或
6、ActionString result = invocation.invoke();/后续处理工作long execTime = System.currentTimeMillis() - startTime;System.out.println(“The interval time is “+execTime+“ ms“);/返回结果字符串return result; ,Struts 2自带拦截器,Params拦截器 负责将请求参数设置为Action属性 servletConfig拦截器 将源于Servlet API的各种对象注入到ActionfileUpload拦截器 对文件上传提供支持 e
7、xception拦截器 捕获异常,并且将异常映射到用户自定义的错误页面 validation拦截器 调用验证框架进行数据验证 workflow拦截器 调用Action类的validate(),执行编码验证,Struts 2默认拦截器栈,struts-default.xml中定义一个defaultStack拦截器栈,并将其指定为默认拦截器 只要在定义包的过程中继承struts-default包,那么defaultStack将是默认的拦截器,配置拦截器,自定义拦截器4-1,实现Interceptor接口 void init():初始化拦截器所需资源 void destroy():释放在init()
8、中分配的资源 String intercept(ActionInvocation ai) throws Exception 实现拦截器功能 利用ActionInvocation参数获取Action状态 返回结果码(result)字符串继承AbstractInterceptor类 提供了init()和destroy()方法的空实现 只需要实现intercept方法即可 推荐使用,自定义拦截器4-2,开发权限验证拦截器,public class AuthInterceptor extends AbstractInterceptor public String intercept(ActionInv
9、ocation invocation) throws Exception /获取用户会话信息Map session= invocation.getInvocationContext().getSession();User user = (User)session.get(“login“);if (user = null) /终止执行,返回登录页面return Action.LOGIN; else /继续执行剩余的拦截器和Actionreturn invocation.invoke(); ,自定义拦截器4-3,在配置文件中定义拦截器并引用它, ,因为包含在默认拦截器内,所以Action中无需再引用权限拦截器,指导开发权限验证拦截器,训练要点: 编写拦截器类 拦截器配置 需求说明: 开发一个验证拦截器判断用户是否登录 实现思路: 1、编写自定义拦截器,继承自AbstractInterceptor 2、在配置文件中定义拦截器 3、引用拦截器 难点指导: 编写自定义拦截器,讲解需求说明,完成时间:20分钟,总结,Struts 2执行流程是什么?你对Struts 2拦截器的理解有哪些?Struts 2中自定义拦截器有哪些方式?,作业,课后作业 必做 教员备课时在此添加内容选做 教员备课时在此添加内容提交时间:xxx 提交形式:xxx预习作业 教员备课时在此添加内容,