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>
