一。
在struts2中,request和session都被隐藏了
struts提供两种方式访问session和request,其中比较常用的是利用SPRING里面所说的IOC即控制反转
IOC方式:
action类实现ServletRequestAware接口,并新建一个HttpServletRequest request
public class UserLoginAction extends ActionSupport implements
ServletRequestAware {
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}
然后可以生成的request得到对象,如request.getRemoteAddr()
action类实现SessionAware接口,并创建一个MAP对象session
public class UserLoginAction extends ActionSupport implements
ServletRequestAware, SessionAware {
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public void setSession(Map session) {
this.session = session;
}
}
非IOC方式
这种方式主要是利用了com.opensymphony.xwork2.ActionContext类以及org.apache.struts2.ServletActionContext类,具体的方法如下所示。
获得request对象:
//A.
HttpServletRequest request = ServletActionContext.getRequest ();
//B.
ActionContext ct= ActionContext.getContext()
HttpServletRequest request=
(HttpServletRequest)ct.get(ServletActionContext. HTTP_REQUEST );
获得session对象:
在Struts2中底层的session都被封装成了Map类型,我们称之为SessionMap,而平常我们所说的session则是指HttpSession对象,具体的获得方法如下所示。
//A.
Map session=ActionContext.getSession();
//B.
Map session=(Map)ActionContext.getContext().get(ActionContext.SESSION);
得到这个SessionMap之后我们就可以对session进行读写了,如果我们想得到原始的HttpSession可以首先得到 HttpServletRequest对象,然后通过request.getSession()来取得原始的HttpSession对象。一般情况下 SessionMap已经可以完成所有的工作,我们不必再去碰底层的session了。
二。
非IoC方式
要获得上述对象,关键Struts 2 .0中com.opensymphony.xwork2 .ActionContext类。我们可以通过它的静态方法getContext()获取当前 Action的上下文对象。 另外,org.apache.struts 2 .ServletActionContext作为辅助类(Helper Class),可以帮助您快捷地获得这几个对象。
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
如果你只是想访问session 的属性(Attribute),你也可以通过ActionContext.getContext().getSession()获取或添加session 范围(Scoped)的对象。
例6 classes/tutorial/NonIoCServlet.java
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class NonIoCServlet extends ActionSupport {
private String message;
public String getMessage() {
return message;
}
@Override
public String execute() {
ActionContext.getContext().getSession().put("msg",
"Hello World from Session!");
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
StringBuffer sb = new StringBuffer("Message from request: ");
sb.append(request.getParameter("msg"));
sb.append("<br>Response Buffer Size: ");
sb.append(response.getBufferSize());
sb.append("<br>Session ID: ");
sb.append(session.getId());
message = sb.toString();
return SUCCESS;
}
}
例6 classes/tutorial/IoCServlet.java
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class IoCServlet extends ActionSupport implements SessionAware,
ServletRequestAware, ServletResponseAware {
private String message;
private Map att;
private HttpServletRequest request;
private HttpServletResponse response;
public String getMessage() {
return message;
}
public void setSession(Map att) {
this.att = att;
}
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
@Override
public String execute() {
att.put("msg", "Hello World from Session!");
HttpSession session = request.getSession();
StringBuffer sb = new StringBuffer("Message from request: ");
sb.append(request.getParameter("msg"));
sb.append("<br>Response Buffer Size: ");
sb.append(response.getBufferSize());
sb.append("<br>Session ID: ");
sb.append(session.getId());
message = sb.toString();
return SUCCESS;
}
}
例6 Servlet.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<h2>
<s:property value="message" escape="false"/>
<br>Message from session: <s:property value="#session.msg"/>
</h2>
</body>
</html>
例6 classes/struts .xml中NonIocServlet和IoCServlet Action的配置
<action name="NonIoCServlet" class="tutorial.NonIoCServlet"> <result>/Servlet.jsp</result> </action> <action name="IoCServlet" class="tutorial.IoCServlet"> <result>/Servlet.jsp</result> </action>
运行Tomcat,在浏览器地址栏中键入http://localhost:8080/Struts 2 _Action/NonIoCServlet.action?msg=Hello%2 0World! 或http://localhost:8080/Struts 2 _Action/IoCServlet.action?msg=Hello%2 0World!,出现如图7所示页面。
在Servlet.jsp中,我用了两次property标志,第一次将escape设为false为了在JSP中输出<br>转 行,第二次的value中的OGNL为“#session .msg”,它的作用与session .getAttribute("msg")等同。
三。
通过com.opensymphony.xwork2.ActionContext取
如先获取request
HttpServletRequest request = (HttpServletRequest)ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);
那么取session就和struts1一样了
HttpSession session = request.getSession();
操作都一样的
另外在action 内往session中保存数据,可以直接用下面的方法:
ActionContext.getContext().getSession().put(key, value)
key object型
value object型
四。ActionContext
public static ActionContext getContext() //:获得当前Action的ActionContext实例。
public Object get(Object key) //:此方法类似于调用HttpServletRequest的getAttribute(String name)方法。
public void put(Object key, Object value)// :此方法类似于调用HttpServletRequest 的setAttribute(String name, Object o)。
public Map getParameters() //:获取所有的请求参数。类似于调用HttpServletRequest对象的getParameterMap() 方法。
public Map getSession() //:返回一个Map对象,该Map对象模拟了HttpSession实例。
public void setSession(Map session)// : 直接传入一个Map实例,将该Map实例里的key-value对转换成session的属性名-属性值对。
public Map getApplication()// :返回一个Map对象,该对象模拟了该应用的ServletContext实例。
public void setApplication(Map application) // :直接传入一个Map实例,将该Map实例里的key-value对转换成application的属性名-属性值对。
Struts2 中通过ActionContext来访问Servlet API,让Action彻底从Servlet API 中分离出来,最大的好处就是可以脱离Web容器测试Action。