今天公司一位好心的同事给我很耐心的讲解了struts2.0的东东,很长见识,打算自己好好的研究一下。 边学边买,嘿嘿,重要的就是好好的看一些API文档,这对你的循序渐进的学习有很大的帮助,我这周打算把框架里面的那些配置啊~~~~弄明白,这个不难! 值得关注的就是你的jar包,我的web应用路径是F:/SVN/trunk/base/webroot/WEB-INF/lib,里面的struts2-core-2.0.8.jar 包还有xwork-2.0.3.jar包,这两个包基本上涵盖我要使用的struts的基本工具手册了。 先来看看struts2-core-2.0.8.jar吧,这个jar包里面的struts-defaut.xml比较重要的,打开这个xml,里面配置了一些什么呢? “拦截器” 以及 result-types。 其中拦截器的配置文件总结一下是这样的:
- 多个拦截器可以组成一个拦截器堆栈。每个拦截器命名为一。 拦截器的使用也要小心:
拦截器和拦截器堆栈可以混合使用。但按顺序执行。也可以设一个默认的如:<default-interceptor-ref name="secureStack"/>在使用默认的拦截器和其他拦截器结合的时候,你需要注意的是: 拦截器的顺序要按照你的业务逻辑循序来进行,一旦写反了,那么他的执行效果就不是你想要的。如:(这个例子的先后顺序值得参考,现使用tokenSession,然后使用默认的defaultStack,最后execAndWait这个是等待的一个拦截器。)<interceptor-ref name="tokenSession"></interceptor-ref><!--tokenSession 防止表单二次提交,不用token--> <interceptor-ref name="defaultStack"></interceptor-ref><!-- 默认的拦截器栈 --> <interceptor-ref name="execAndWait"></interceptor-ref><!-- 顺序执行,出栈是逆行的 -->
- 每个Action也可以定义自己的拦截器:
A local Interceptor Stack<action name="VelocityCounter" class="org.apache.struts2.example.counter.SimpleCounter"> <result name="success"> ... </result> <interceptor-ref name="defaultComponentStack"/> </action> 关于拦截器,我详细的记录了token拦截器的使用,以及后台的实现原理: 1 什么时候使用token拦截器呢? 提交表单时,可能出现这样的情况,如果上次提交成功,按浏览器的返回按钮,再提交一次会出现同一份数据提交两次的情况。如果这份表单不幸两次写入数据库,这个可不是你想要的。 Struts提供两个拦截器用来阻止这种用户无意的行为可能导致的重复提交问题。 2 实现过程: a.在提交的表单中,添加 标记。 b.配置TokenInterceptor或TokenSessionInterceptor。 c.配置invoke.token结果,决定如果遇到重复提交时需要返回的页面。 另外可以在struts.properties文件中提供struts.messages.invalid.token健值决定如果发生Token的错误信息。 3 TokenInterceptor实现原理: 标记的作用是在显示表单页面时,服务器(由TokenHelper类实现)会生成一个唯一的令牌键值对,并在提交表单时发送给服务器。 服务器会检测客户端提交的令牌和缓存的令牌进行比较,如果是有效的则清除服务器端缓存并继续处理,如果是无效的,则返回invalid.token结果(通常显示一个提示页面)。 4 TokenSessionStoreInterceptor 的实现原理: TokenSessionStoreInterceptor扩展至TokenInterceptor,改写了处理无效令牌的机制,不是返回一个invalid.token结果,而是返回上一次成功提交后的结果页面,这是如何做到的呢? TokenSessionStoreInterceptor会针对每次拦截成功执行的ActionInvocation根据令牌的健值为标识符进行缓存,如果发生重复提交,则取出缓存的ActionInvocation中的Result对象返回。 5最后ExecuteAndWaitInterceptor 拦截器 此拦截器主要目的是给一些长任务请求更好的用户体验,在长任务执行过程中显示给用户一个等待页面,可以通过配置wait结果页面提供一个自定义的等待页面,否则框架将提供一个缺省的比较丑陋的等待页面。 注意: 此拦截器必须放在拦截器堆栈的最后。 此拦截器基于会话的,这意味着同一个会话中同时只能执行一个此请求。 ExecuteAndWaitInterceptor 拦截器的实现原理: 1.拦截器会将当前请求包装在一个后台线程中执行(由BackgroundProcess类实现)。 2.在后台线程执行的过程中,拦截器会每隔100微秒检查一下,后台线程是否执行结束。 3.如果在指定的延迟后,后台线程依然没有结束,将返回一个等待页面。 4.如果在指定的延迟后,后台线程运行结束,将返回请求的结果页面。注意: 因为Action运行在一个后台进程,Action无法使用ActionContext,因为ActionContext是线程本地的。如果必须访问比如会话数据,你必须让Action实现SessionAware接口,而不是调用ActionContext.getSession方法。