Struts2 拦截器学习

了解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;
        }

        }


action  及其引用

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>


success:

<%@ 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分钟内可免登陆直接访问最终页面









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值