`

struts2中获取request/session/application

阅读更多

1。访问或添加request/session/application属性

将前一篇文件中的TestAction中的代码修改为如下所示:

public class TestAction {

	public String execute() {
		ActionContext ctx = ActionContext.getContext();
		ctx.getApplication().put("app", "应用范围");// 往ServletContext里放入app
		ctx.getSession().put("ses", "session范围");// 往session里放入ses
		ctx.put("req", "request范围");// 往request里放入req
		return "success";
	}
}

 result.jsp中的代码修改为:

<body>
    ${applicationScope.app} <br>
    ${sessionScope.ses}<br>
    ${requestScope.req}<br>
 </body>

 然后访问testAction,reault.jsp页面显示的内容为:

应用范围
session范围
request范围。

在上面的程序中也可以向request/session/application添加集合对象,然后使用jstl标签<c:forEach>在jsp页面迭代,就像使用servlet和jsp编程一样的方式。

 

2。获取HttpServletRequest / HttpSession / ServletContext / HttpServletResponse对象

方式一、与Servlet解耦合的非IOC方式

获取的scope对象与容器无关,通过ActionContext获取。

public class TestAction {

	ActionContext context;
	Map<String,Object> request;
	Map<String,Object> session;
	Map<String,Object> application;
	@SuppressWarnings("unchecked")
	public String execute() throws Exception {
		context=ActionContext.getContext();
		//request= (Map)context.get("request");
		session=context.getSession();
		application=context.getApplication();
		context.put("req", "request范围");// 往request里放入req
		//request.put("req", "requst属性");//或者使用这种方式
		session.put("ses", "sesion属性");
		application.put("app", "application属性");
		return "success";
	}
}

  result.jsp中的代码修改为:

${requestScope.req}
${sessionScope.ses}
${applicationScope.app}
<h4>以下使用scope.getAttribute的形式来接受</h4>
		request:	<%=request.getAttribute("req") %><br>
		session:	<%=session.getAttribute("ses") %><br>
		application:<%=application.getAttribute("app") %><br>

 页面访问显示结果为:

requst属性 sesion属性 application属性
以下使用scope.getAttribute的形式来接受
request: requst属性
session: sesion属性
application:application属性

 ActionContext中的部分源码如下所示:

public class ActionContext  implements Serializable{
Map<String, Object> context;

	public ActionContext(Map<String, Object> context) {
		this.context = context;
	}

	public void setApplication(Map<String, Object> application) {
		put("com.opensymphony.xwork2.ActionContext.application", application);
	}

	public Map<String, Object> getApplication() {
		return ((Map) get("com.opensymphony.xwork2.ActionContext.application"));
	}

	public void setSession(Map<String, Object> session) {
		put("com.opensymphony.xwork2.ActionContext.session", session);
	}

	public Map<String, Object> getSession() {
		return ((Map) get("com.opensymphony.xwork2.ActionContext.session"));
	}

	public Object get(String key) {
		return this.context.get(key);
	}
}

分析:通过ActionContext的getContext静态方法得到ActionContext对象,然后ActionContext对象调用get方法来获取一个存储在Map中的对象。

 

方式二、与Servlet解耦合的IOC方式

实现指定接口,由struts2框架运行时注入:(在struts2框架运行时会自动注入值)

import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;

public class TestAction  implements RequestAware,SessionAware,ApplicationAware {
	Map<String, Object> request;
	Map<String, Object> session;
	Map<String, Object> application;
	public String execute() throws Exception {
		request.put("req", "requst属性");
		session.put("ses", "sesion属性");
		application.put("app", "application属性");
		return "success";
	}
	public void setRequest(Map<String, Object> request) {
		System.out.println("request:" + request.getClass().getName());
		this.request=request;
	}
	public void setSession(Map<String, Object> session) {
		System.out.println("session:" + session.getClass().getName());
		this.session=session;
	}
	public void setApplication(Map<String, Object> application) {
		System.out.println("application:" + application.getClass().getName());
		this.application=application;
	}
}

当访问testAction时,控制台打印出的信息如下所示:

application:org.apache.struts2.dispatcher.ApplicationMap
session:org.apache.struts2.dispatcher.SessionMap
request:org.apache.struts2.dispatcher.RequestMa

 RequestAware接口的源码如下所示:其他接口的源码类似。

public  interface RequestAware
{
  public abstract void setRequest(Map<String, Object> paramMap);
}

 

方式三、与Servlet耦合的非IOC方式

通过ServletActionContext.类直接获取:

public class TestAction {
	HttpServletRequest request;
	HttpSession session;
	ServletContext application;

	public String execute() throws Exception {
		request = ServletActionContext.getRequest();
		session = request.getSession();
		application = ServletActionContext.getServletContext();

		request.setAttribute("req", "requst属性");
		session.setAttribute("ses", "sesion属性");
		application.setAttribute("app", "application属性");
		return "success";
	}
}

 

 方式四、与Servlet耦合的IOC方式

实现指定接口,由struts2框架运行时注入:(在struts2框架运行时会自动注入值)

public class TestAction implements ServletRequestAware,ServletResponseAware,ServletContextAware{
	private ActionContext context;
	private HttpServletRequest request;
	private HttpServletResponse response;

	HttpSession session;
	ServletContext application;
	public String execute() throws Exception {
		context=ActionContext.getContext();
		session=request.getSession();	
		request.setAttribute("req", "requst属性");
		session.setAttribute("ses", "sesion属性");
		application.setAttribute("app", "application属性");
		return "success";
	}
	
	public void setServletRequest(HttpServletRequest request) {
		System.out.println("HttpServletRequest测试:"+request);
		this.request=request;
	}
	public void setServletContext(ServletContext application) {
		System.out.println("ServletContext测试:"+application);
		this.application=application;
	}
	
	public void setServletResponse(HttpServletResponse response) {
		System.out.println("HttpServletResponse测试:"+ response);
		this.response=response;
	}
}

 在访问此action时,控制台打印的信息如下所示:

HttpServletRequest测试:org.apache.struts2.dispatcher.StrutsRequestWrapper@1acfa31
HttpServletResponse测试:org.apache.catalina.connector.ResponseFacade@15dd910
ServletContext测试:org.apache.catalina.core.ApplicationContextFacade@47a0d4

  ServletRequestAware的接口源码如下所示:

public  interface ServletRequestAware
{
  public abstract void setServletRequest(HttpServletRequest paramHttpServletRequest);
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics