`

【转】struts2注解配置Action及拦截器几种不同方式写法对应的路径指向

 
阅读更多

本工程中:

Action类的类路径:com.xxx.xxx.main.action.LotteryAction 需要拦截器检查是否登录

                            com.xxx.xxx.main.action.ActivityAction 不需要拦截器

 

相关页面路径:WebRoot/page/lottery     和 WebRoot/page/activity

 

Struts.xml:

 

<constant name="struts.objectFactory" value="spring"/>
    <constant name="struts.devMode" value="false"/>
    <constant name="struts.i18n.reload" value="true"/>
    <constant name="struts.locale" value="zh-CN"/>
    <constant name="struts.i18n.encoding" value="UTF-8"/>
    <constant name="struts.enable.DynamicMethodInvocation" value="true"/>
    <constant name="struts.convention.package.locators" value="action"/>
    <constant name="struts.convention.default.parent.package" value="crud-default"/>
    <constant name="struts.convention.result.path" value="/"/>
    <constant name="struts.action.extension" value="do"/>
    <constant name="struts.multipart.saveDir" value="temp"/>
    <constant name="struts.multipart.maxSize" value="102400"/>

 

拦截器配置方式:(此部分讲拦截器配置,不用看Action方法注解上的value与results,这些在下面讲Action配置时会讲到,因为Action类声明上的注解与方法上的注解搭配不同,可以导致Action方法注解上的value与results中路径写法不同)

 

第一种方式,不按包拦截,拦截器配置到全局根包路径下,以具体的Action方式中引用为准

 

      <package name="crud-default" extends="convention-default">
        <interceptors>
            <interceptor name="checkLogin" class="logginInterceptor"/>
            <interceptor-stack name="checkLoginStack">
                <interceptor-ref name="checkLogin"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>        
    </package>

    <package name="struts-interceptor" extends="crud-default">
        <!--<interceptors>-->
            <!--<interceptor name="checkLogin" class="logginInterceptor"/>-->
            <!--<interceptor-stack name="checkLoginStack">-->
                <!--<interceptor-ref name="checkLogin"/>-->
                <!--<interceptor-ref name="defaultStack"/>-->
            <!--</interceptor-stack>-->
        <!--</interceptors>-->
    </package>  

 

 

 

@Controller("lotteryAction")
public class LotteryAction extends AbstratcBusiAction {

      @org.apache.struts2.convention.annotation.Action(value = "/lottery/doLottery",
            results = {
                    @Result(name = "success", type = "freemarker", location = "../page/lottery/lotteryresult.ftl"),
                    @Result(name = "fail", type = "freemarker", location = "../page/lottery/failedmessage.ftl")
            }
        ,interceptorRefs = {@InterceptorRef(value = "checkLoginStack"),@InterceptorRef(value = "defaultStack")}  //这就是在Action方法中指定需要的拦截器,没有这一段,则该Action进入前不会进拦截器
            )
    public String doLottery() {

          ......

     }

}

 

第二种方式:以包拦截,配置如下:

 

<package name="crud-default" extends="convention-default">
        <!--<interceptors>
            <interceptor name="checkLogin" class="logginInterceptor"/>
            <interceptor-stack name="checkLoginStack">
                <interceptor-ref name="checkLogin"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>-->
    </package>

    <package name="struts-interceptor" extends="crud-default" namespace="/activity" > 
        <interceptors>
            <interceptor name="checkLogin" class="logginInterceptor"/>
            <interceptor-stack name="checkLoginStack">
                <interceptor-ref name="checkLogin"/>                将拦截器在本包中定义,在本包中引用
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="checkLoginStack"/> //此句表明该包下的所有Action均会启用checkLogin 拦截器 
    </package>

 

 

    <package name="crud-default" extends="convention-default">
        <interceptors>
            <interceptor name="checkLogin" class="logginInterceptor"/>
            <interceptor-stack name="checkLoginStack">
                <interceptor-ref name="checkLogin"/>              将拦截器在全局包中定义,在需要用到的包中指明引用
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>        
    </package>

    <package name="struts-interceptor" extends="crud-default" namespace="/activity">
        <!--<interceptors>
            <interceptor name="checkLogin" class="logginInterceptor"/>
            <interceptor-stack name="checkLoginStack">
                <interceptor-ref name="checkLogin"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>-->
        <default-interceptor-ref name="checkLoginStack"/>    在本包中指明需要引用这个拦截器
    </package>

 

 

@Controller("lotteryAction")

@ParentPackage(value = "struts-interceptor")    这一句一定不能少,一定显式指明这个Action类属于 struts-interceptor包下 ,则类中定义的所有Action方式均会生效
public class LotteryAction extends AbstratcBusiAction {

 

 

     @org.apache.struts2.convention.annotation.Action(value = "/lottery/doLottery" ,    此处即使上述的配置文件中namespace="/activity",而此处的 value = "/lottery/doLottery",(换成 value = "/ activity /doLottery" 也一样)都不会影响该拦截器的生效,关键就在于类声明注解上的 @ParentPackage(value = "struts-interceptor")

            results = {
                    @Result(name = "success", type = "freemarker", location = "../page/lottery/lotteryresult.ftl"),
                    @Result(name = "fail", type = "freemarker", location = "../page/lottery/failedmessage.ftl")
            }
//        ,interceptorRefs = {@InterceptorRef(value = "checkLoginStack"),@InterceptorRef(value = "defaultStack")}     上述配置中加上了default-interceptor-ref 表明 struts-interceptor包下所有Action都启用checkLoginStack拦截器 ,所以此处已不需要特别指定了
            )
     public String doLottery() {

      ....

     }

 

 

下面讲下Action类声明注解及action方式注解的几种搭配配置方式:

 

第一种:Action类声明中不作特殊注解,完全以action方法上的注解为准

 

@Controller("lotteryAction")
public class LotteryAction extends AbstratcBusiAction {

       @org.apache.struts2.convention.annotation.Action(
            value = "/lottery/showLotteryInfo" ,
            results = {
                    @Result(name = "success", type = "freemarker", location = "../page/lottery/lotteryinfo.ftl" ),
                    @Result(name = "fail", type = "freemarker", location = "../page/lottery/failedmessage.ftl")

            })
      public String showLotteryInfo() {

           ......

      }

 

在此种方式中,由于Action类声明中没有 @Namespace("/lottery"),Struts2解析器会根据这个action方法中的value = "/lottery/showLotteryInfo"把该action方法的 Namespace解析为 /lottery ( value = "/ activity/showLotteryInfo"则会将 Namespace解析为 activity ),由于使用了convention插件,插件会根据解析出来的Namespace  lottery, 按照约定优于配置的原则  WebRoot/ lottery/下去寻找 s uccess指向的页面,而在本工程中的一开始就说明了页面在WebRoot/page/lottery下,则不是直接在WebRoot/ lottery/,故此处填上../page/lottery/lotteryinfo.ftl是一个相对于 WebRoot/ lottery/的相对地址 

( <constant name="struts.convention.result.path" value="/"/>决定了 convention插件去的起始寻找地址,这里配置的/即指向 WebRoot,再加上解析出来的 Namespace为 lottery,所以去 WebRoot/ lottery/下去寻找页面,如果<constant name="struts.convention.result.path" value="/page"/>,则 convention插件去的起始寻找地址为/WebRoot/page/再加上解析出来的 Namespace为 lottery,就会去 WebRoot/page/ lottery/去寻找页面,这样的话, location = "lotteryinfo.ftl"即可)

 

第二种方式:Action类声明中注解指定Namespace

 

A、action名中带/

 

@Controller("lotteryAction")
@Namespace("/lottery ")
public class LotteryAction extends AbstratcBusiAction {

 

      @org.apache.struts2.convention.annotation.Action(
            value = "/ showLotteryInfo"  带/ 
            results = {
                    @Result(name = "success", type = "freemarker", location = "/page/lottery/lotteryinfo.ftl" ),
                    @Result(name = "fail", type = "freemarker", location = "/page/lottery/failedmessage.ftl")

            })
    public String showLotteryInfo() {...}

 

}

 

  此种方式中value = "/ showLotteryInfo", location=的值将会以简单的字符串拼接形式组成,(除非location="/"开头的绝对地址)

 

      location = ".. /page/lottery/lotteryinfo.ftl",去向的地址将会是: WebRoot/ lottery/../page/lottery/lotteryinfo.ftl,这是错误的(这是 convention插件根据 @Namespace("/lottery")解析出来的寻找页面起始为" WebRoot / lottery / "+" ../page/lottery/lotteryinfo.ftl ")拼接而成。

 

      location = "/page/lottery/lotteryinfo.ftl",去向的地址将会是: WebRoot /page/lottery/lotteryinfo.ftl,这是正确的  因为location=/开头,表始绝对地址WebRoot,无论 <constant name="struts.convention.result.path" value="/"/>还是<constant name="struts.convention.result.path" value="/page"/>,这个以/开头的 location = "/page/lottery/lotteryinfo.ftl"始终是指向 WebRoot /page/lottery/lotteryinfo.ftl的 

 

总结: value = "/ showLotteryInfo"这种action名中带/的方式 不会 对location指向的一个由./或../开头的相对地址进行解析的,对location指向由/开头的,无论<constant name="struts.convention.result.path" value="?"/>, 始终将/解析成WebRoot.

 

B、action名中不带/

 

@Controller("lotteryAction")
@Namespace("/lottery ")
public class LotteryAction extends AbstratcBusiAction {

 

      @org.apache.struts2.convention.annotation.Action(
            value = "showLotteryInfo"  不带/ 
            results = {
                    @Result(name = "success", type = "freemarker", location = "/page/lottery/lotteryinfo.ftl" ),
                    @Result(name = "fail", type = "freemarker", location = "/page/lottery/failedmessage.ftl")

            })
    public String showLotteryInfo() {...}

 

}

 

location = ".. /page/lottery/lotteryinfo.ftl",去向的地址将会是: WebRoot /page/lottery/lotteryinfo.ftl, 这是正确的 (这是 convention插件根据 @Namespace("/lottery")解析出来的寻找页面起始为" WebRoot / lottery/ "

这个地址的../也就是上一级目录下的page/lottery/lotteryinfo.ftl,此时的 <constant name="struts.convention.result.path" value="/"/>;

 

如果此时的<constant name="struts.convention.result.path" value="/page"/>, 则解析出来的寻找页面起始为WebRoot/ page/ lottery/ ,    location = ".. /page/lottery/lotteryinfo.ftl"就会变成 WebRoot/ page/page/lottery/lotteryinfo.ftl,这是错误的 ,应同步修正成 location = "lotteryinfo.ftl"即可,不能是 location = "/lotteryinfo.ftl"(带上/就变成了 WebRoot/ lotteryinfo.ftl 这个地址了)

 

 

      location = "/page/lottery/lotteryinfo.ftl",去向的地址将会是: WebRoot /page/lottery/lotteryinfo.ftl,这是正确的  因为location=/开头,表始绝对地址WebRoot,无论 <constant name="struts.convention.result.path" value="/"/>还是<constant name="struts.convention.result.path" value="/page"/>,这个以/开头的 location = "/page/lottery/lotteryinfo.ftl"始终是指向 WebRoot /page/lottery/lotteryinfo.ftl的 

 

总结:value = "showLotteryInfo"这种action名中不带/的方式 将会 对location指向的一个由./或../开头的相对地址进行解析的,对location指向由/开头的, 无论<constant name="struts.convention.result.path" value="?"/>, 始终将/解析成WebRoot.

 

本工程使用到的相关jar包

 

<dependencies>
        <!-- spring相关 -->        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>2.5.6</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>2.5.6</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>2.5.6</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>2.5.6</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>2.5.6</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>2.5.6</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>2.5.6</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>2.5.6</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>2.5.6</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>2.5.6</version>
            <scope>compile</scope>
        </dependency>

        <!-- 页面相关 -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.18</version>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-core</artifactId>
            <version>2.1.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-spring-plugin</artifactId>
            <version>2.1.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.struts</groupId>
            <artifactId>struts2-convention-plugin</artifactId>
            <version>2.1.8</version>
        </dependency>

        <!-- db与memcache相关 -->
        <dependency>
            <groupId>spy</groupId>
            <artifactId>spymemcached</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>com.experlog</groupId>
            <artifactId>xapool</artifactId>
            <version>1.6-beta</version>
        </dependency>
        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>jta</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.0-801.jdbc4</version>
        </dependency>
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>
        <dependency>
            <groupId>commons-pool</groupId>
            <artifactId>commons-pool</artifactId>
            <version>1.5.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.ibatis</groupId>
            <artifactId>ibatis-sqlmap</artifactId>
            <version>2.3.4.726</version>
        </dependency>
        <!-- 全局分布式事务所需jar -->
        <dependency>
            <groupId>com.atomikos</groupId>
            <artifactId>atomikos-util</artifactId>
            <version>3.7.0</version>
        </dependency>
        <dependency>
            <groupId>com.atomikos</groupId>
            <artifactId>transactions</artifactId>
            <version>3.7.0</version>
        </dependency>
        <dependency>
            <groupId>com.atomikos</groupId>
            <artifactId>transactions-api</artifactId>
            <version>3.7.0</version>
        </dependency>
        <dependency>
            <groupId>com.atomikos</groupId>
            <artifactId>transactions-jta</artifactId>
            <version>3.7.0</version>
        </dependency>
        <dependency>
            <groupId>com.atomikos</groupId>
            <artifactId>transactions-osgi</artifactId>
            <version>3.7.0</version>
        </dependency>
        <dependency>
            <groupId>com.atomikos</groupId>
            <artifactId>transactions-jms-deprecated</artifactId>
            <version>3.7.0</version>
        </dependency>
        <dependency>
            <groupId>com.atomikos</groupId>
            <artifactId>transactions-jms</artifactId>
            <version>3.7.0</version>
        </dependency>
        <dependency>
            <groupId>com.atomikos</groupId>
            <artifactId>transactions-jdbc</artifactId>
            <version>3.7.0</version>
        </dependency>

        <!-- 其他第三方 -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.6.12</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.12</version>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib-nodep</artifactId>
            <version>2.2.2</version>
        </dependency>
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.mina</groupId>
            <artifactId>mina-core</artifactId>
            <version>2.0.4</version>
        </dependency>
        <dependency>
            <groupId>com.sun.jdmk</groupId>
            <artifactId>jmxtools</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>javax.management</groupId>
            <artifactId>jmxremote_optional</artifactId>
            <version>1.0.1_04</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.2</version>
        </dependency>
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.2.1</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.5</version>
        </dependency>
        <dependency>
            <groupId>com.caucho</groupId>
            <artifactId>hessian</artifactId>
            <version>4.0.7</version>
        </dependency>        

        <!-- 日志与测试 相关 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.1</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.6.4</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.4</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.struts.xwork</groupId>
            <artifactId>xwork-core</artifactId>
            <version>2.2.3.1</version>
        </dependency>
    </dependencies>

 

 转自:http://progress.iteye.com/blog/1264216

分享到:
评论

相关推荐

    struts2注解配置Action及拦截器几种不同方式写法对应的路径指向.docx

    "Struts2 注解配置 Action 及拦截器几种不同方式写法对应的路径指向" Struts2 注解配置 Action 及拦截器是 Struts2 框架中的核心组件之一,负责处理用户请求并返回响应结果。下面,我们将通过详细的解释和示例代码...

    Struts2 ——2、各种Action写法和配置

    这篇博客“Struts2 ——2、各种Action写法和配置”着重讲解了在Struts2框架中如何创建和配置不同的Action,以便更好地理解和运用这个框架。 在Struts2中,Action是处理用户请求的核心组件,它负责业务逻辑的处理,...

    struts2 拦截器写法

    Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.

    struts.xml配置文件详解

    在包配置中还可以指定一个默认的拦截器栈,这意味着包中的每个Action都会默认经过这些拦截器的处理: ```xml &lt;default-interceptor-ref name="mystack"&gt;&lt;/default-interceptor-ref&gt; ``` - **name**:这里引用的是...

    struts2自学文档

    - **Struts.xml配置**:包含Action及其配置信息,如拦截器、结果视图等。 #### 四、视图转发类型 - **重定向**:通过`&lt;redirect&gt;`标签实现,使浏览器重新发送一个请求到指定的URL。 - **EL表达式**:使用`${属性名...

    java过滤器、监听器拦截器原理个人总结.pdf

    Struts2 拦截器的实现原理相对简单,当请求 Struts2 的 action 时,Struts 2 会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器。 Struts2 规定用户自定义...

    struts2 权威指南 源码

    2. **拦截器(Interceptors)**:Struts2的核心特性之一就是拦截器,它们在Action执行前后进行一系列的操作,如日志记录、权限验证等。通过源码,我们可以研究不同拦截器的实现机制及其组合使用方式。 3. **配置文件...

    struts2.0学习笔记

    配置`web.xml`文件,设置Struts2的过滤器,以便拦截所有请求: ```xml &lt;filter-name&gt;struts2 &lt;filter-class&gt;org.apache.struts2.dispatcher.FilterDispatcher &lt;filter-name&gt;struts2 &lt;url-pattern&gt;/* ``` ...

    面试问题整理面试问题整理

    * Struts2 使用拦截器来处理请求,而 Struts1 使用 Action。 * Struts2 使用 OGNL 表达式来访问 JavaBean 的属性,而 Struts1 使用 JSTL。 Hibernate 的优点和缺点 Hibernate 是一个 ORM 框架,它提供了很多优点:...

    J2EE框架考试试题借鉴.pdf

    3) Struts2框架的主要组件,如Action、拦截器、结果视图以及过滤器配置。 4) Hibernate框架的配置,如sessionFactory的配置,以及通过注解或XML文件设置对象关系映射。 5) Spring框架的组件和概念,包括IoC容器、AOP...

    个人博客系统 ssh2

    Struts2具有强大的拦截器机制,可以方便地添加如日志、权限控制等功能。此外,Struts2的OGNL表达式语言简化了数据绑定和视图渲染。 2. **Hibernate**:是一个对象关系映射(ORM)工具,它允许开发者用Java对象来...

    Java学习笔记-个人整理的

    \contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...

    简单的SSH三层架构+Ajax实现Google自动搜索极为相似版+直接Excel导入数据库

    它提供了拦截器(Interceptor)机制,可以方便地添加额外的功能和拦截器链。 2. **Spring**:是应用管理容器,负责管理和协调各种组件,包括事务管理、依赖注入(DI)和面向切面编程(AOP)。Spring还提供了与...

    公司面试题实战

    - **Struts2**: Struts2框架的核心组件是拦截器,它负责处理用户请求,并将其传递给Action处理。Action处理完后,将控制权交给结果(Result),由结果负责展示数据。 **3. 编写一个能够体现单例模式思想的类** ```...

Global site tag (gtag.js) - Google Analytics