原创作者: radovi
阅读:5056次
评论:4条
更新时间:2011-05-26
注:本文系作者在看了浪曦的风中叶老师的struts2视频的个人总结,希望能帮助广大struts2的初学者。
这讲是接着上讲的内容
这讲主要讲一些struts2拦截器的一些细节方面东西,但很有用。
首先修改上讲中的文件test.jsp,弄一张表单:
代码如下:
再在action中配置一个输入验证的文件 Test_InterceptorAction-validation.xml (如何配置请看前面几节的内容,这里不再说了)
项目结构为:
好了,显然,通过以上配置,理论上可以如果表单中username域为空时,会有错误提示的
可是依旧成功提交,这是为什么呢?
这是由于在struts.xml文件中我们对action插入了自定义的interceptor之后,没有将sturts2默认的拦截器插入action(struts2规定:如果action没有插入任何interceptor存在时。默认插入一个叫dafaultStack的拦截器栈)
所以,这里,我们要手动插入之
修改struts.xml即可 如下:(注意代码中的注释)
好了 现在在试试看 “username isrequired”
其实还有如下几种方法导入默认的defaultStack
方法一:定义一拦截器栈,将defaultStack放入自定义的拦截器栈中去
struts2.xml文件如下:(注意看一些注释)
方法二: 自定义一个默认拦截拦截器。代码如下,注意注释:
好,接下去讲将将怎样为拦截器配置参数:
此时,必须修改struts.xml 中定义拦截器部分的代码:(如下)
然后修改拦截器 MyIntercepror.java 代码如下:
好了,重启一下tomcat,控制台看到什么了。
另外,在使用拦截器的是时候也可以在定义这个参数的value,结果是,覆盖定义时候的value值
如下
struts.xml
再次重启tomcat 看到了吧
附件中有源码
这讲是接着上讲的内容
这讲主要讲一些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 看到了吧
附件中有源码
4 楼 不复记忆 2009-10-02 10:48
3 楼 yangqianyu222 2009-06-12 10:50
2 楼 radovi 2009-03-25 23:11
写得很好 继续哦 呵呵
ok
1 楼 label 2009-03-25 23:05