zoukankan      html  css  js  c++  java
  • Struts的拦截器

    Struts的拦截器

    1.什么是拦截器

    Struts的拦截器和Servlet过滤器类似,在执行Action的execute方法之前,Struts会首先执行Struts.xml中引用的拦截器,在执行完所有引用拦截器的intercept方法后,才会执行Action的execute方法.

    • 1.在struts中,把每一个功能都用一个个的拦截器实现;用户想用struts的哪个功能的时候,可以自由组装使用
    • 2.在Struts中,为了方法用户对拦截器的引用,提供了拦截栈的定义,里面可以包含多个拦截器。拦截栈就像一个文件夹,这个文件夹里面有很多的拦截器
    • 3.在Struts中,如果用户没有指定执行哪些拦截器,Struts有一个默认执行的defaultStack,一旦如果用户有指定执行哪些拦截器,默认的拦截器栈就不会被执行

    拦截器的设计,就是基于组件设计的应用!

    2.拦截器的配置举例

    struts-default.xml文件中,定义了Struts提供的所有拦截器!

    <!--拦截器的配置-->
        <!--一、拦截器的配置,用<interceptors>标签括起来-->
        <interceptors>
            <!--1.一个拦截器,有name和调用的类class的引用-->
            <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
    
            <!--2.拦截栈,定义一个拦截栈的名字,然后用<interceptor-stack>标签包裹栈里的拦截器-->
            <interceptor-stack name="basicStack">
                <interceptor-ref name="exception"/>
            </interceptor-stack>
    
        </interceptors>
        <!--二、设置默认执行的拦截器栈-->
        <default-interceptor-ref name="defaultStack"/>
    

    3.拦截器开发的api

    Struts2中拦截器继承com.opensymphony.xwork2.interceptor.Interceptor的Interceptor拦截器接口,如果要开发拦截器,需要实现这个接口,一般用户可以继承AbstractInterceptor 拦截器默认实现的抽象类

    拦截器中一定要实现三个方法:
    void init(); 启动时执行
    String intercept(ActionInvocation invocation)throws Exception; :拦截业务处理方法,在action之前执行
    void destory(); :销毁方法

    4.自定义一个拦截器案例:

    步骤:
    1.实现接口Interceptor的方法

    package inter;
    
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.Interceptor;
    
    /**
     * 自定义拦截器
     */
    public class HelloInterceptor implements Interceptor{
        //构造器启动时候就执行了
        public HelloInterceptor() {
            System.out.println("创建了拦截器对象");
        }
    
    
        //初始化方法,服务器启动时候执行
        public void init() {
            System.out.println("执行了拦截器的初始化方法");
        }
    
        //拦截器处理方法,先创建Action实例,拦截器再进行业务处理,然后执行action的方法,再返回到拦截器中
        public String intercept(ActionInvocation invocation) throws Exception {
            System.out.println("2.拦截器,业务处理开始");
            //调用下一个拦截器或执行Action,相当与过滤器的chain.doFilter()
            //获取execute方法的返回值
            String resultFlag = invocation.invoke();
    
            System.out.println("4.拦截器,业务处理-结束"+resultFlag);
            return resultFlag;
        }
    
        //服务器关闭时执行
        public void destroy() {
            System.out.println("拦截器销毁");
        }
    
    }
    
    

    2.通过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="helloInterceptor" extends="struts-default" namespace="/">
            <!--拦截器配置-->
            <interceptors>
                <!--配置用户自定义的拦截器-->
                <interceptor name="hello" class="inter.HelloInterceptor"/>
    
                <!--自定义一个栈:要引用默认栈,自定义的拦截器-->
                <interceptor-stack name="helloStack" >
                    <!-- 引用默认栈 (一定要放到第一行)-->
                    <interceptor-ref name="defaultStack"/>
                    <!-- 引用自定义拦截器 -->
                    <interceptor-ref name="hello"/>
                </interceptor-stack>
            </interceptors>
    
            <!--执行拦截器-->
            <default-interceptor-ref name="helloStack"/>
    
    
            <!--Action配置-->
            <action name="hello" class="inter.HelloAction">
                <result name="success">/index.jsp</result>
            </action>
    
        </package>
    
    </struts>
    

    配合使用的action处理类:

    package inter;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    /**
     * 测试自定义拦截器的action
     */
    public class HelloAction extends ActionSupport {
        public HelloAction() {
            System.out.println("1.Action实例创建了");
        }
    
        @Override
        public String execute() throws Exception {
            System.out.println("3.执行了请求处理的方法:execute");
            return super.execute();
        }
    }
    
    

    注意:过滤器执行的顺序
    1.在服务器启动时,创建过滤器和初始化inti()过滤器
    2.拦截器的处理方法开始工作
    3.拦截器遇到String resultFlag = invocation.invoke();时放行,执行action类,并接收action的返回结果
    4.继续执行拦截器的处理方法
    5.关闭服务器,销毁拦截器

    5.拦截器执行时序图

    启动:
    创建所有拦截器,执行init()
    用户访问:
    先创建Action
    再执行拦截器
    最后,拦截器放行,执行execute()

    6.拦截器的一个使用案例

    Struts已经内建了一些拦截器,这里根据上面所学,并根据拦截器的执行顺序和功能,举一个案例:
    Struts的执行流程图
    请求-->过滤器(web.xml)-->拦截器(Struts)-->Action
    1.jsp实现下载超链接
    2.action中提供下载方法
    3.如何在执行下载方法之前判断用户是否已经登录

    此案例中就可以在过滤器或者拦截器中实现用户的登录判断

    7.Struts的国际化

    Struts的国际化与Servlet中国际化的区别:
    Servlet中国际化的使用方法:
    1.写资源文件

    基础名.properties【默认的语言环境配置】
    基础名_语言简称_国家简称.properties

    2.读取资源文件,再使用

    程序:ResocrceBundle
    jsp:jstl提提供的格式化与国家化标签库

    Struts中的国际化使用方法
    1.写资源文件(同servlet)
    2.读取资源文件

    程序:ResourceBundle(同servlet)
    jsp:jstl标签(同servlet),或struts标签获取资源文件内容

    区别:
    Struts2加载资源文件更加简单,通过常量加载即可,在jsp页面直接使用!

    Struts国际化的使用案例:
    1.写资源文件
    msg.properties[默认的语言环境,找不到配置就找他]
    msg_en_US.properties【英文资源文件】

    pwd=密码
    submit=提交
    title=标题
    username=用户名
    

    2.配置,在struts.xml中使用常量配置

        <!--通过常量加载资源文件-->
        <!--常量是固定的,value是资源包,同一个包下基础名就可以了,可以加载多个资源包,用逗号隔开-->
        <constant name="struts.custom.i18n.resources" value="msg"/>
    

    上面是在xml配置文件中加载,也可以在jsp页面中在中通过下面的加载方式加载,但是不推荐,原因是放在jsp中加载,jsp页面加载东西过重

    <s:i18n name="cn.itcast.config.msg">
    			<s:text>  标签必须放到标签体中。
    </s:i18n>
    

    3.使用Struts标签来引用配置文件中的key
    使用标签之前要看引用struts-tags,如下:
    <%@taglib prefix="s" uri="/struts-tags" %>
    然后通过<s:text>标签来加载资源文件

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@taglib prefix="s" uri="/struts-tags" %>
    <html>
    <head>
        <title><s:text name="title"/></title>
    </head>
    <body>
    <form method="post" action="${pageContext.request.contextPath}/user_login">
        <s:text name="username"/>:<input type="text" name="">
        <s:text name="pwd"/>:<input type="text" name="">
        <input type="submit" value="<s:text name="submit"/>">
    </form>
    </body>
    </html>
    
    
  • 相关阅读:
    自动化遍历-appcrawler
    Android adb实现原理
    win安装appium
    appium_android-常见的问题
    IOS项目目录结构
    svn命令的使用
    什么时候需要将析构函数定义为虚函数,如果不这么做,会存在什么问题?
    关于C++的疑问剖析
    Apple-Watch开发2 APPIcon设置
    Apple-Watch开发1
  • 原文地址:https://www.cnblogs.com/cenyu/p/6221274.html
Copyright © 2011-2022 走看看