SSH开发模式——Struts2(第二小节)

上一小节已经学会了如何去搭建Struts2的开发环境,该篇博客我们继续深入Struts2,了解Struts2框架的拦截器。

首先对我们在web.xml文件配置的过滤器进行一个源码的分析。
在StrutsPrepareAndExecuteFilter源码中,有一个init()方法,它调用方法获得了一个Dispatcher对象,这就是我们要分析的关键了。进入到它的源码,在其init()方法中调用了init_TraditionalXmlConfigurations()方法,该方法的源码如下:

    private void init_TraditionalXmlConfigurations() {
        String configPaths = initParams.get("config");
        if (configPaths == null) {
            configPaths = DEFAULT_CONFIGURATION_PATHS;
        }
        String[] files = configPaths.split("\\s*[,]\\s*");
        for (String file : files) {
            if (file.endsWith(".xml")) {
                if ("xwork.xml".equals(file)) {
                    configurationManager.addContainerProvider(createXmlConfigurationProvider(file, false));
                } else {
                    configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, false, servletContext));
                }
            } else {
                throw new IllegalArgumentException("Invalid configuration file name");
            }
        }
    }

注意了,在这个方法里有这样一句代码,configPaths = DEFAULT_CONFIGURATION_PATHS;,关键就是这个字段,我们继续跟进。

    private static final String DEFAULT_CONFIGURATION_PATHS = "struts-default.xml,struts-plugin.xml,struts.xml";

看到这里你总该明白了吧,为什么新建的struts2的配置文件名字必须为struts.xml?为什么struts2的配置文件中package标签要继承struts-default?相信应该不用我解释了。

其实,过滤器的作用有很多,之前也有介绍,但是,如果把所有的任务都交给过滤器处理,那过滤器的负担将会非常重,过滤器的代码会非常多,也不符合我们低耦合,高内聚的设计思想。

我们假设要实现一个功能,在一个类中将该功能分为几个步骤。

class aa{
    第一步:
    第二步:
    第三步:
    第四步:
}

但是我们现在这样设计实现。

class a1{
    第一步:
}
class a2{
    第二步:
}
class a3{
    第三步:
}
class a4{
    第四步:
}

每个类只实现一步,然后直接调用四个类的方法即可。
这样有什么好处呢?这样四个步骤都不会相互影响,想单独调用某个步骤你可以很容易地实现。这就是分离关注的思想。把要处理的问题,分别用一个类来完成,每个类只完成一个功能。这样的一个类就叫 拦截器
那拦截器和过滤器有什么区别呢?
相同点:都是起拦截作用的。
不同点:过滤器是J2EE的标准,任何的一个程序都可以使用。
??????????????拦截器是struts2框架的标准,不能离开struts2框架,必须依赖struts2框架使用。
??????????????过滤器拦截的是web.xml配置文件,其它的拦截工作都交给了拦截器。
??????????????执行顺序为过滤器先执行,拦截器后执行。

在struts-default.xml文件中,定义了很多的拦截器。

<!--
    interceptors:定义了struts2框架的拦截器
    *name:拦截器的名称,是唯一的
    *class:拦截器对应的Action类的完整路径
 -->
        <interceptors>
            <interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
            <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
            <interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
            <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
            <interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/>
            <interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor" />
            <interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
            <interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
            <interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>
            <interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
            <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
            <interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
            <interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
            <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
            <interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
            <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
            <interceptor name="actionMappingParams" class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/>
            <interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
            <interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
            <interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/>
            <interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
            <interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
            <interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
            <interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
            <interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
            <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
            <interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" />
            <interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" />
            <interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
            <interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" />
            <interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" />
            <interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" />
       </interceptors>

拦截器非常的多,其中也有很多我们眼熟的关键字吧,cookie、params、i18n等等。
在拦截器定义的下面,又定义了很多的interceptor-stack标签,这些标签定义的是拦截器栈。它们有什么作用呢?
这里我只贴出一个默认的拦截器栈作讲解。

<!--
     interceptor-stack:拦截器栈
        *存放了上面定义的拦截器,拦截器栈相当于list集合,在这里存放的拦截器是有先后顺序的
        按照声明的顺序先后执行
-->
            <interceptor-stack name="defaultStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="alias"/>
                <interceptor-ref name="servletConfig"/>
                <interceptor-ref name="i18n"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="chain"/>
                <interceptor-ref name="scopedModelDriven"/>
                <interceptor-ref name="modelDriven"/>
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="checkbox"/>
                <interceptor-ref name="multiselect"/>
                <interceptor-ref name="staticParams"/>
                <interceptor-ref name="actionMappingParams"/>
                <interceptor-ref name="params">
                    <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
                </interceptor-ref>
                <interceptor-ref name="conversionError"/>
                <interceptor-ref name="validation">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="workflow">
                    <param name="excludeMethods">input,back,cancel,browse</param>
                </interceptor-ref>
                <interceptor-ref name="debugging"/>
            </interceptor-stack>

至于它是否真的有执行顺序呢?我就不带大家验证了,大家可以找几个拦截器,然后在对应的类中打上断点,然后运行验证即可。

