了解struts2中的拦截器
拦截器
在访问struts2中某个action之后或者之前,会自动调用的类,就是struts2中的拦截器,他具有的最大特点就是实现了AOP(面向切面编程),他是可插拔式的,也就是说它可以在需要使用的时候通过配置xml文件来实现,而在不使用的时候又不会影响整个框架的效果,这让struts2的拦截器具有非常好的扩展性
拦截器栈
Struts2中拦截器栈就是将拦截器按照一定的顺序连接在一起的链,当满足拦截的要求时,则会按照实现声明的顺序依次执行拦截器
DRY规则
即don’t repeat yourself,意思就是不书写重复的代码。因为在早起软件开发阶段,由于缺乏经验等原因,导致系统不同的地方会使用相同的办法,而大部分人的操作即将相同代码不断的“复制”,“粘贴”以完成功能实现,
拦截器的意义
其实拦截器也可以理解为调用方法的一种改进。因为拦截器可以在目标对象执行以前由系统自动执行,而调用方法则必须显示的调用才可以。这就使拦截器本身拥有更高层次的解耦性。
拦截器的实现原理
Struts2底层的拦截器方法都是通过JDK中动态代理的方式调用的,感兴趣的同学可以都去学习一下这方面的知识,这里就不纤细赘述了。
Strut2中的拦截器作用
毫不夸张的说,sturts2本身只是一个空的容器,而是大量的拦截器让struts2拥有非常强大的功能,比如防止表单重复提交,进行输入校验…我们可以打开struts2-core.jar包下的struts-default.xml中看到struts2都实现了哪些拦截器。大家应该也都了解struts-default.xml这个文件是我们写struts.xml时需要继承的xml文件,其中就声明了大量的拦截器和拦截器栈。我们可以找到defaultStack这个拦截器栈,它就是struts2默认加载的拦截器栈,他提供了struts2的基本操作,比如得到参数并将参数赋值给对应的action中的属性……
创建需要的文件 一个实体类 一个action流程 一个interceptor拦截包
实体类简单创建 如下:
public class UserInfo {
private String username;
private String password;
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;
}
}
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.sun.javafx.collections.MappingChange;
import java.util.Map;
/**
* Created by HP on 2017/10/25.
*/
public class LoginAction implements Action {
public UserInfo getUser() {
return user;
}
public void setUser(UserInfo user) {
this.user = user;
}
private UserInfo user;
public String execute() throws Exception {
Map<String, Object> session = ActionContext.getContext().getSession();
if (user != null) {
if (user.getUsername().equals("1") && user.getPassword().equals("1")) {
session.put("uname", user.getUsername());
return SUCCESS;
} else {
return LOGIN;
}
} else {
if (session != null && session.get("uname") != null) {
return "success";
} else {
System.out.println("Action中的自定义代码");
return "login";
}
}
}
}
interceptor 拦截
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import org.omg.PortableInterceptor.Interceptor;
import java.util.Map;
/**
* Created by HP on 2017/10/25.
*/
public class MyInterceptor implements com.opensymphony.xwork2.interceptor.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;
Map<String ,Object>session= ActionContext.getContext().getSession();
Object name=session.get("uname");
String actionName=invocation.getProxy().getActionName();
invocation.getProxy().getNamespace();
System.out.println("actionName="+actionName);
if(actionName.equals("login")){
System.out.println("action 是Login");
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;
}
}
在WEB-INF下创建一个包 创建两个jsp页面 login 和 success
login:
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<h2>登录22222</h2>
<s:form method="POST" action="login">
请输入用户名: <s:textfield name="user.username"></s:textfield> <br/>
<s:textfield name="user.password"></s:textfield><br/>
<s:submit value="登陆"></s:submit>
</s:form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Success</title>
</head>
<body>
<h2>Success</h2>
</body>
</html>
一个主 一个子
子:
<?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"></constant>
<package name="day07" namespace="/" extends="default">
<action name="login" class="cn.happy.day07interceptor.action.LoginAction">
<result name="success">/WEB-INF/myinter/success.jsp</result>
<result name="login">/WEB-INF/myinter/login.jsp</result>
</action>
</package>
</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>
<package name="default" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="myInter" class="cn.happy.day07interceptor.interceptor.MyInterceptor"></interceptor>
<interceptor-stack name="myInter">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="myInter"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myInter"></default-interceptor-ref>
<!--day-02使用-->
<!--<action name="userAction" class="cn.happy.action.UserAction">-->
<!--<result name="success">/success.jsp</result>-->
<!--<result name="input">/login.jsp</result>-->
<!--</action>-->
</package>
<include file="struts-day03.xml"></include>
<include file="struts-day05.xml"></include>
<include file="struts-day07.xml"></include>
</struts>
接下来30分钟内可免登陆直接访问最终页面