文档章节

struts2 核心拦截器2 (微微进阶)——struts2第六讲

一别经年
 一别经年
发布于 2014/06/13 21:19
字数 1624
阅读 11
收藏 0
点赞 0
评论 0

拦截器 进阶 struts2

注:本文系作者在看了浪曦的风中叶老师的struts2视频的个人总结,希望能帮助广大struts2的初学者。 

这讲是接着上讲的内容 
这讲主要讲一些struts2拦截器的一些细节方面东西,但很有用。 

首先修改上讲中的文件test.jsp,弄一张表单: 
代码如下: 

Jsp代码  收藏代码

  1. <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>  

  2. <%  

  3. String path = request.getContextPath();  

  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  

  5. %>  

  6. <%@ taglib prefix="s" uri="/struts-tags" %>  

  7.   

  8. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  

  9. <html>  

  10.   <head>  

  11.     <base href="<%=basePath%>">  

  12.       

  13.     <title>My JSP 'index.jsp' starting page</title>  

  14.     <meta http-equiv="pragma" content="no-cache">  

  15.     <meta http-equiv="cache-control" content="no-cache">  

  16.     <meta http-equiv="expires" content="0">      

  17.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  

  18.     <meta http-equiv="description" content="This is my page">  

  19.     <!--  

  20.     <link rel="stylesheet" type="text/css" href="styles.css">  

  21.     -->  

  22.   </head>  

  23.     

  24.   <body>  

  25.                 <s:form action="test_interceptor">  

  26.                         <s:textfield     name="username" label="username"></s:textfield>  

  27.                       <s:submit name="submit"></s:submit>  

  28.                           

  29.                 </s:form>  

  30.   </body>  

  31. </html>  



再在action中配置一个输入验证的文件 Test_InterceptorAction-validation.xml  (如何配置请看前面几节的内容,这里不再说了) 

Xml代码  收藏代码

  1. <?xml version="1.0" encoding="UTF-8"?>  

  2. <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"   

  3.  "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">  

  4.   

  5. <validators>  

  6.   

  7.               

  8.                         <field name="username">  

  9.                           

  10.                              <field-validator type="requiredstring">  

  11.                                     <param name="trim">true</param>  

  12.                                     <message>username is required</message>               

  13.                              </field-validator>  

  14.                         </field>  

  15.   

  16.   

  17. </validators>  



项目结构为: 


 



好了,显然,通过以上配置,理论上可以如果表单中username域为空时,会有错误提示的 
可是依旧成功提交,这是为什么呢? 

这是由于在struts.xml文件中我们对action插入了自定义的interceptor之后,没有将sturts2默认的拦截器插入action(struts2规定:如果action没有插入任何interceptor存在时。默认插入一个叫dafaultStack的拦截器栈) 

所以,这里,我们要手动插入之 

修改struts.xml即可   如下:(注意代码中的注释) 

Xml代码  收藏代码

  1. <?xml version="1.0" encoding="UTF-8" ?>  

  2. <!DOCTYPE struts PUBLIC  

  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  

  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  

  5.   

  6.   

  7. <struts>  

  8.         <package name="interceptor1" extends="struts-default">  

  9.                             

  10.                           <!-- 定义拦截器 -->  

  11.                           <interceptors>  

  12.                                 <interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor"></interceptor>  

  13.                           </interceptors>  

  14.                            

  15.                         <!-- 配置action -->  

  16.                         <action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">  

  17.                             <result name="success">/success.jsp</result>  

  18.                             <result name="input">/test.jsp</result>  

  19.                             <!-- 将声明好的拦截器插入action中 -->  

  20.                                 <interceptor-ref name="myInterceptor"></interceptor-ref>  

  21.  <!--由于我们插入了自定义的interceptor。所以必须手动插入struts2的默认interceptor-->  

  22.                                <interceptor-ref name="defaultStack"></interceptor-ref>  

  23.                         </action>  

  24.                           

  25.                           

  26.         </package>  

  27. </struts>  



好了 现在在试试看  “username isrequired” 


其实还有如下几种方法导入默认的defaultStack 

方法一:定义一拦截器栈,将defaultStack放入自定义的拦截器栈中去 
struts2.xml文件如下:(注意看一些注释) 

