SSH笔记-自定义拦截器

1、自定义拦截器有两种实现方法:
(1)实现Interceptor接口 ,如:DefineInterceptor2.java
(2)继承 AbstractInterceptor抽象类 ,如:DefineInterceptor1.java

2、实现步骤:
(1)定义拦截器类,实现Interceptor接口 或者继承 AbstractInterceptor抽象类
(2)在struts.xml定义拦截器(在package标签下的interceptors标签里面写interceptor)
(3)在action标签中使用interceptor-ref标签,调用自定义的拦截器

3、注意事项:
(1)在action标签中调用自定义的拦截器的时候,要多调用defaultStack拦截器,不然自定义拦截器类那里就会收不到传入参数的值,导致最后参数会变成null或者model中的初始化值
(2)在自定义拦截器类中,如果不执行invoke()方法,那么后续的拦截器和action方法将不会被调用
(3)调用invoke()方法的返回值可以用到自定义拦截器类的intercept()方法的返回值上

4、struts.xml

<?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.custom.i18n.resources" value="i18n"/>

    <package name="default" namespace="/" extends="struts-default">

        <interceptors>
            <interceptor name="DInterceptor" class="com.demo.sshtest.DefineInterceptor"></interceptor>
            <interceptor name="DInterceptor2" class="com.demo.sshtest.DefineInterceptor2"></interceptor>
        </interceptors>

        <action name="testAction" class="com.demo.sshtest.TestAction">
            <interceptor-ref name="DInterceptor"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <result>/result.jsp?DInterceptor1</result>
        </action>
        <action name="testAction2" class="com.demo.sshtest.TestAction">
            <interceptor-ref name="DInterceptor2"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <result>/result.jsp?DInterceptor2</result>
        </action>
    </package>
</struts>

5、index.jsp 调用页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>submit</title>
</head>
<body>
<!--
1、自定义拦截器有两种实现方法:
    (1)实现Interceptor接口 ,如:DefineInterceptor2.java
    (2)继承 AbstractInterceptor抽象类 ,如:DefineInterceptor1.java
2、实现步骤:
    (1)定义拦截器类,实现Interceptor接口 或者继承 AbstractInterceptor抽象类
    (2)在struts.xml定义拦截器(在package标签下的interceptors标签里面写interceptor)
    (3)在action标签中使用interceptor-ref标签,调用自定义的拦截器
3、注意事项:
    (1)在action标签中调用自定义的拦截器的时候,要多调用defaultStack拦截器,不然自定义拦截器类那里就会收不到传入参数的值,导致最后参数会变成null或者model中的初始化值
    (2)在自定义拦截器类中,如果不执行invoke()方法,那么后续的拦截器和action方法将不会被调用
    (3)调用invoke()方法的返回值可以用到自定义拦截器类的intercept()方法的返回值上
-->
    <s:debug></s:debug>
    <s:form method="POST" action="testAction">
        <s:textfield name="name" label="NAME"></s:textfield>
        <s:submit></s:submit>
    </s:form>

    <s:form method="POST" action="testAction2">
        <s:textfield name="name" label="NAME"></s:textfield>
        <s:submit></s:submit>
    </s:form>

</body>
</html>

页面没什么好说的,写了两个form,用来测试两个通过不同实现方式实现的拦截器。还有,结果页面是result.jsp,是可空白的页面

6、TestAction.java 只是一个model类

package com.demo.sshtest;

import com.opensymphony.xwork2.ActionSupport;

public class TestAction extends ActionSupport{

    private static final long serialVersionUID = 1L;

    public String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String execute() throws Exception {
        System.out.println("name:"+getName());
        return super.execute();
    }
}

7、DefineInterceptor.java 通过继承AbstractInterceptor实现的拦截器类

package com.demo.sshtest;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class DefineInterceptor extends AbstractInterceptor{

    private static final long serialVersionUID = 1L;

    @Override
    public String intercept(ActionInvocation arg0) throws Exception {

        System.out.println("1 invocation.invoke-----start");
        String result = arg0.invoke();
        System.out.println(result);
        System.out.println("1 invocation.invoke-----end");

        return result;
    }


}

8、DefineInterceptor2.java 通过实现Interceptor接口,实现的拦截器类

package com.demo.sshtest;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class DefineInterceptor2 implements Interceptor{

    private static final long serialVersionUID = 1L;

    @Override
    public void destroy() {
        System.out.println("destory");
    }

    @Override
    public void init() {
        System.out.println("init");
    }

    @Override
    public String intercept(ActionInvocation arg0) throws Exception {
        System.out.println("2 invocation.invoke-----start");
        String result = arg0.invoke();
        System.out.println(result);
        System.out.println("2 invocation.invoke-----end");
        return result;
    }

}

实现Interceptor接口的话,需要把init()和destroy()方法也写以下,一个是用来进入自定义拦截器类的时候,初始化你需要初始化的东西,一个是清理用的,比如关闭数据库连接之类的

9、运行效果
运行效果
1的那一段是调用通过继承AbstractInterceptor实现的拦截器
2的那一段是调用通过实现Interceptor接口实现的拦截器

10、项目目录
项目目录

11、demo
https://download.csdn.net/download/qq_22778717/10320991

猜你喜欢

转载自blog.csdn.net/qq_22778717/article/details/79780181
今日推荐