Struts2之Action接收请求参数和拦截器详解
本文主要介绍了如何在Struts2中使用Action来接收请求参数,并通过拦截器对Action进行增强。
Action接收请求参数
在Struts2中,我们可以通过Action来获取请求中的参数。
获取参数的方式
-
直接在Action的成员变量中声明参数,并提供setter方法,Struts2会自动为我们注入参数值。
```java
public class LoginAction extends ActionSupport {
private String username;
private String password;public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } // 处理登录请求的方法 public String login() { // 登录逻辑代码 return SUCCESS; }
}
``` -
在Action中声明与请求参数同名的方法,并提供参数类型为String的参数。
```java
public class LoginAction extends ActionSupport {
private String username;
private String password;public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } // 处理登录请求的方法 public String login() { // 登录逻辑代码 return SUCCESS; }
}
```
参数传递的方式
在Struts2中,参数可以通过两种方式传递给Action:URL传参和表单提交。
URL传参
在URL中传递参数时,参数名和参数值要放在URL的问号后面,并以“参数名=参数值”的形式拼接,多个参数之间用“&”隔开。
例如:
http://localhost:8080/login.action?username=admin&password=123456
表单提交
在表单中提交参数时,参数名和参数值会被封装成一个Map对象,通过HttpServletRequest的getParameterMap()方法可以获取该Map对象。参数名就是Map的键,参数值是一个字符串数组,可以通过数组下标获取。
例如:
<form action="login.action" method="post">
<label for="username">用户名:</label>
<input type="text" id="username" name="username"><br>
<label for="password">密码:</label>
<input type="password" id="password" name="password"><br>
<input type="submit" value="登录">
</form>
经过表单提交后,Action中需要添加一个处理请求的方法,该方法的命名需要与表单中的"action"属性一致,并使用@org.apache.struts2.convention.annotation.Action标注。
import org.apache.struts2.convention.annotation.Action;
public class LoginAction extends ActionSupport {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
// 处理表单提交请求的方法
@Action(value = "login")
public String execute() {
// 登录逻辑代码
return SUCCESS;
}
}
示例
示例一:直接在Action中声明参数
下面是一个简单的示例,展示了如何在Action中接收请求参数。
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private String username;
private String password;
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public String login() {
System.out.println("username: " + username + ", password: " + password);
return SUCCESS;
}
}
在上面的代码中,我们声明了两个成员变量"username"和"password",并提供了setter方法,用于接收请求中的参数。在"login"方法中,我们打印了接收到的参数值。
接下来,我们在XML配置文件中配置该Action:
<struts>
<package name="default" extends="struts-default">
<action name="user" class="com.example.UserAction">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
然后,在浏览器地址栏中输入以下URL:
http://localhost:8080/user!login.action?username=admin&password=123456
可以看到,在控制台中输出了以下内容:
username: admin, password: 123456
示例二:在Action中声明与请求参数同名的方法
下面是一个示例,展示了如何在Action中声明与请求参数同名的方法,用于接收参数。
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String login() {
System.out.println("username: " + getUsername() + ", password: " + getPassword());
return SUCCESS;
}
}
在上面的代码中,我们没有在成员变量中声明参数,而是声明了与请求参数同名的getter和setter方法。
接下来,我们同样需要在XML配置文件中配置该Action:
<struts>
<package name="default" extends="struts-default">
<action name="user" class="com.example.UserAction">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
最后,我们在表单中提交请求:
<form action="user!login.action" method="post">
<label for="username">用户名:</label>
<input type="text" id="username" name="username"><br>
<label for="password">密码:</label>
<input type="password" id="password" name="password"><br>
<input type="submit" value="登录">
</form>
在浏览器中输入以下URL:
http://localhost:8080/user!login.action
在表单中输入用户名和密码,点击登录后,可以在控制台中看到以下内容:
username: admin, password: 123456
拦截器详解
Struts2的拦截器与Servlet的Filter类似,可以对请求进行过滤和增强,还可以对异常进行捕获和处理。
拦截器类
Struts2中的拦截器是一个Java类,继承自com.opensymphony.xwork2.interceptor.Interceptor接口,必须要实现其抽象方法。
/package com.example.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class MyInterceptor implements Interceptor {
@Override
public void init() {
// 初始化代码
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// 前置代码
String result = invocation.invoke(); // 调用Action的方法
// 后置代码
return result;
}
@Override
public void destroy() {
// 销毁代码
}
}
在上面的代码中,我们实现了Interceptor接口,并重写了init()、intercept()和destroy()方法。
- init()方法是拦截器初始化方法,用于初始化拦截器;
- intercept()方法是拦截器的核心方法,用于对请求进行过滤和增强。通过ActionInvocation类的invoke()方法可以调用下一个拦截器,或者调用Action的方法(注意,这里如果不调用Action的方法,后面的拦截器也将不会被执行),并返回一个字符串类型的结果,该结果会被Struts2框架用于选择相应的结果视图;
- destroy()方法是拦截器销毁方法,用于销毁拦截器。
在Struts2中配置拦截器
要在Struts2中使用拦截器,需要将拦截器配置在XML配置文件中。
<struts>
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="myInterceptor" class="com.example.interceptor.MyInterceptor"/>
</interceptors>
<default-interceptor-ref name="myInterceptor"/> <!-- 默认拦截器 -->
<action name="user" class="com.example.action.UserAction">
// 配置拦截器
<interceptor-ref name="myInterceptor1"/>
<interceptor-ref name="myInterceptor2"/>
<interceptor-ref name="myInterceptor3"/>
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
在上面的代码中,我们首先在interceptors标签中定义了一个名称为"myInterceptor"的拦截器。然后,在default-interceptor-ref标签中,我们将该拦截器设置为默认拦截器。这意味着,在没有明确指定拦截器的情况下,所有的Action都将使用该拦截器。
在action标签中,我们配置了三个拦截器:myInterceptor1、myInterceptor2和myInterceptor3。它们的调用顺序是按照声明的顺序,即如果myInterceptor1执行成功,则调用myInterceptor2,如果myInterceptor2执行成功,则调用myInterceptor3。如果其中任何一个拦截器执行失败,则直接返回。
示例
下面是一个示例,展示了如何使用拦截器来统计Action方法的执行时间。
/package com.example.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class TimerInterceptor implements Interceptor {
private static final long serialVersionUID = 1L;
@Override
public void init() {}
@Override
public void destroy() {}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
String timerName = invocation.getAction().getClass().getName() + "." + invocation.getProxy().getMethod();
long startTime = System.currentTimeMillis();
String result = invocation.invoke();
long endTime = System.currentTimeMillis();
long executeTime = endTime - startTime;
System.out.println(timerName + ": " + executeTime + "ms");
return result;
}
}
在上面的代码中,我们实现了一个计时器拦截器,用于统计Action方法的执行时间。在intercept()方法中,我们首先通过ActionInvocation的getAction()方法获取Action的实例,然后通过getProxy()方法获取当前的代理,再通过getMethod()方法获取当前执行的方法名。我们将获取到的方法名作为计时器的名称。
接下来,我们记录当前的系统时间,调用Action的方法,再获取一次当前的系统时间,并计算出方法执行的时间。最后,我们将计时器的名称和执行时间打印到控制台上。
接下来,我们在XML配置文件中配置该拦截器:
<struts>
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="timerInterceptor" class="com.example.interceptor.TimerInterceptor"/>
</interceptors>
<default-interceptor-ref name="timerInterceptor"/>
<action name="user" class="com.example.action.UserAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
在上面的代码中,我们定义了一个名称为"timerInterceptor"的拦截器,在default-interceptor-ref标签中将该拦截器设置为默认拦截器。这意味着,在没有明确指定拦截器的情况下,所有的Action都将使用该拦截器。
最后,我们使用以下地址访问Action方法:
http://localhost:8080/user.action
在控制台中可以看到以下内容:
com.example.action.UserAction.execute: 2896ms
表示执行时间为2.896秒。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Struts2之Action接收请求参数和拦截器详解 - Python技术站