尚硅谷公开课--struts2--3--struts2中获取web资源的几种方式

寵の児 提交于 2019-12-03 19:57:02

在struts2中,可以在JavaBean类中写公用的返回值为String类型的方法来响应页面上的请求,也可以在此方法中获取web资源,如:request,application,session,parameters等。

一、与Servlet API 解耦的方式

通过ActionContext获取

步骤:

1.获取ActionContext对象

通过ActionContext.getContext()获取一个ActionContext的实例

2.获取web资源对应胡Map

此Map类型为Map<String,Object>。获取方法:

application
ActionContext.getApplication()
session
ActionContext.getSession()
parameters
ActionContext.getParameters()
request [特殊]
ActionContext.get("request")

可以看到除request外,获取方法都是get...,而对于request,struts2没有提供对应的get方法,所以使用的是get("request")。原因如下:

在视频里有对struts2源码的解释,大致意思是:

使用getSession()方法,实际上调用的是Object ActionContext.get(String key),这个key是ActionContext定义好的一个字符串,例如对于session,其值为:

public static final String SESSION = "com.opensymphony.xwork2.ActionContext.session"

但是对于request,则没有定义对应的字符串,所以也就没有提供相应的get方法。获取session等web资源其实就是获取ActionContext中对应的Map对象,所以可以使用Object ActionContextget(String key)方法来获取request对应的Map对象。也就是说获取request和获取session等web资源对应的Map对象,本质上是一样的。

这只是我能理解的部分,至于更深层次的struts2源码机制,虽然源码就在那里,但是目前我还看不懂,就先理解到这种程度吧。


3.使用获取到的Map对象的get()和put()方法获取或设置属性值

但是此操作对于parameters资源来说,获取的是一个String []类型,所以如果有名字相同的parameters,要取得特定的parameters,还需要提供一个下标值,如:


Map<String,Object> parametersMap = actionContext.getParameters();
System.out.println("patameters:"+((String[])parametersMap.get("name"))[0]);


通过实现Aware接口获取web资源

1.Action类实现session,request,application,parameters对应的Aware接口


public class TestAware implements ApplicationAware,SessionAware,ParameterAware,RequestAware

2.添加session等对应的Map属性

【其中parameters对应的是:Map<String , String[]>类型,这点要比ActionContext好一点】



private Map<String, Object> application;
private Map<String, Object> request;
private Map<String, String[]> parameters;
private Map<String, Object> session;

3.在各个接口对应的未实现方法中设置相应的属性的值



public void setApplication(Map<String, Object> application) {
		this.application = application;
	}

	public void setRequest(Map<String, Object> request) {
		this.request = request;
	}

	public void setParameters(Map<String, String[]> parameters) {
		this.parameters = parameters;
	}

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




4.在execute方法中调用每个Map的put()和get()方法


public String execute(){
		
		//1.application
		//设置一个属性
		application.put("applicationKey", "applicationValue");
		//获取一个属性
		System.out.println(application.get("date"));
		
		//2.session
		session.put("sessionKey", "sessinoValue");
		
		//3.request
		request.put("requestKey", "requestValue");
		
		//4.parameters
		System.out.println(((String [])parameters.get("name"))[0]);
		
		
		
		return "success";
	}


关于ActionContext和Aware接口的选择:

若一个 Action 类中有多个 action 方法, 且多个方法都需要使用域对象的 Map 或 parameters, 则建议使用Aware 接口的方式



二、与Servlet API 耦合的方式

使用ServletActionContext


package com.laolang.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

public class TestServletActionContextAction {

	public String execute(){
		
		//通过 ServletActionContext获取web资源
		HttpServletRequest request = ServletActionContext.getRequest();
//		HttpServletResponse response = ServletActionContext.getResponse();
//		HttpSession session = request.getSession();
		
		//向request中添加一个属性
		request.setAttribute("ServletActionContext", "ServletActionContext");
		
		return "success";
	}
}



实现ServletXXXAware接口

如RequestAware,ServletResponseAware, ServletContextAware等接口


package com.laolang.action;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;

public class TestServletAwareAction implements ServletRequestAware,
		ServletResponseAware, ServletContextAware {
	
	public String execute(){
		return "success";
	}

	public void setServletContext(ServletContext context) {
		System.out.println(context);
	}

	public void setServletResponse(HttpServletResponse response) {
		System.out.println(response);
	}

	public void setServletRequest(HttpServletRequest request) {
		System.out.println(request);
	}

}




易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!