- 浏览: 298060 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
colin_i:
总结的很好,谢谢
Spring事务传播机制和数据库隔离级别 -
xiaoxi0324:
我想问,是否支持获取method内的逻辑分支,比如if分支,普 ...
javassist 学习笔记 -
z390174504:
不错,不错哦
web.xml 中的listener、 filter、servlet 加载顺序及其详解 -
chokee:
...
web.xml 中的listener、 filter、servlet 加载顺序及其详解 -
chenchangqun:
细致啊,楼主辛苦。
web.xml 中的listener、 filter、servlet 加载顺序及其详解
拦截器的类已经定义在特殊的配置文件中,这个配置文件的名字就叫做struts-default.xml,如果你继承了struts-default默认的包名,那你就可以使用这些拦截器了,否则你必须在你自己的包中定义拦截器在<interceptors>中进行定义。
下面是Struts2中的内置拦截器介绍
Alias Interceptor | alias | 在不同的请求之间将参数在不同的名字间转换,请求内容不变. |
Chaining Interceptor | chain | 让前面一个Action的属性可以被后一个Action访问 |
Checkbox Interceptor | checkbox | Adds automatic checkbox handling code that detect an unchecked checkbox and add it as a parameter with a default (usually 'false') value. Uses a specially named hidden field to detect unsubmitted checkboxes. The default unchecked value is overridable for non-boolean value'd checkboxes. |
Cookie Interceptor | cookie | 使用配置的name、value来设置cookies |
Conversion Error Interceptor | conversionError | 将错误从ActionContext中添加到Action的属性字段中 |
Create Session Interceptor | createSession | 自动地创建HttpSession,用来为需要使用到HttpSession的拦截器服务 |
DebuggingInterceptor | debugging | 提供不同的调试用的页面来展示内部的数据状况 |
Execute and Wait Interceptor | execAndWait | 在后台执行Action,同时将用户带到一个中间的等待页面 |
Exception Interceptor | exception | 将异常定位到一个页面 |
File Upload Interceptor | fileUpload | 提供文件上传功能 |
I18n Interceptor | i18n | 记录用户选择的locale |
Logger Interceptor | logger | 输出Action的名字 |
Message Store Interceptor | store | 存储或者访问实现ValidationAware接口的Action类出现的消息、错误、字段错误等。 |
Model Driven Interceptor | model-driven | 如果一个类实现了ModelDriven,将getModel得到的结果放在ValueStack中 |
Scoped Model Driven Interceptor | scoped-model-driven | 如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model,调用Action的setModel方法将其放入Action内部 |
Parameters Interceptor | params | 将请求中的参数设置到Action中去 |
Prepare Interceptor | prepare | 如果Action实现了Preparable,则该拦截器调用Action类的prepare方法 |
Scope Interceptor | scope | 将Action状态存入Session和Application的简单方法 |
Servlet Config Interceptor | servletConfig | 提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问 |
Static Parameters Interceptor | staticParams | 从struts.xml文件中将<action>中的<param>下的内容设置到对应的Action中 |
Roles Interceptor | roles | 确定用户是否具有JAAS指定的Role,否则不予执行 |
Timer Interceptor | timer | 输出Action执行的时间 |
Token Interceptor | token | 通过Token来避免双击 |
Token Session Interceptor | tokenSession | 和Token Interceptory一样,不过双击的时候把请求的数据存储在Session中 |
Validation Interceptor | validation | 使用action-validation.xml文件中定义的内容校验提交的数据 |
Workflow Interceptor | workflow | 调用Action的validate的方法,一旦有错返回,重新定位到INPUT页面 |
Parameter Filter Interceptor | N/A | 从参数列表中删除不必要的参数 |
Profiling Interceptor | profiling | 通过参数激活profile |
每一个拦截器都可以配置参数,有两种方式配置参数,一是针对每一个拦截器定义参数,二是针对一个拦截器堆栈统一定义所有的参数,例如:
<interceptor-ref name="validation"> <param name="excludeMethods">myValidationExcudeMethod</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">myWorkflowExcludeMethod</param> </interceptor-ref>
或者
<interceptor-ref name="defaultStack"> <param name="validation.excludeMethods">myValidationExcludeMethod</param> <param name="workflow.excludeMethods">myWorkflowExcludeMethod</param> </interceptor-ref>
每一个拦截器都有两个默认的参数:
excludeMethods - 过滤掉不使用拦截器的方法和
includeMethods – 使用拦截器的方法。
需要说明的几点:
1 拦截器执行的顺序按照定义的顺序执行,例如:
<interceptor-stack name="xaStack"> <interceptor-ref name="thisWillRunFirstInterceptor"/> <interceptor-ref name="thisWillRunNextInterceptor"/> <interceptor-ref name="followedByThisInterceptor"/> <interceptor-ref name="thisWillRunLastInterceptor"/> </interceptor-stack>
的执行顺序为:
thisWillRunFirstInterceptor thisWillRunNextInterceptor followedByThisInterceptor thisWillRunLastInterceptor MyAction1 MyAction2 (chain) MyPreResultListener MyResult (result) thisWillRunLastInterceptor followedByThisInterceptor thisWillRunNextInterceptor thisWillRunFirstInterceptor
2 使用默认拦截器配置每个Action都需要的拦截器堆栈,例如:
<action name="login" class="tutorial.Login"> <interceptor-ref name="timer"/> <interceptor-ref name="logger"/> <interceptor-ref name="default-stack"/> <result name="input">login.jsp</result> <result type="redirect-action">/secure/home</result> </action>
可以按照如下的方式定义:
<interceptors> <interceptor-stack name="myStack"> <interceptor-ref name="timer"/> <interceptor-ref name="logger"/> <interceptor-ref name="default-stack"/> </interceptor-stack> </interceptors> <default-interceptor-ref name="myStack"/> <action name="login" class="tutorial.Login"> <result name="input">login.jsp</result> <result type="redirect-action">/secure/home</result> </action>
作为“框架(framework)”,可扩展性是不可或缺的,因为世上没有放之四海而皆准的东西。虽然,Struts 2为我们提供如此丰富的拦截器实现,但是这并不意味我们失去创建自定义拦截器的能力,恰恰相反,在Struts 2自定义拦截器是相当容易的一件事。 要求拦截器是无状态的原因是Struts 2不能保证为每一个请求或者action创建一个实例,所以如果拦截器带有状态,会引发并发问题。 所有的Struts 2的拦截器都直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor。除此之外,大家可能更喜欢继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor。 以下例子演示通过继承AbstractInterceptor,实现授权拦截器。 首先,创建授权拦截器类tutorial.AuthorizationInterceptor,代码如下: 以上代码相当简单,我们通过检查session是否存在键为“ROLE”的字符串,判断用户是否登陆。如果用户已经登陆,将角色放到Action中,调用Action;否则,拦截直接返回Action.LOGIN字段。为了方便将角色放入Action,我定义了接口tutorial.RoleAware,代码如下: 接着,创建Action类tutorial.AuthorizatedAccess模拟访问受限资源,它作用就是通过实现RoleAware获取角色,并将其显示到ShowUser.jsp中,代码如下: 以下是ShowUser.jsp的代码: 然后,创建tutorial.Roles初始化角色列表,代码如下: 接下来,新建Login.jsp实例化tutorial.Roles,并将其roles属性赋予<s:radio>标志,代码如下: 创建Action类tutorial.Login将role放到session中,并转到Action类tutorial.AuthorizatedAccess,代码如下: 最后,配置struts.xml文件,内容如下:自定义拦截器
大家在开始着手创建自定义拦截器前,切记以下原则:
拦截器必须是无状态的,不要使用在API提供的ActionInvocation之外的任何东西。
import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class AuthorizationInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation ai) throws Exception {
Map session = ai.getInvocationContext().getSession();
String role = (String) session.get( " ROLE " );
if ( null != role) {
Object o = ai.getAction();
if (o instanceof RoleAware) {
RoleAware action = (RoleAware) o;
action.setRole(role);
}
return ai.invoke();
} else {
return Action.LOGIN;
}
}
}
public interface RoleAware {
void setRole(String role);
}
import com.opensymphony.xwork2.ActionSupport;
public class AuthorizatedAccess extends ActionSupport implements RoleAware {
private String role;
public void setRole(String role) {
this .role = role;
}
public String getRole() {
return role;
}
@Override
public String execute() {
return SUCCESS;
}
}
<% @taglib prefix = " s " uri = " /struts-tags " %>
< html >
< head >
< title > Authorizated User </ title >
</ head >
< body >
< h1 > Your role is: < s:property value ="role" /></ h1 >
</ body >
</ html >
import java.util.Hashtable;
import java.util.Map;
public class Roles {
public Map < String, String > getRoles() {
Map < String, String > roles = new Hashtable < String, String > ( 2 );
roles.put( " EMPLOYEE " , " Employee " );
roles.put( " MANAGER " , " Manager " );
return roles;
}
}
<% @taglib prefix = " s " uri = " /struts-tags " %>
< html >
< head >
< title > Login </ title >
</ head >
< body >
< h1 > Login </ h1 >
Please select a role below:
< s:bean id ="roles" name ="tutorial.Roles" />
< s:form action ="Login" >
< s:radio list ="#roles.roles" value ="'EMPLOYEE'" name ="role" label ="Role" />
< s:submit />
</ s:form >
</ body >
</ html >
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class Login extends ActionSupport implements SessionAware {
private String role;
private Map session;
public String getRole() {
return role;
}
public void setRole(String role) {
this .role = role;
}
public void setSession(Map session) {
this .session = session;
}
@Override
public String execute() {
session.put( " ROLE " , role);
return SUCCESS;
}
}
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
< include file ="struts-default.xml" />
< package name ="InterceptorDemo" extends ="struts-default" >
< interceptors >
< interceptor name ="auth" class ="tutorial.AuthorizationInterceptor" />
</ interceptors >
< action name ="Timer" class ="tutorial.TimerInterceptorAction" >
< interceptor-ref name ="timer" />
< result > /Timer.jsp </ result >
</ action >
< action name ="Login" class ="tutorial.Login" >
< result type ="chain" > AuthorizatedAccess </ result >
</ action >
< action name ="AuthorizatedAccess" class ="tutorial.AuthorizatedAccess" >
< interceptor-ref name ="auth" />
< result name ="login" > /Login.jsp </ result >
< result name ="success" > /ShowRole.jsp </ result >
</ action >
</ package >
</ struts >
以上文章是参考网上总结的,有很多很不错的文章,在以后可以慢慢研究,先做个记号:
http://longzijian.iteye.com/blog/336840
发表评论
-
Struts2.1XX 后台不打印异常问题
2010-07-15 12:00 3068在开发的时候发现Struts2.16 在action内抛 ... -
Struts2 主要类的源码分析
2010-03-25 14:39 0下面以Struts2 请求流程(FilterDispater ... -
struts2 主要类分析
2009-12-13 17:53 0下面以Struts2 请求流程(FilterDispater ... -
struts2 处理请求流程分析(结合源码)3
2009-12-04 17:35 28522.3、dispatcher.serviceActio ... -
struts2 处理请求流程分析(结合源码)2
2009-12-04 17:35 25822、过滤器中的doFilter(Ser ... -
struts2 处理请求流程分析(结合源码)1
2009-12-04 17:33 2599struts2 源码版本2.0.11.1 本文是综合网上部分 ... -
struts2 中struts.properties 配置详解
2009-11-23 10:53 1031struts.configuration #该属性指定加载S ... -
webwork拦截器interceptor 之 ActionInvocation 意义
2009-09-11 10:22 2146“将Web页面中的输入元素封装为一个(请求)数据对象”,这个对 ... -
struts2 流程源码分析及标签查询
2009-06-07 09:19 1608源码分析:http://zddava.iteye.com/ca ... -
struts2学习总结
2009-04-28 11:54 2642该文章会随着strust2 学习的深入,不断添加和更新,说 ... -
struts2中OGNL和 ValueStack(二)
2009-04-27 23:10 2425表达式语言主要有以下几大好处: 避免(MyType) re ... -
struts2中OGNL和 ValueStack(一)
2009-04-27 23:08 10532学习的时候,总分不清楚在struts2中页面的传值和取值是怎么 ...
相关推荐
Struts2基于拦截器模式,提供了丰富的插件和拦截器,支持多种视图技术如JSP、FreeMarker等,并且与Spring、Hibernate等框架集成良好。它的核心功能包括动作映射、结果类型、值栈以及拦截器等。 动态树形目录的实现...
在Java Web开发中,Struts2...这种自定义拦截器的方式提供了更大的灵活性,可以根据项目需求调整拦截逻辑,而不再受限于Struts2内置的标签。同时,使用MD5加密生成的唯一令牌增强了令牌的安全性,减少了重复的可能性。
通过深入学习Struts2的配置、Action、视图、拦截器和标签库,开发者能够构建出高效、稳定、易于维护的企业级应用。在实际开发中,结合最佳实践和不断迭代,可以不断提升应用程序的质量和用户体验。
- **拦截器(Interceptor)**:拦截器是Struts2框架的核心组件之一,用于在Action执行前后进行一些预处理或后处理的工作。 - **结果类型(Result Type)**:结果类型定义了Action执行完毕后返回给用户的响应类型,...
在Action中处理业务逻辑,通过Struts2.0的拦截器链实现对请求的预处理和后处理,最终将结果呈现给用户。 总之,Struts2.0不仅解决了原Struts框架的缺陷,如代码冗余和测试难度,还引入了一系列先进的特性和工具,...
例如定义Action、拦截器等。 **第六步:配置web.xml** - 在`WEB-INF`目录下的`web.xml`文件中配置过滤器和其他设置,以便启动Struts2。 **第七步:测试运行** - 将项目部署到Tomcat服务器,并启动服务器进行测试...
默认情况下,Struts2提供了一些内置的拦截器,如Params、Validation、Stack等。 5. **结果类型(Result)**:Result是Action执行后决定如何展示视图的方式,比如转发、重定向或者渲染一个JSP页面。常见的结果类型有...
在开发Java Web应用程序时,Struts2框架是一个广泛使用的MVC(模型-视图-控制器)框架,它简化了创建动态、数据驱动的Web应用。NetBeans IDE是Java开发者...不断学习和实践,才能充分发挥Struts2和NetBeans结合的优势。
在Struts2中,核心组件包括Action类、配置文件(struts.xml)、拦截器(Interceptors)和结果类型(Result)。Action类是业务逻辑的载体,负责处理来自客户端的请求。配置文件定义了Action与URL的映射关系,以及...
Struts 2的配置主要通过`struts.xml`文件完成,其中定义了Action、拦截器、结果类型等关键配置信息。 ### 实战案例分析 为了更好地理解Struts 2的使用方式,可以参考一些实际项目中的应用场景: - **用户登录系统...
Struts2不仅继承了Struts1的强大功能,如请求处理、表单验证、国际化支持等,还引入了更多的创新特性,例如拦截器、动态方法调用、类型转换和格式化等,使得Web应用的开发更加灵活和高效。 ### Struts2的发展历程 ...
- **拦截器机制**:Struts2的拦截器允许在Action执行前后插入额外的逻辑,如日志、权限检查等。 - **自定义拦截器**:可以通过继承Interceptor接口,实现preintercept()、intercept()和postintercept()方法来自...
Struts2的核心组件包括拦截器、结果类型以及标签库等。 ### Doubleselect标签概述 在Struts2中,`doubleselect`标签是一种非常实用的标签,主要用于创建两个级联选择框。这种标签允许用户在一个下拉列表中进行选择...
- **基于拦截器**:Struts2的核心是一个拦截器栈,它使用拦截器处理请求,这使得扩展和定制非常容易。 - **易于集成**:Struts2可以轻松地与其他框架(如Spring和Hibernate)集成,形成强大的企业级应用开发解决方案...
- **增强的拦截器机制**:Struts2.0的拦截器机制更为强大,支持更多的预处理和后处理操作。 - **更好的国际化支持**:Struts2.0提供了更灵活的国际化解决方案,支持多种语言和地区设置。 通过以上知识点的梳理,...
下面将从Struts2的基本概念、特点、安装配置、核心组件、拦截器机制等方面进行详细的介绍。 ### Struts2框架基本概念 Struts2是由Apache软件基金会负责维护的一个开源项目,它是一个基于MVC(Model-View-...
通过本课程的学习,你应该能够熟练掌握Struts2框架中的各种拦截器的使用方法,包括内置的Timer计时拦截器、Token防止重复提交拦截器以及如何自定义拦截器。同时,你也应该能够有效地实现对Action中的输入数据进行...
与传统的 Struts1 相比,Struts2 更加灵活且易于扩展,支持更高级的功能如拦截器、依赖注入等。 - **Spring**:是一个轻量级的 Java 开发框架,提供了完整的解决方案来简化企业级应用程序的开发。Spring 支持依赖...
同样,在配置Struts2时,也要确保struts.xml文件配置正确,并且Action映射、拦截器等都正确设置。 最后,成功搭建SSH框架之后,开发人员可以利用这种框架结构的诸多优势,比如分层架构、代码解耦和重用等,这些都是...