读书人

透过ActionContext类访问Servlet对象

发布时间: 2012-09-11 10:49:04 作者: rapoo

通过ActionContext类访问Servlet对象

?ActionContext类位于com.opensymphony.xwork2中,提供一系列相关方法用于访问保存在ServletContext、HttpSession、HttpServletRequest中的信息,并且存储在Map中。需要注意的是,该类并没有提供获取ServletContext、HttpSession、HttpServletRequest等对象的方法。ActionContext类的常用方法见下表:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head>??? <title>My JSP 'session.jsp' starting page</title></head><body>??? ${id }<br>??? ${name }</body></html>??? 请求参数通过表单页面idname.jsp提供。代码清单34idname.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head>??? <title>My JSP 'idname.jsp' starting page</title></head><body>??? <form action="servletAction.action" method="post">??? ??? ID:<input name="id"><br>??? ??? Name:<input name="name"><br>??? ??? <input type="submit" value="提交">??? </form></body></html>??? 通过http://localhost:8081/Struts2Demo/idname.jsp地址访问即可,图24是表单输入效果,图25是表单提交后将请求发送给Action,最后显示在session.jsp中的效果:透过ActionContext类访问Servlet对象??? (图24)透过ActionContext类访问Servlet对象??? (图25)??? ActionContext类是xwork提供的,struts2定义了一个新类org.apache.struts2. ServletActionContext,该类继承自ActionContext:代码清单35ServletActionContext.java的定义public class ServletActionContext extends ActionContext implements StrutsStatics {}??? ServletActionContext类和ActionContext相比扩展了更多的方法,主要是一些静态方法,该类的源代码如下:代码清单36ServletActionContext.java的完整定义public class ServletActionContext extends ActionContext implements StrutsStatics {??? private static final long serialVersionUID = -666854718275106687L;??? public static final String STRUTS_VALUESTACK_KEY = "struts.valueStack";??? public static final String ACTION_MAPPING = "struts.actionMapping";??? @SuppressWarnings("unused")??? private ServletActionContext(Map context) {??????? super(context);??? }??? public static ActionContext getActionContext(HttpServletRequest req) {??????? ValueStack vs = getValueStack(req);??????? if (vs != null) {??????????? return new ActionContext(vs.getContext());??????? } else {??????????? return null;??????? }??? }??? public static ValueStack getValueStack(HttpServletRequest req) {??????? return (ValueStack) req.getAttribute(STRUTS_VALUESTACK_KEY);??? }??? public static ActionMapping getActionMapping() {??????? return (ActionMapping) ActionContext.getContext().get(ACTION_MAPPING);??? }??? public static PageContext getPageContext() {??????? return (PageContext) ActionContext.getContext().get(PAGE_CONTEXT);??? }??? public static void setRequest(HttpServletRequest request) {??????? ActionContext.getContext().put(HTTP_REQUEST, request);??? }??? public static HttpServletRequest getRequest() {??????? return (HttpServletRequest) ActionContext.getContext().get(HTTP_REQUEST);??? }??? public static void setResponse(HttpServletResponse response) {??????? ActionContext.getContext().put(HTTP_RESPONSE, response);??? }??? public static HttpServletResponse getResponse() {?? ?????return (HttpServletResponse) ActionContext.getContext().get(HTTP_RESPONSE);??? }??? public static ServletContext getServletContext() {??????? return (ServletContext) ActionContext.getContext().get(SERVLET_CONTEXT);??? }??? public static void setServletContext(ServletContext servletContext) {??????? ActionContext.getContext().put(SERVLET_CONTEXT, servletContext);??? }}??? 注意粗体部分,getPageContext()方法返回PageContext的引用,getRequest()方法返回HttpServletRequest的引用,getResponse()方法返回HttpServletResponse的引用,getServletContext()方法返回ServletContext的引用。我们将代码清单31修改成代码清单37所示:代码清单37ServletAction.java的修改版public class ServletAction {??? public String execute(){?????? String id = ServletActionContext.getRequest().getParameter("id");?????? String name = ServletActionContext.getRequest().getParameter("name");???????????? Map sessionMap = ServletActionContext.getContext().getSession();?????? sessionMap.put("id", id);?????? sessionMap.put("name", name);???????????? System.out.println("id=" + sessionMap.get("id"));?????? System.out.println("name=" + sessionMap.get("name"));?????? return "toSession";??? }}3.3.2 通过IOC访问Servlet对象??? 在Struts2中,可以通过IOC(依赖注入)将Servlet对象注入到Action中,这一切都是由一组接口决定的,这一组接口有一个共同点,名称都由Aware结尾。以下是这些接口的解释说明:

?????? <result name="toSession">/session.jsp</result></action>

??? 可以看出,不需要做其他额外的配置。

转http://hi.baidu.com/%C6%C6%D4%C6%B5%B6/blog/item/93be0c2240178cf6d6cae26f.html

读书人网 >软件架构设计

热点推荐