原创作者: radovi   阅读:5007次   评论:4条   更新时间:2011-05-26    
注:本文系作者在看了浪曦的风中叶老师的struts2视频的个人总结,希望能帮助广大struts2的初学者。

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

首先修改上讲中的文件test.jsp,弄一张表单:
代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  
  <body>
				<s:form action="test_interceptor">
					    <s:textfield     name="username" label="username"></s:textfield>
					  <s:submit name="submit"></s:submit>
						
				</s:form>
  </body>
</html>



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

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
 "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

<validators>

			
				        <field name="username">
				        
				             <field-validator type="requiredstring">
				             		<param name="trim">true</param>
				             		<message>username is required</message>				
				             </field-validator>
				        </field>


</validators>



项目结构为:






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

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

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

修改struts.xml即可   如下:(注意代码中的注释)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">


<struts>
		<package name="interceptor1" extends="struts-default">
						  
						  <!-- 定义拦截器 -->
						  <interceptors>
						  		<interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor"></interceptor>
						  </interceptors>
						 
						<!-- 配置action -->
						<action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">
							<result name="success">/success.jsp</result>
							<result name="input">/test.jsp</result>
							<!-- 将声明好的拦截器插入action中 -->
								<interceptor-ref name="myInterceptor"></interceptor-ref>
 <!--由于我们插入了自定义的interceptor。所以必须手动插入struts2的默认interceptor-->
                               <interceptor-ref name="defaultStack"></interceptor-ref>
						</action>
						
						
		</package>
</struts>





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


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

方法一:定义一拦截器栈,将defaultStack放入自定义的拦截器栈中去
struts2.xml文件如下:(注意看一些注释)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">


<struts>
		<package name="interceptor1" extends="struts-default">
						  
						  <!-- 定义拦截器 -->
						  <interceptors>
						                                <!-- 定义自己的拦截器 -->
						  		<interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor"></interceptor>
                                                    <!--定义自己的拦截器栈  -->
						 <interceptor-stack name="myStack">
						                                                                 <!-- 将拦截器放入栈 -->
						 			<interceptor-ref name="myInterceptor"></interceptor-ref>
						 			<interceptor-ref name="defaultStack"></interceptor-ref>
						 </interceptor-stack>
						 
						 
						 
						 </interceptors>
						<!-- 配置action -->
						<action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">
							<result name="success">/success.jsp</result>
							<result name="input">/test.jsp</result>
							<!-- 将声明好的自定义拦截器栈插入action中 -->
								<interceptor-ref name="myStack"></interceptor-ref>
						</action>
						
						
		</package>
</struts>





方法二: 自定义一个默认拦截拦截器。代码如下,注意注释:
   <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">


<struts>
		<package name="interceptor1" extends="struts-default">
						  
						  <!-- 定义拦截器 -->
						  <interceptors>
						                                <!-- 定义自己的拦截器 -->
						  		<interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor"></interceptor>
                                                    <!--定义自己的拦截器栈  -->
						 <interceptor-stack name="myStack">
						                                                                 <!-- 将拦截器放入栈 -->
						 			<interceptor-ref name="myInterceptor"></interceptor-ref>
						 			<interceptor-ref name="defaultStack"></interceptor-ref>
						 </interceptor-stack>
						 
						  
						 </interceptors>
						  <!-- 配置默认的拦截器栈 -->
						  <default-action-ref name="myStack"></default-action-ref>
					
					
					
					
						<!-- 配置action -->
						<action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">
							<result name="success">/success.jsp</result>
							<result name="input">/test.jsp</result>
							<!-- 此时这里无需插入任何拦截器 -->
								
						</action>
						
						
		</package>
</struts>


















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

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

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">


<struts>
		<package name="interceptor1" extends="struts-default">
						  
						  <!-- 定义拦截器 -->
						  <interceptors>
						                                <!-- 定义自己的拦截器 -->
						  		<interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor">
						  		   		<param name="test">success</param>                                      <!-- 这里配置拦截器的参数 -->
						  		</interceptor>
                                                    <!--定义自己的拦截器栈  -->
						 <interceptor-stack name="myStack">
						                                                                 <!-- 将拦截器放入栈 -->
						 			<interceptor-ref name="myInterceptor"></interceptor-ref>
						 			<interceptor-ref name="defaultStack"></interceptor-ref>
						 </interceptor-stack>
						 
						  
						 </interceptors>
						  <!-- 配置默认的拦截器栈 -->
						  <default-action-ref name="myStack"></default-action-ref>
					
					
					
					
						<!-- 配置action -->
						<action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">
							<result name="success">/success.jsp</result>
							<result name="input">/test.jsp</result>
							<!-- 此时这里无需插入任何拦截器 -->
								
						</action>
						
						
		</package>
</struts>






然后修改拦截器 MyIntercepror.java 代码如下:
package cn.edu.hdu.interceptor;

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

public class MyInterceptor implements Interceptor {

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

	 private String test;                 // 这个变量必须和配置文件中的对应的字段
	 
	                  
	
                             
	public String getTest() {
		return test;
	}

	public void setTest(String test) {
		this.test = test;
	}

	public void destroy() {

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

	public void init() {               

		               System.out.println("拦截器已经被加载");
		               System.out.println(this.getTest());                   //将这个参数的值打印出来
	}

	public String intercept(ActionInvocation invocation) throws Exception {

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

}



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





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

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">


<struts>
		<package name="interceptor1" extends="struts-default">
						  
						  <!-- 定义拦截器 -->
						  <interceptors>
						                                <!-- 定义自己的拦截器 -->
						  		<interceptor name="myInterceptor" class="cn.edu.hdu.interceptor.MyInterceptor">
						  		   		<param name="test">success</param>                                      <!-- 这里配置拦截器的参数 -->
						  		</interceptor>
                                                    <!--定义自己的拦截器栈  -->
						 <interceptor-stack name="myStack">
						                                                                 <!-- 将拦截器放入栈 -->
						 			<interceptor-ref name="myInterceptor">
						 					<param name="test">success when use it</param>               <!-- 此处是在使用的时候对其再次进行一个 -->
						 			</interceptor-ref>
						 			<interceptor-ref name="defaultStack"></interceptor-ref>
						 </interceptor-stack>
						 
						  
						 </interceptors>
						  <!-- 配置默认的拦截器栈 -->
						  <default-action-ref name="myStack"></default-action-ref>
					
					
					
					
						<!-- 配置action -->
						<action name="test_interceptor" class="cn.edu.hdu.action.Test_InterceptorAction">
							<result name="success">/success.jsp</result>
							<result name="input">/test.jsp</result>
							<!-- 此时这里无需插入任何拦截器 -->
								
						</action>
						
						
		</package>
</struts>





再次重启tomcat 看到了吧





附件中有源码
  • 大小: 19.2 KB
  • 大小: 13.4 KB
评论 共 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
写得很好  继续哦  呵呵

发表评论

您还没有登录,请您登录后再发表评论

文章信息

  • radovi在2009-03-02创建
  • radovi在2011-05-26更新
  • 标签: 拦截器, 进阶, struts2
Global site tag (gtag.js) - Google Analytics