struts2总结(四)--struts2拦截器
来自:https://www.w3cschool.cn/struts_2/struts_interceptors.html
重点说明:
该照着本文参照,如果使用idea开发工具则该拦截器不能生效搞了一天才发现用eclipse照着文档配置就可以生效了。本人使用的eclipse+tomcat1.7+jdk1.7能成功使用拦截器功能
使用struts2自定义的拦截器
在Struts2Hello World示例修改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>
<constant name="struts.devMode" value="true" />
<package name="helloworld" extends="struts-default">
<action name="hello"
class="cn.w3cschool.struts2.HelloWorldAction"
method="execute">
<interceptor-ref name="params"/>
<interceptor-ref name="timer" />
<result name="success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
右键单击项目名称,然后单击“Export”>“WAR File”创建WAR文件。然后在Tomcat的webapps目录中部署这个WAR文件。最后,启动Tomcat服务器并尝试访问URL http://localhost:8080/HelloWorldStruts2/index.jsp。结果如下图所示:
现在,在给定文本框中输入任意单词,然后单击Say Hello按钮执行定义的action。如果你去查看生成的日志,会看到以下文本:
INFO: Server startup in 3539 ms
27/08/2011 8:40:53 PM
com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
INFO: Executed action [//hello!execute] took 109 ms.
这里的最后一行是由timer拦截器生成的,是表示ation总共需要109ms来执行。
自己定义拦截器
创建拦截器类
我们接下来在Java Resources>src文件夹中创建以下MyInterceptor.java文件:
package cn.w3cschool.struts2;
import java.util.*;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyInterceptor extends AbstractInterceptor {
public String intercept(ActionInvocation invocation)throws Exception{
/* let us do some pre-processing */
String output = "Pre-Processing";
System.out.println(output);
/* let us call action or next interceptor */
String result = invocation.invoke();
/* let us do some post-processing */
output = "Post-Processing";
System.out.println(output);
return result;
}
}
你可以发现,实际中action将通过拦截器使用invocation.invoke()调用执行,所以你可以根据你的需求做一些预处理和一些后处理。
框架本身通过第一次调用ActionInvocation对象的invoke()来启动进程。每次调用invoke()时,ActionInvocation都会查询其状态,并执行下一个拦截器。当所有配置的拦截器都被调用时,invoke()将使得action本身被执行。以下图表通过请求流显示了所说的概念:
创建Action类
我们在Java Resources>src文件夹下创建一个java文件HelloWorldAction.java,其中包名为cn.w3cschool.struts2,内容如下:
package cn.w3cschool.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport{
private String name;
public String execute() throws Exception {
System.out.println("Inside action....");
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这是我们在前面的例子中看到的同一个类,我们有“name”属性标准的getters和setter方法,以及返回字符串“success”的execute方法。
创建视图
让我们在你的eclipse项目的WebContent文件夹中创建下面的jsp文件HelloWorld.jsp。
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
Hello World, <s:property value="name"/>
</body>
</html>
创建主页
我们还需要在WebContent文件夹中创建index.jsp文件,此文件将用作初始的action URL,用户可以单击它以命令Struts 2框架调用HelloWorldAction类的定义方法并呈现HelloWorld.jsp视图。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World From Struts2</h1>
<form action="hello">
<label for="name">Please enter your name</label><br/>
<input type="text" name="name"/>
<input type="submit" value="Say Hello"/>
</form>
</body>
</html>
在上述视图文件中定义的hello action将使用struts.xml文件映射到HelloWorldAction类及其execute方法中。
配置文件
现在我们需要注册新的拦截器,然后调用它,因为我们在前面的例子中调用的是默认拦截器。要注册一个新的拦截器,把<interceptors> ... </ interceptors>标签直接放置在<package>标签下的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>
<constant name="struts.devMode" value="true" />
<package name="helloworld" extends="struts-default">
<interceptors>
<interceptor name="myinterceptor"
class="cn.w3cschool.struts2.MyInterceptor" />
</interceptors>
<action name="hello"
class="cn.w3cschool.struts2.HelloWorldAction"
method="execute">
<interceptor-ref name="params"/>
<interceptor-ref name="myinterceptor" />
<result name="success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
需要注意的是,你可以在<package>标签内注册多个拦截器,同时可以在<action>标签内调用多个拦截器,也可以用不同的action调用同一个拦截器。
web.xml文件需要在WebContent下的WEB-INF文件夹下创建,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
右键单击项目名称,然后单击“Export”>“WAR File”以创建WAR文件。然后在Tomcat的webapps目录中部署WAR文件。最后,启动Tomcat服务器并尝试访问URL http://localhost:8080/HelloWorldStruts2/index.jsp。将显示如下图片:
现在,在给的定文本框中输入任意单词,然后单击Say Hello按钮执行定义的action。如果你查看生成的日志,会在底部看到以下文本:
Pre-Processing
Inside action....
Post-Processing
上一篇: Struts2--拦截器
下一篇: springboot 实现拦截器功能