Struts2简单介绍4
Struts2的工作原理
客户端向服务器端提交请求,容器初始化HttpServletRequest请求对象。
请求对象被一系列的Servlet过滤器过滤,Struts2中的过滤器有三种。
FilterDispatcher过滤器调用ActionMapper,决定该请求是否需要调用某个Action。
如果请求需要调用某个Action,ActionMapper将通知FilterDispatcher过滤器把请求的对象交给ActionProxy来处理。
ActionProxy通过Configuration Manager 解析框架的配置文件struts.xml,找到需要调用的Action类。
ActionProxy创建一个ActionInvocation实例。
ActionInvocation实例使用命令模式回调Action中的execute()方法,Action调用业务逻辑类完成业务逻辑处理。在调用Action的前后,将调用该Action实际的相关拦截器(Interceptor)。
Action执行完毕,ActionInvocation根据struts.xml中的配置找到相应的返回结果(成为Result)。
自定义拦截器
- 用户请求
购物车 订单 后台管理 onClick(); (所有非login,必须某个操作之后才进行的操作)
第一步:创建拦截器
自定义过滤器继承 AbstractInterceptor public class LoginInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { User user = (User) ServletActionContext.getRequest().getSession() .getAttribute("user"); if (user != null) { // 继续调用下边的过滤器 return invocation.invoke(); } else { return "login"; } } }
第二步:配置过滤器
<!-- 配置登陆拦截的过滤器 --> <interceptors> <interceptor name="loginIntercepter" class="com.example.validate.demo7.LoginInterceptor"> </interceptor> </interceptors>
第三步:配置某些action的拦截效果
<!-- 对需要拦截的action添加过滤器 ,先添加默认的过滤器,再添加自定义过滤器--> <action name="good_*" class="com.example.validate.demo7.GoodAction" method="{1}"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="loginIntercepter"></interceptor-ref> <result name="login"> /login.jsp</result> </action>
设置默认的拦截器
<interceptors> <!-- 配置登陆拦截的过滤器 --> <interceptor name="loginIntercepter" class="com.example.validate.demo7.LoginInterceptor"> </interceptor> <interceptor-stack name="mydefault"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="loginIntercepter"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="mydefault"></default-interceptor-ref>