Struts2 (四)拦截器
1.Struts 2 执行流程
1、客户端向Servlet容器(如Tomcat)提交一个请求
2、请求经过一系列过滤器(如ActionContextCleanUp过滤器等)
3、核心控制器被调用,询问ActionMapper来决定请求是否需要调用某个Action
4、如果ActionMapper决定需要调用某个Action,核心控制器把控制权委派给ActionProxy (备注:JSP请求无需调用Action)
5、ActionProxy通过Configuration Manager询问框架的配置文件(struts.xml),找到需调用的Action类
6、ActionProxy创建一个ActionInvocation的实例
7、 ActionInvocation负责调用Action,在此之前会依次调用所有配置的拦截器
8、Action执行完毕,ActionInvocation负责根据结果码字符串在struts.xml的配置中找到对应的返回结果
9、拦截器被再次执行
10、过滤器被再次执行
2.为什么需要拦截器
早期MVC框架将一些通用操作写死在核心控制器中,致使框架灵活性不足、可扩展性降低 Struts 2将核心功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性,有利于系统的解耦
3.MVC和三层的区别
解析:MVC是表示层的三个组件。核心用途: 将请求和展示分离。三层侧重的是架构层面的一个流程组件封装。
4.什么是拦截器
拦截对Action请求的一个类。实现Interceptor接口。继承AbstractInterceptor类Struts 2大多数核心功能是通过拦截器实现的,每个拦截器完成某项功能
拦截器方法在Action执行之前或者之后执行
5.Demo
Action:
import cn.struts.Day09_Interceptor.entity.User; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionContext; import java.util.Map; /** * Created by syd on 2018/2/26. */ public class LoginAction implements Action{ private User user; public String execute() throws Exception { System.out.println("================"); Map<String, Object> session = ActionContext.getContext().getSession(); if (user!=null) { if (user.getUsername().equals("1")&&user.getPassword().equals("1")) { //省略一个步骤,记录session session.put("username",user.getUsername()); return SUCCESS; }else { return LOGIN; } }else { if (session!=null&&session.get("username")!=null) { return "success"; }else { System.out.println("Action中的自定义代码"); return "login"; } } } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
User
public class User { private String username; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } private String password; }
Interceptor
import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; import java.util.Map; /** * * 拦截器 * */ public class MyInterceptor implements Interceptor{ public void destroy() { } public void init() { System.out.println("拦截器已经成功初始化....."); } //方法 public String intercept(ActionInvocation invocation) throws Exception { System.out.println("对象"+invocation); Object action = invocation.getAction(); System.out.println(action+"=========action"); String value; //判定session里面key值对应的value是否存在 Map<String, Object> session = ActionContext.getContext().getSession(); //判断当前session中有没有username这个key Object name = session.get("username"); System.out.println(name+"===========name"); String actionName = invocation.getProxy().getActionName(); invocation.getProxy().getNamespace();//user System.out.println(actionName+"==========actionName"); if (actionName.equals("day09Login")) { //user/login.action value= invocation.invoke(); }else if(name!=null) { //已经登录了 value= invocation.invoke(); String method = invocation.getProxy().getMethod(); System.out.println("方法:"+method); }else{ value="login"; } System.out.println("逻辑视图名"+value); return value; } }
Struts:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!--自定义拦截器--> <constant name="struts.devMode" value="true"/> <package name="day09" namespace="/" extends="struts-default"> <interceptors> <interceptor name="myInter" class="cn.struts.Day09_Interceptor.Interceptor.MyInterceptor"></interceptor> <interceptor-stack name="myStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="myInter"></interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="myStack"></default-interceptor-ref> <action name="day09Login" class="cn.struts.Day09_Interceptor.Action.LoginAction" method="execute"> <result name="success" >/index.jsp</result> <result name="login" >/login.jsp</result> </action> </package> </struts>