Xml代码  收藏代码

  1. <?xml version="1.0" encoding="UTF-8" ?>  

  2. <!DOCTYPE struts PUBLIC  

  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  

  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  

  5.   

  6.   

  7. <struts>  

  8.         <package name="interceptor1" extends="struts-default">  

  9.                             

  10.                           <!-- 定义拦截器 -->  

  11.                           <interceptors>  

  12.                                                         <!-- 定义自己的拦截器 -->  

  13.                                 <interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor"></interceptor>  

  14.                                                     <!--定义自己的拦截器栈  -->  

  15.                          <interceptor-stack name="myStack">  

  16.                                                                                          <!-- 将拦截器放入栈 -->  

  17.                                     <interceptor-ref name="myInterceptor"></interceptor-ref>  

  18.                                     <interceptor-ref name="defaultStack"></interceptor-ref>  

  19.                          </interceptor-stack>  

  20.                            

  21.                            

  22.                            

  23.                          </interceptors>  

  24.                         <!-- 配置action -->  

  25.                         <action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">  

  26.                             <result name="success">/success.jsp</result>  

  27.                             <result name="input">/test.jsp</result>  

  28.                             <!-- 将声明好的自定义拦截器栈插入action中 -->  

  29.                                 <interceptor-ref name="myStack"></interceptor-ref>  

  30.                         </action>  

  31.                           

  32.                           

  33.         </package>  

  34. </struts>  



方法二: 自定义一个默认拦截拦截器。代码如下,注意注释: 

Xml代码  收藏代码

  1.    <?xml version="1.0" encoding="UTF-8" ?>  

  2. <!DOCTYPE struts PUBLIC  

  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  

  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  

  5.   

  6.   

  7. <struts>  

  8.         <package name="interceptor1" extends="struts-default">  

  9.                             

  10.                           <!-- 定义拦截器 -->  

  11.                           <interceptors>  

  12.                                                         <!-- 定义自己的拦截器 -->  

  13.                                 <interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor"></interceptor>  

  14.                                                     <!--定义自己的拦截器栈  -->  

  15.                          <interceptor-stack name="myStack">  

  16.                                                                                          <!-- 将拦截器放入栈 -->  

  17.                                     <interceptor-ref name="myInterceptor"></interceptor-ref>  

  18.                                     <interceptor-ref name="defaultStack"></interceptor-ref>  

  19.                          </interceptor-stack>  

  20.                            

  21.                             

  22.                          </interceptors>  

  23.                           <!-- 配置默认的拦截器栈 -->  

  24.                           <default-action-ref name="myStack"></default-action-ref>  

  25.                       

  26.                       

  27.                       

  28.                       

  29.                         <!-- 配置action -->  

  30.                         <action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">  

  31.                             <result name="success">/success.jsp</result>  

  32.                             <result name="input">/test.jsp</result>  

  33.                             <!-- 此时这里无需插入任何拦截器 -->  

  34.                                   

  35.                         </action>  

  36.                           

  37.                           

  38.         </package>  

  39. </struts>  
















好,接下去讲将将怎样为拦截器配置参数: 

此时,必须修改struts.xml 中定义拦截器部分的代码:(如下) 

Xml代码  收藏代码

  1. <?xml version="1.0" encoding="UTF-8" ?>  

  2. <!DOCTYPE struts PUBLIC  

  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  

  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  

  5.   

  6.   

  7. <struts>  

  8.         <package name="interceptor1" extends="struts-default">  

  9.                             

  10.                           <!-- 定义拦截器 -->  

  11.                           <interceptors>  

  12.                                                         <!-- 定义自己的拦截器 -->  

  13.                                 <interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor">  

  14.                                         <param name="test">success</param>                                      <!-- 这里配置拦截器的参数 -->  

  15.                                 </interceptor>  

  16.                                                     <!--定义自己的拦截器栈  -->  

  17.                          <interceptor-stack name="myStack">  

  18.                                                                                          <!-- 将拦截器放入栈 -->  

  19.                                     <interceptor-ref name="myInterceptor"></interceptor-ref>  

  20.                                     <interceptor-ref name="defaultStack"></interceptor-ref>  

  21.                          </interceptor-stack>  

  22.                            

  23.                             

  24.                          </interceptors>  

  25.                           <!-- 配置默认的拦截器栈 -->  

  26.                           <default-action-ref name="myStack"></default-action-ref>  

  27.                       

  28.                       

  29.                       

  30.                       

  31.                         <!-- 配置action -->  

  32.                         <action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">  

  33.                             <result name="success">/success.jsp</result>  

  34.                             <result name="input">/test.jsp</result>  

  35.                             <!-- 此时这里无需插入任何拦截器 -->  

  36.                                   

  37.                         </action>  

  38.                           

  39.                           

  40.         </package>  

  41. </struts>  



