在Struts2的Action类中,有时需要操作 request对象(HttpServletRequest),session对象(HttpSession),aplication对象(ServletContext),也就是操作ServletApi。本文主要介绍三种操作ServletApi的方式。
一:通过 ActionContext 操作ServletApi
在Struts2的Action类中可以直接获取ActionContext,通过ActionContext间接操作ServletApi
先介绍下ActionContext的主要方法:
static ActionContext getContext():静态方法,获取系统的ActionContext实例;
void put(String key,Object value) //设置HttpServletRequest中key的值为value;
public Object get(Object key) //取得HttpServletRequest中key的值;
void setSession(Map session):直接传入一个Map实例,将该Map实例里的key-value对转换为session的属性名和属性值;
public Map getSession():获取封装了HttpSession的Map对象;
void setApplication(Map application):设置ServletContext实例;
public Map getApplication():获取封装了ServletContext的Map对象;
Map getParameters():类似于HttpServletRequest中的getParametersMap方法;
具体测试代码如下:
jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>表单页面</title>
</head>
<body>
<form action="./User_check.do">
用户名:<input type="text" name="useName"><span>${useNameError}</span><br />
密码:<input type="password" name="password"><span>${passWordError}</span><br />
<input type="submit" value="提交">
</form>
</body>
</html>
struts.xml
<struts>
<package name="user" namespace="/" extends="struts-default">
<!-- 解决struts2.5 通配符调用无效的问题 -->
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="*_*" class="com.lhb.StrutsText.{1}" method="{2}">
<result name="success">/success.jsp</result>
<result name="input">/user_login.jsp</result>
</action>
</package>
</struts>
action
package com.lhb.StrutsText;
import org.apache.log4j.Logger;
import com.lhb.StrutsText.model.UserBean;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class User extends ActionSupport implements ModelDriven<UserBean> {
private static Logger log = Logger.getLogger(User.class);
private UserBean user = new UserBean();// 手动实例化
private ActionContext actionContext = null;
@Override
public UserBean getModel() {
// TODO Auto-generated method stub
return user;
}
public String check() {
// 获取ActionContext实例
actionContext = ActionContext.getContext();
if (!"admin".equals(user.getUseName())) {
actionContext.put("useNameError", "用户名错误!");
return INPUT;
} else if (!"123".equals(user.getPassword())) {
actionContext.put("passWordError", "密码错误!");
return INPUT;
}
return SUCCESS;
}
}
注意:获取ActionContext实例必须在本Action类的构造方法运行之后执行。因为ActionContext包含本Action类对象。具体解释请参照博文Ognl详解。
访问执行如下路径:http://localhost:8080/StrutsText/user_login.jsp并提交数据
运行结果:
测试成功!
二:实现 RequestAware,SessionAware,ApplicationAware 接口操作ServletApi
上述事例,虽然能操作ServletApi,但因为代码稍微复杂,所以并不常用。
测试代码如下:
action代码改为:
package com.lhb.StrutsText;
import java.util.Map;
import org.apache.log4j.Logger;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
import com.lhb.StrutsText.model.UserBean;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class User extends ActionSupport implements ModelDriven<UserBean>, RequestAware, SessionAware, ApplicationAware {
private static Logger log = Logger.getLogger(User.class);
private UserBean user = new UserBean();// 手动实例化
private Map<String, Object> requestMap;
private Map<String, Object> sessionMap;
private Map<String, Object> applictionMap;
@Override
public UserBean getModel() {
return user;
}
@Override
public void setApplication(Map<String, Object> appliction) {
applictionMap = appliction;
}
@Override
public void setSession(Map<String, Object> session) {
sessionMap = session;
}
@Override
public void setRequest(Map<String, Object> request) {
requestMap = request;
}
public String check() {
if (!"admin".equals(user.getUseName())) {
requestMap.put("useNameError", "用户名错误!");
return INPUT;
} else if (!"123".equals(user.getPassword())) {
requestMap.put("passWordError", "密码错误!");
return INPUT;
}
return SUCCESS;
}
}
访问执行如下路径:http://localhost:8080/StrutsText/user_login.jsp并提交数据
运行结果:
测试成功!
因为,这个操作
ServletApi的方式是通过Map间接操作,能够很好降低Struts2和页面的耦合,所以使用较为频繁。
三:通过ServletActionContext直接获取ServletApi
除了上述两种方式可以间接操作ServletApi之外,也可以直接操作ServletApi
action代码改为:
package com.lhb.StrutsText;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import com.lhb.StrutsText.model.UserBean;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class User extends ActionSupport implements ModelDriven<UserBean> {
private static Logger log = Logger.getLogger(User.class);
private UserBean user = new UserBean();// 手动实例化
private HttpServletRequest request = ServletActionContext.getRequest();
private HttpSession session = request.getSession();
private ServletContext appliction = request.getServletContext();
@Override
public UserBean getModel() {
return user;
}
public String check() {
if (!"admin".equals(user.getUseName())) {
request.setAttribute("useNameError", "用户名错误!");
return INPUT;
} else if (!"123".equals(user.getPassword())) {
request.setAttribute("passWordError", "密码错误!");
return INPUT;
}
return SUCCESS;
}
}
访问执行如下路径:http://localhost:8080/StrutsText/user_login.jsp并提交数据
运行结果:
测试成功!
当然,为了代码分层,便于管理,可以将 通过ServletActionContext获取ServletApi放进一个Action基类中。
Action基类
package com.lhb.StrutsText;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class BasicAction extends ActionSupport{
public HttpServletRequest request;
public HttpServletResponse response;
public HttpSession session;
public ServletContext application;
public BasicAction() {
// TODO Auto-generated constructor stub
request = ServletActionContext.getRequest();
response=ServletActionContext.getResponse();
session =request.getSession();
application=request.getServletContext();
//.........
}
}
实际运用的
Action类可以继承该基类
Action修改为
package com.lhb.StrutsText;
import org.apache.log4j.Logger;
import com.lhb.StrutsText.model.UserBean;
import com.opensymphony.xwork2.ModelDriven;
public class User extends BasicAction implements ModelDriven<UserBean> {
private static Logger log = Logger.getLogger(User.class);
private UserBean user = new UserBean();// 手动实例化
@Override
public UserBean getModel() {
return user;
}
public String check() {
if (!"admin".equals(user.getUseName())) {
request.setAttribute("useNameError", "用户名错误!");
return INPUT;
} else if (!"123".equals(user.getPassword())) {
request.setAttribute("passWordError", "密码错误!");
return INPUT;
}
return SUCCESS;
}
}
访问执行如下路径:http://localhost:8080/StrutsText/user_login.jsp并提交数据
运行结果:
测试成功!