本工程中:
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>
相关推荐
"Struts2 注解配置 Action 及拦截器几种不同方式写法对应的路径指向" Struts2 注解配置 Action 及拦截器是 Struts2 框架中的核心组件之一,负责处理用户请求并返回响应结果。下面,我们将通过详细的解释和示例代码...
这篇博客“Struts2 ——2、各种Action写法和配置”着重讲解了在Struts2框架中如何创建和配置不同的Action,以便更好地理解和运用这个框架。 在Struts2中,Action是处理用户请求的核心组件,它负责业务逻辑的处理,...
Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.
在包配置中还可以指定一个默认的拦截器栈,这意味着包中的每个Action都会默认经过这些拦截器的处理: ```xml <default-interceptor-ref name="mystack"></default-interceptor-ref> ``` - **name**:这里引用的是...
- **Struts.xml配置**:包含Action及其配置信息,如拦截器、结果视图等。 #### 四、视图转发类型 - **重定向**:通过`<redirect>`标签实现,使浏览器重新发送一个请求到指定的URL。 - **EL表达式**:使用`${属性名...
Struts2 拦截器的实现原理相对简单,当请求 Struts2 的 action 时,Struts 2 会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器。 Struts2 规定用户自定义...
2. **拦截器(Interceptors)**:Struts2的核心特性之一就是拦截器,它们在Action执行前后进行一系列的操作,如日志记录、权限验证等。通过源码,我们可以研究不同拦截器的实现机制及其组合使用方式。 3. **配置文件...
配置`web.xml`文件,设置Struts2的过滤器,以便拦截所有请求: ```xml <filter-name>struts2 <filter-class>org.apache.struts2.dispatcher.FilterDispatcher <filter-name>struts2 <url-pattern>/* ``` ...
* Struts2 使用拦截器来处理请求,而 Struts1 使用 Action。 * Struts2 使用 OGNL 表达式来访问 JavaBean 的属性,而 Struts1 使用 JSTL。 Hibernate 的优点和缺点 Hibernate 是一个 ORM 框架,它提供了很多优点:...
3) Struts2框架的主要组件,如Action、拦截器、结果视图以及过滤器配置。 4) Hibernate框架的配置,如sessionFactory的配置,以及通过注解或XML文件设置对象关系映射。 5) Spring框架的组件和概念,包括IoC容器、AOP...
Struts2具有强大的拦截器机制,可以方便地添加如日志、权限控制等功能。此外,Struts2的OGNL表达式语言简化了数据绑定和视图渲染。 2. **Hibernate**:是一个对象关系映射(ORM)工具,它允许开发者用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}{...
它提供了拦截器(Interceptor)机制,可以方便地添加额外的功能和拦截器链。 2. **Spring**:是应用管理容器,负责管理和协调各种组件,包括事务管理、依赖注入(DI)和面向切面编程(AOP)。Spring还提供了与...
- **Struts2**: Struts2框架的核心组件是拦截器,它负责处理用户请求,并将其传递给Action处理。Action处理完后,将控制权交给结果(Result),由结果负责展示数据。 **3. 编写一个能够体现单例模式思想的类** ```...