Struts2与Servlet解耦

本文详细介绍了Struts2如何通过封装HttpServletRequest、HttpSession和ServletContext对象,避免与ServletAPI耦合,方便Action进行单元测试。具体包括通过ServletActionContext类直接获取这些对象,以及实现特定接口由Struts框架运行时注入。此外,还展示了如何访问request、session、application对象中的属性,并提供了JSP页面展示实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

与Servlet API解耦的访问方式

为了避免与 Servlet API 耦合在一起, 方便 Action 单元测试,Struts2 HttpServletRequest, HttpSessionServletContext进行了封装, 构造了 3 Map 对象来替代这 3 个对象, Action 中可以直接使用 HttpServletRequest, HttpSession, ServletContext对应的 Map 对象来保存和读取数据.

访问request/session/application对象

方法一:通过ServletActionContext类直接获取

ActionContextAction 执行的上下文对象, ActionContext中保存了Action 执行所需要的所有对象, 包括parameters, request, session,application .

获取HttpServletRequest对应的Map 对象:

public Object get(Object key): ActionContext类中没有提供类似getRequest() 这样的方法来获取HttpServletRequest对应的Map 对象. 要得到HttpServletRequest对应的Map 对象, 可以通过为 get() 方法传递 “request” 参数实现

获取HttpSession对应的Map 对象

public Map getSession()

获取ServletContext对应的Map 对象:

public Map getApplication()

publicString test(){

HttpServletRequestrequest=ServletActionContext.getRequest();

HttpServletResponse response=ServletActionContext.getResponse();

HttpSession session=request.getSession();

ServletContextservletContext=ServletActionContext.getServletContext();

return"success";

 }

如果你只是想访问session的属性(Attribute),

你也可以通过ActionContext.getContext().getSession()获取

	@Override
	public String execute() throws Exception {
		HttpServletRequest request=ServletActionContext.getRequest();
		HttpServletResponse response=ServletActionContext.getResponse();
		Map  sessionMap=ServletActionContext.getContext().getSession();
		ServletContext sc=ServletActionContext.getServletContext();
		request.setAttribute("username", "username_request");
		sessionMap.put("username", "username_session");
		sc.setAttribute("username", "username_application");
		System.err.println("ssssssssssss");
		return "attr";
	}


方法二:实现指定接口,由struts框架运行时注入:

Action类通过可以实现某些特定的接口, Struts2 框架在运行时向 Action 实例注入parameters, request, session application 对应的 Map 对象:


importorg.apache.struts2.interceptor.ServletRequestAware;

importorg.apache.struts2.interceptor.ServletResponseAware;

importorg.apache.struts2.interceptor.SessionAware;

importorg.apache.struts2.util.ServletContextAware;


publicclass ContextAction02 extendsActionSupport  implementsServletRequestAware,

                                                          ServletResponseAware,ServletContextAware,SessionAware {

privateHttpServletRequestrequest;

privateServletContextservletContext;

privateHttpServletResponseresponse;

privateMap<String, Object> session;

publicString test(){

System.out.println(" request  "+request);

System.out.println(" servletContext "+servletContext);

System.out.println(" response  "+response);

System.out.println(" session  "+session);

       return "success"; }

publicvoidsetServletRequest(HttpServletRequest request) {

   this.request=request;}

publicvoidsetServletResponse(HttpServletResponse response) {

   this.response=response;}

publicvoidsetServletContext(ServletContext context) {

    this.servletContext=context;}

publicvoidsetSession(Map<String, Object> session){

       this.session=session;}

}

public class ContextAction02 extends ActionSupport 
	implements ServletRequestAware, ServletResponseAware, ServletContextAware, SessionAware{

	HttpServletRequest request;
	
	HttpServletResponse response;
	
	Map sessionMap;
	
	ServletContext sc;
	
	public String test(){
		System.out.println("ContextAction *********** test()");
		
		request.setAttribute("username", "username_request");
		
		sessionMap.put("username", "username_session");
		
		sc.setAttribute("username", "username_application");
		
		
		return "attr";
	}

	public void setSession(Map<String, Object> session) {
		this.sessionMap = session;
		
	}

	public void setServletContext(ServletContext context) {
		this.sc = context;
		
	}

	public void setServletResponse(HttpServletResponse response) {
		this.response = response;
		
	}

	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
		
	}
	
}


访问request/session/application对象中的属性

Action

publicclassContextActionAttrextendsActionSupport {

    publicString test(){

          ServletActionContext.getServletContext().setAttribute("username", "username_servletContext");

          ServletActionContext.getRequest().setAttribute("username", "username_requst");

          ServletActionContext.getContext().getSession().put("username", "username_sesson");

    return"attr";

 }

}

JSP页面:

 <body>

    ${applicationScope.username} <br>

    ${sessionScope.username}<br>

    ${requestScope.username}<br>

 </body>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值