然后修改拦截器 MyIntercepror.java 代码如下: 

Java代码  收藏代码

  1. package cn.edu.hdu.interceptor;  

  2.   

  3. import com.opensymphony.xwork2.ActionInvocation;  

  4. import com.opensymphony.xwork2.interceptor.Interceptor;  

  5.   

  6. public class MyInterceptor implements Interceptor {  

  7.   

  8.       

  9.     //由于定义拦截器的时候为拦击添加了参数,所以这里要为拦截器添加对应实例字段  

  10.   

  11.      private String test;                 // 这个变量必须和配置文件中的对应的字段  

  12.        

  13.                         

  14.       

  15.                                

  16.     public String getTest() {  

  17.         return test;  

  18.     }  

  19.   

  20.     public void setTest(String test) {  

  21.         this.test = test;  

  22.     }  

  23.   

  24.     public void destroy() {  

  25.   

  26.         System.out.println("destroy");  

  27.     }  

  28.   

  29.     public void init() {                 

  30.   

  31.                        System.out.println("拦截器已经被加载");  

  32.                        System.out.println(this.getTest());                   //将这个参数的值打印出来  

  33.     }  

  34.   

  35.     public String intercept(ActionInvocation invocation) throws Exception {  

  36.   

  37.                                      System.out.println("调用intercept方法");  

  38.                                        

  39.                                      String result = invocation.invoke();       // invocation.invoke()方法检查是否还有拦截器 有的话继续调用余下的拦截器 没有了  执行action的业务逻辑  

  40.         return result;  

  41.     }  

  42.   

  43. }  



好了,重启一下tomcat,控制台看到什么了。 

 



另外,在使用拦截器的是时候也可以在定义这个参数的value,结果是,覆盖定义时候的value值 
如下 
struts.xml   

Xml代码  收藏代码

  1. <?xml version="1.0" encoding="UTF-8" ?>  

  2. <!DOCTYPE struts PUBLIC  

  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  

  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  

  5.   

  6.   

  7. <struts>  

  8.         <package name="interceptor1" extends="struts-default">  

  9.                             

  10.                           <!-- 定义拦截器 -->  

  11.                           <interceptors>  

  12.                                                         <!-- 定义自己的拦截器 -->  

  13.                                 <interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor">  

  14.                                         <param name="test">success</param>                                      <!-- 这里配置拦截器的参数 -->  

  15.                                 </interceptor>  

  16.                                                     <!--定义自己的拦截器栈  -->  

  17.                          <interceptor-stack name="myStack">  

  18.                                                                                          <!-- 将拦截器放入栈 -->  

  19.                                     <interceptor-ref name="myInterceptor">  

  20.                                             <param name="test">success when use it</param>               <!-- 此处是在使用的时候对其再次进行一个 -->  

  21.                                     </interceptor-ref>  

  22.                                     <interceptor-ref name="defaultStack"></interceptor-ref>  

  23.                          </interceptor-stack>  

  24.                            

  25.                             

  26.                          </interceptors>  

  27.                           <!-- 配置默认的拦截器栈 -->  

  28.                           <default-action-ref name="myStack"></default-action-ref>  

  29.                       

  30.                       

  31.                       

  32.                       

  33.                         <!-- 配置action -->  

  34.                         <action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">  

  35.                             <result name="success">/success.jsp</result>  

  36.                             <result name="input">/test.jsp</result>  

  37.                             <!-- 此时这里无需插入任何拦截器 -->  

  38.                                   

  39.                         </action>  

  40.                           

  41.                           

  42.         </package>  

  43. </struts>  



再次重启tomcat 看到了吧 


 


附件中有源码

