这讲主要讲一些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 看到了吧
首先修改上讲中的文件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 看到了吧