需要注意的是,程序默认执行的是defaultStack拦截器栈,那有没有人想为什么程序默认执行的是该拦截器栈,因为它的名字是defaultStack,所以就会执行它吗?显然,这里面是有原因的。我们往下阅读源码,找到了这样一句配置:<default-interceptor-ref name="defaultStack"/> ,它就是用来配置默认执行的拦截器栈的。
拦截器就先介绍到这里。
之前算是一个对Struts2框架的入门,有很多地方大家可能都不太理解,因为要让大家能够迅速地了解这个框架,所以没有更深层次地去介绍,只是讲述了它的冰山一角。接下来,我们就要对Struts2框架进行一个系统的学习,敬请期待吧。

原文地址:https://www.cnblogs.com/blizzawang/p/11411783.html

时间: 2024-07-31 08:00:01

SSH开发模式——Struts2(第二小节)的相关文章

SSH开发模式——Struts2(第一小节)

在制定了学习计划的学习过程中,我感觉学习还是很有效率的.很短的时间内,我便学习完了JavaWeb的连接池.DbUtils框架及其一些工具类的使用. 学无止境,学习这些知识还远远不够,所以,在接下来的时间里,我将对JavaWeb中的SSH开发模式进行一个简单的学习,并用博客记录学习进度. 开发模式相信大家都有接触或听说,但又觉得这个东西很神秘,的确,这看不见摸不着的东西确实很让人好奇,所以,从今天开始,我将带着大家去揭开它神秘的面纱. 我会把整个开发模式分为三部分,第一部分:Struts2,第二部

SSH开发模式——Struts2(第三小节)

struts2框架的知识点,虽然分了几个小节,感觉内容还是挺多的,但是你仅仅是入门了而已,想要进一步地提升自己,你得有一颗持之以恒的学习的心,最后的内容我都将在这篇博客中讲到,所以篇幅可能会有点长,希望大家能够耐心阅读. 首先介绍一下struts2的配置. 还记得我们创建的test.jsp文件吗?直接看到这篇博客的同学们也不用去翻阅我之前的博客,因为我在之前的博客中只是简单地介绍了使用,而并没有深入,我并没有讲解每一步的作用,和为什么要这样写.所以,直接从该篇博客开始阅读学习也是可以的,我将从最

SSH开发模式——Struts2进阶

在之前我有写过关于struts2框架的博客,好像是写了三篇,但是之前写的内容仅仅是struts2的一些基础知识而已,struts2还有很多有趣的内容等待着我们去发掘.我准备再写几篇关于struts2的高级内容,之前的一些基础知识我就不会再提了,所以,在看进阶篇的struts2时,我希望你有一定的struts2框架的基础,没有的话也不要紧,因为入门struts2非常简单,随手看几篇博客就算入门了,但要想灵活运用它,我们就得付出大量的时间和精力,让我们为了共同的目标奋进吧. 那就先补充一些知识点,这

javaweb学习总结(二十一)——JavaWeb的两种开发模式

SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. 一.JSP+JavaBean开发模式 1.1.jsp+javabean开发模式架构 jsp+javabean开发模式的架构图如下图(图1-1)所示 图1-1 在jsp+javabean架构中,JSP负责控制逻辑.表现逻辑.业务对象(javabean)的调用. JSP+JavaBean模式适合开发业务逻辑不太复杂的web应用程序,这种模式下

javaweb基础(21)_两种开发模式

SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. 一.JSP+JavaBean开发模式 1.1.jsp+javabean开发模式架构 jsp+javabean开发模式的架构图如下图(图1-1)所示 图1-1 在jsp+javabean架构中,JSP负责控制逻辑.表现逻辑.业务对象(javabean)的调用. JSP+JavaBean模式适合开发业务逻辑不太复杂的web应用程序,这种模式下

javaweb学习总结(二十一)——JavaWeb的两种开发模式【转】

原文 地址:http://www.cnblogs.com/xdp-gacl/p/3908610.html SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. 一.JSP+JavaBean开发模式 1.1.jsp+javabean开发模式架构 jsp+javabean开发模式的架构图如下图(图1-1)所示 图1-1 在jsp+javabean架构中,JSP负责控制逻辑.表现逻辑.业务对象(j

javaweb(二十一)——JavaWeb的两种开发模式

一.JSP+JavaBean开发模式 1.1.jsp+javabean开发模式架构 jsp+javabean开发模式的架构图如下图(图1-1)所示 图1-1 在jsp+javabean架构中,JSP负责控制逻辑.表现逻辑.业务对象(javabean)的调用. JSP+JavaBean模式适合开发业务逻辑不太复杂的web应用程序,这种模式下,JavaBean用于封装业务数据,JSP即负责处理用户请求,又显示数据. 1.2.JSP+JavaBean开发模式编写计算器 首先分析一下jsp和javabe

基于Pojo的开发模式(day03)

上一次的文章讨论到了Spring的设计目标:使得JEE开发更易用. ok,作为一个Java开发人员,应该都知道struts这个框架,不知道是否大家都清楚struts1和struts2的区别. 首先,这两个是几乎完全不同的框架,struts2更像是另一个框架WebWork的升级版.当然我们这边要讨论的并非struts2,而是要由struts2的优点: 基于Action Pojo的开发模式,还是用代码来理解: struts2 public class CommonAction { } 或者ssh @

SSH开发环境搭建

断断续续学习hibernate也有一段时间了,在这里研究一下SSH开发环境的搭建过程,自己简单的搭建一个SSH的开发环境.采用maven搭建. 0.项目结构: 1.导包:(maven项目) pom.xml配置文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&