Struts2核心 拦截器(初识拦截器)——— ... | struts2 文件上传与下载 (初始文件上传的 ...

评论 共 4 条 请登录后发表评论

4 楼 不复记忆 2009-10-02 10:48

挺好的,有了大致的了解了

3 楼 yangqianyu222 2009-06-12 10:50

代码格式有点乱啊。支持一下。

2 楼 radovi 2009-03-25 23:11

label 写道


写得很好&nbsp; 继续哦&nbsp; 呵呵 


ok

1 楼 label 2009-03-25 23:05

写得很好  继续哦  呵呵


本文转载自:http://javaweb.group.iteye.com/group/wiki/1514-interceptor-struts2-core-2-slightly-advanced---str...

共有 人打赏支持
一别经年
粉丝 17
博文 138
码字总数 58546
作品 0
西安
程序员
struts2基于动态代理的Interceptor

struts2核心功能都是基于struts2拦截器的,而拦截器又是基于java的动态代理。 要实现struts2拦截器,需在struts.xml中配置拦截器,每个action可以指定拦截器,指定了拦截器之后默认的拦截器链...

cjun1990 ⋅ 2015/10/23 ⋅ 0

Java程序员从笨鸟到菜鸟之(三十七)细谈struts2(二)开发第一个struts2的实例

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 前面一篇博客(细谈struts2之自己实现struts2框架)带大家对基于mvc业务流程熟悉了一下,现在我们就用对mvc...

长平狐 ⋅ 2012/11/12 ⋅ 0

Java程序员从笨鸟到菜鸟之(四十六)细谈struts2(八)拦截器的实现原理及源码剖析

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 拦截器(interceptor)是Struts2最强大的特性之一,也可以说是struts2的核心,拦截器可以让你在Action和res...

长平狐 ⋅ 2012/11/12 ⋅ 0

深入浅出Struts2

1 简介 Struts2中的Action都是POJO,这一方面增强了Action本身的可测试性,另一方面也减小了框架内部的耦合度,而HTML表单中的输入项都被转换成了恰当的类型以供action使用。开发人员还可以通...

LuXing ⋅ 2014/04/07 ⋅ 0

从一个简单的实例看struts2运行原理

1.1 简单例子 先做一个最简单的struts2的例子:在浏览器中请求一个action,然后返回一个字符串到jsp页面上显示出来。 第一步:把struts2最低配置的jar包加入的项目中。 commons-logging-1.0....

chape ⋅ 2013/06/08 ⋅ 0

Struts2体系结构

.Struts2体系结构 Struts2的体系与Struts1体系的差别非常大,因为Struts2使用了WebWork的设计核心,而不是Struts1的设计核心。Struts2中大量使用拦截器来处理用户的请求,从而允许用户的业务...

风一样 ⋅ 2011/08/06 ⋅ 0

Java程序员从笨鸟到菜鸟之(三十八)细谈struts2(三)struts2拦截器源码分析

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 前面博客我们介绍了开发struts2应用程序的基本流程(细谈struts2之开发第一个struts2的实例),通过前面我们...

长平狐 ⋅ 2012/11/12 ⋅ 0

新书预告 :《Struts2技术内幕》 —— Struts2源码研究和Web开发研究

http://www.iteye.com/topic/1117044 简单做一个新书预告,我写的《Struts2技术内幕》将在下个月问世。 这本书应该是国内比较少见的以研究Struts2的源码为主要目标的技术书籍。源码研究类的书...

ddatsh ⋅ 2011/10/26 ⋅ 8

struts2系统架构及处理流程

一、struts2系统架构 · 1.FilterDispatcher是整个Struts2的调度中心,也就是MVC中的C(控制中心),根据ActionMapper的结果来决定是否处理请求,如果ActionMapper指出该URL应该被Struts2处理...

J星星点灯 ⋅ 2017/12/21 ⋅ 0

(总结)Struts1和Struts2的区别

以前学的时候我们就是直接接触struts2,也没太关心这个struts1,正好我们公司用的是struts1,上网看过很多写这方面的博文的,写的也都很好、讲解的很详细、但是各有各的优点、我就总结了一下拿...

IT妖姬 ⋅ 2014/10/21 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

浅谈springboot Web模式下的线程安全问题

我们在@RestController下,一般都是@AutoWired一些Service,由于这些Service都是单例,所以并不存在线程安全问题。 由于Controller本身是单例模式 (非线程安全的), 这意味着每个request过来,...

算法之名 ⋅ 今天 ⋅ 0

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部