Struts2 框架中的Action 类没有与任何Servlet API 耦合,因此Action 类可以脱离Servlet 容器环境进行单元测试。当Action 类需要通过请求、会话或上下文存取属性时,可以通过以下四种方法实现:
一、ActionContext
修改Action类,通过ActionContext 获取请求、会话和上下文对象相关联的Map 对象来实现存取属性的功能,代码片段如下:
public class UserAction extends ActionSupport {
//……
private Map request,session,application;
public String login() {
//获取ActionContext 对象
ActionContext ctx= ActionContext.getContext();
//通过ActionContext 对象获取请求、会话和上下文对象相关联的Map 对象
request=(Map) ctx.get("request");
session=(Map) ctx.getSession();
application=(Map) ctx.getApplication();
//访问application 范围的属性值
Integer counter = (Integer)application.get("counter");
if(counter==null)
counter=1;
else
counter=counter+1;
//设置application 范围的属性
application.put("counter", counter);
UserService userServ = new UserService();
if (userServ.login(loginUser)) {
//设置session 范围的属性
session.put("user", loginUser.getAccount());
//设置request 范围的属性
request.put("tip", "您已登录成功");
return "success";
}
else
{
return "fail";
}
}
}
二、接口:RequestAware、SessionAware和ApplicationAware
修改Action类,通过实现Struts 提供的接口:RequestAware、SessionAware和ApplicationAware,获取请求、会话和上下文对象相关联的Map 对象来实现存取属性的功能,代码片段如下:
public class UserAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
//……
private Map request,session,application;
public void setRequest(Map<String, Object> request) {
this.request=request;
}
public void setSession(Map<String, Object> session) {
this.session=session;
}
public void setApplication(Map<String, Object> application) {
this.application=application;
}
public String login() {
Integer counter = (Integer)application.get("counter");
if(counter==null)
counter=1;
else
counter=counter+1;
application.put("counter", counter);
UserService userServ = new UserService();
if (userServ.login(loginUser)) {
session.put("user", loginUser.getAccount());
request.put("tip", "您已登录成功");
return "success";
}
else {
return "fail";
}
}
}
三、接口:ServletContextAware、ServletRequestAware和ServletResponseAware
修改Action类,通过接口:ServletContextAware、ServletRequestAware、
ServletResponseAware 直接访问Servlet API,代码片段如下:
public class UserAction extends ActionSupport implements ServletContextAware,ServletRequestAware,ServletResponseAware{
//……
private ServletContext application; // Servlet上下文
private HttpServletRequest request; // request对象
private HttpServletResponse response; // response对象
public void setServletRequest(HttpServletRequest request) {
this.request=request;
}
public void setServletResponse(HttpServletResponse response) {
this.response=response;
}
public void setServletContext(ServletContext application) {
this.application=application;
}
public String login() {
HttpSession session=request.getSession();
Integer counter = (Integer)application.get("counter");
if(counter==null)
counter=1;
else
counter=counter+1;
application.put("counter", counter);
UserService userServ = new UserService();
if (userServ.login(loginUser)) {
session.put("user", loginUser.getAccount());
request.put("tip", "您已登录成功");
return "success";
}
else {
return "fail";
}
}
}
四、ServletActionContext 工具类
通过ServletActionContext 工具类直接访问Servlet API,代码片段如下:
public class UserAction extends ActionSupport{
//……
public String login() {
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
ServletContext application = ServletActionContext.getServletContext();
HttpSession session=request.getSession();
Integer counter = (Integer)application.get("counter");
if(counter==null)
counter=1;
else
counter=counter+1;
application.put("counter", counter);
UserService userServ = new UserService();
if (userServ.login(loginUser)) {
session.put("user", loginUser.getAccount());
request.put("tip", "您已登录成功");
return "success";
}
else {
return "fail";
}
}
}
测试代码:
<body>
本站访问次数为:
<s:property value="#application.counter" />
<br>
<s:property value="#session.user" />,
<s:property value="#request.tip" />
</body>
运行结果:
以上四种方法中,前两种可以保持Action 与Servlet API 的解耦,后两种Action 将与Servlet API 直接耦合。