Struts2学习计划(三)——获取web资源的四种方式

这四种里面主要就是两个大类:与Servlet API 耦合 及 与其不耦合

第一种(不耦合)ActionContext

PS:ActionContext是Action对象的上下文对象 ,可以从中获取当前action需要的一切信息

获取ActionContext

ActionContext actionContext= ActionContext.getContext();

而我们最常用的几种对象也就是这样即可获得到

获取application对应的map,并向其中添加属性

Map<String,Object> applicationMap = actionContext.getApplication();
// 获取application参数的值
String date = applicationMap.get("date") + "";
System.out.println(date);
System.out.println("testActionContext");
System.out.println("testAware");
// 设置applicationMap属性的值
applicationMap.put("applicationKey", "applicationValue");

同样,seession也就是这样获取的

Map<String,Object> sessionMap = actionContext.getSession();
		sessionMap.put("sessionKey", "sessionValue");
		String sessionGGG = sessionMap.get("ggg")+"";
		System.out.println(sessionGGG);

但是,request就有所不同了

//ActionContext 中并没有提供getRequest方法来获取request对应的Map方法
		//需要手工调用get()方法,传入request字符串来获取
		
		Map<String,Object> requestMap = (Map<String, Object>) actionContext.get("request");
		requestMap.put("requestKey", "requestValue");

paramenters的获取以及使用

// 4.获取请求参数对应的Map,并获取指定的参数值
		// 键:请求参数的名字   值:请求参数的值对应的字符串数组
		// 注意:1.getParameters 的返回值在Map<String,Object> 而不是 Map<String,String[]>
		//		2.paramenters 这个Map只能读,不能写入数据,如果写入不出错但是也无作用
		Map<String,Object> params = actionContext.getParameters();
		System.out.println(((String[])params.get("name"))[0]);

第二种(不耦合)实现XxxAware接口

一般在使用中会使用ApplicationAware, SessionAware, ParameterAware, RequestAware这四种接口,但是这个有一个很大的缺点,就是有些参数不能直接获取例如:getRelpath()

PS:在实现该接口的同时,会被要求实现一些方法,这个时候, 如果我们需要去调用这些接口产生的参数的时候,我们就需要在成员变量的位置上增加相对应的成员变量,并且在方法中,进行相对应的赋值.

PS:如果是session类型的对象怎么使他变得失效:先强转为SessionMap的形式,然后再调用invalidate()方法

 package com.struts.action;

import java.util.Map;

import javax.swing.plaf.synth.SynthScrollBarUI;

import org.apache.struts2.dispatcher.SessionMap;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;

public class TestAwareAction implements ApplicationAware, SessionAware, ParameterAware, RequestAware {
	/**
	 * 实现XxxxAware接口
	 * 
	 * @return
	 */
	// 实现AwareApplication接口所需要的
	private Map<String, Object> application;

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

	public String execute() {
		application.put("applicationKey2", "applicationValue2");
		System.out.println(application.get("date"));

		session.put("sessionKey2", "sessionValue2");
		System.out.println(session.getClass());
		// session对应的Map 实际上是SessionMap类型的,强转后调用invalidate()方法,可以是session失效
		if (session instanceof SessionMap) {
			SessionMap sm = (SessionMap) session;
			sm.invalidate();
			System.out.println("session失效了");
		}
		return "SUCCESS";
	}

	// 主要就是实现了这个接口来实现着一些功能
	private Map<String, String[]> parameters;

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

	//使用session技术将数据可以储存在session中,被jsp页面所使用调用
	private Map<String, Object> session; 
	

	
	//这里是使用的依赖注入的原理 ,具体则是struts2 在内部使用了spring的依赖注入原理 b
	@Override
	public void setSession(Map<String, Object> arg0) {
		this.session = arg0;
	}

	private Map<String, Object> request;

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

}

第三种(耦合)ServletActionContext

**这个时候已经在使用Servlet的原声API,大体上和第一种有点相似,但是这个是Servlet 的API 相关的 **

package com.struts.action;

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

import org.apache.struts2.ServletActionContext;

public class TestServletActionContextAction {
	
	
	public String execute(){
		
		
		/**
		 * ServletActionContext : 可以从中获取到当前action
		 * 常用的方法:
		 * 1.获取HttpServletRequest : ServletActionContext.getRequest()
		 * 2.获取HttpSession : ServletActionContext.getRequest().getSession()
		 * 3.获取ServletContext:ServletActionContext.getServletContext();
		 * 
		 * 
		 */
		
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpSession session = request.getSession();
		ServletContext servletContext = ServletActionContext.getServletContext();
		
		System.out.println("execute..");
		
		return "success";
	}
	
}

第四种(非耦合)实现ServletXxxware方法

这个大体上也是和第二种差不多,但是在实现上还是有点不同之处,另外这个实现的也是较为Servlet的, 所以能 接收到所有的参数

package com.struts.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 ServletResponseAware, ServletRequestAware, ServletContextAware {

	/**
	 * 使用:通过实现ServletXxxAware接口的方式可以有struts2注入需要的Servlet的相关对象
	 * ServletRequestAware:注入HttpServletRequest
	 * ServletContextAware:注入ServletContext 
	 * ServletResponseAware: 注入HttpServletResponse
	 */
	private HttpServletRequest request;

	@Override
	public void setServletRequest(HttpServletRequest arg0) {
		System.out.println(arg0);
		this.request = arg0;
	}

	@Override
	public void setServletContext(ServletContext arg0) {
		System.out.println(arg0);
	}

	@Override
	public void setServletResponse(HttpServletResponse arg0) {
		System.out.println(arg0);

	}

	public String execute() {
		System.out.println("fffff : " + request);
		return "success";
	}

}

PS:这个主要还是在后台使用,前端代码还是比较简单

Struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
	<!-- 配置Struts可以受理的请求的扩展名    在org.apache.struts2 包下的default.properties 中配置了struts的一些常量 -->
	<constant name="struts.action.extension" value="action,do"></constant>
	<!-- 此时就可以接受action 以及  do 两种扩展名 -->
	
	
	
	<package name="helloWorld" extends="struts-default" namespace="/">

		<action name="TestActionContext" class="com.struts.action.TestActionContextAction">
			<result name="SUCCESS">/test-actionContext.jsp</result>
		</action>

		<action name="TestAwareAction" class="com.struts.action.TestAwareAction">
			<result name="SUCCESS">/test-aware.jsp</result>
		</action>

		<action name="TestServletActionContextAction" class="com.struts.action.TestServletActionContextAction">
			<result>/success.jsp</result>
		</action>

		<action name="TestServletAwareAction" class="com.struts.action.TestServletAwareAction">
			<result>/success.jsp</result>
		</action>

	</package>
</struts>


这里前端代码就不给了,没什么东西。。。。。

posted @ 2017-07-16 19:05  startor  阅读(147)  评论(1)    收藏  举报