Structs2 HelloWorld-02 访问web资源

一、什么是web资源?
httpservletrequest,httpsession,servletcontext等原生的servletAPI
二、为什么访问web资源?
B/S应用的controller中,必然需要访问web资源,比如读取cookie
三、如何访问?
I和servlet API解耦的方式:只能访问到有限的api对象,且只能访问有限的方法
>使用actioncontext
>实现XXXAware接口
II和servlet API耦合的方式:可以访问更多的servle API形象,并可以调用原生的方法
>使用servletActionContext
>实现ServletxxxAware接口
四、与Servlet API解耦的访问方式
为了避免与 Servlet API 耦合在一起, 方便 Action 做单元测试, Struts2 对 HttpServletRequest, HttpSession 和 ServletContext 进行了封装, 构造了 3 个 Map 对象来替代这 3 个对象, 在 Action 中可以直接使用 HttpServletRequest, HttpServletSession, ServletContext 对应的 Map 对象来保存和读取数据
1、使用actionContext访问web资源
ActionContext 是 Action 执行的上下文对象, 在 ActionContext 中保存了 Action 执行所需要的所有对象, 包括 parameters, request, session, application 等.
  • 获取 HttpSession 对应的 Map 对象: public Map getSession()
  • 获取 ServletContext 对应的 Map 对象:public Map getApplication()
  • 获取请求参数对应的 Map 对象:public Map getParameters()
  • 获取 HttpServletRequest 对应的 Map 对象:public Object get(Object key): ActionContext 
  • 类中没有提供类似 getRequest() 这样的方法来获取 HttpServletRequest 对应的 Map 对象. 要得到 HttpServletRequest 对应的 Map 对象, 可以通过为 get() 方法传递 “request” 参数实现
2、通过实现 Aware 接口访问 Web 资源
Action 类通过可以实现某些特定的接口, 让 Struts2 框架在运行时向 Action 实例注入 parameters, request, session 和 application 对应的 Map 对象:
五、与 Servlet 耦合的访问方式
直接访问 Servlet API 将使 Action 与 Servlet 环境耦合在一起, 测试时需要有 Servlet 容器, 不便于对 Action 的单元测试.
1、直接获取 HttpServletRequest 对象:
  • ServletActionContext.getRequest()直接获取 HttpSession 对象
  • ServletActionContext.getRequest().getSession()直接获取 ServletContext 对象
  • ServletActionContext.getServletContext()
2、通过实现 ServletRequestAware, ServletContextAware 等接口的方式
六、选用建议
选用的建议: 若一个 Action 类中有多个 action 方法, 且多个方法都需要使用域对象的 Map 或 parameters, 则建议使用Aware 接口的方式

session 对应的 Map 实际上是 SessionMap 类型的! 强转后若调用其 invalidate() 方法, 可以使其 session 失效

七、实例工程代码

structs.xml

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

		<action name="TestActionContext" class="com.weixuan.structs03.TestActionContext">
			<result>/test-actionContext.jsp</result>
		</action>

		<action name="TestAware" class="com.weixuan.structs03.TestAwareAction">
			<result>/test-Aware.jsp</result>
		</action>

		<action name="TestServletActionContextAction"
			class="com.weixuan.structs03.TestServletActionContextAction">
			<result>/test-Tsac.jsp</result>
		</action>
			<action name="TestServletAware" class="com.weixuan.structs03.TestServletAwareAction">
				<result>/test-Tsac.jsp</result>
			</action>
	</package>
</struts>    
index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
</head>

<body>
	<a href="TestActionContext.action?name=weixuan">Test ActionContext</a>

	<%
	if(application.getAttribute("date")==null)
    	application.setAttribute("date", new Date());
    %>

	<br>
	<br>
	<a href="TestAware.action?name=weixuan2">Test Aware</a>

	<br>
	<br>
	<a href="TestServletActionContextAction.action">TestServletActionContextAction</a>
	
	<br>
	<br>
	<a href="TestServletAware.action">TestServletAware</a>
</body>
</html>
package com.weixuan.structs03;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;

public class TestActionContext {

	public String execute() {

		// 首先获取actionContext对象,是action的上下文对象,可以从中获取到当前action需要的一切信息

		ActionContext actionContext = ActionContext.getContext();
		/**
		 * 1、获取application对应的map,并向其中添加一个属性 2、获取session 3、request
		 * 4、获取请求参数对应的map,并获取指定的参数值
		 */
		Map<String, Object> applictionMap = actionContext.getApplication();
		// 添加属性,这个属性可以在页面上被拿到
		applictionMap.put("applicaionKey", "applictionValue");

		// 获取属性
		Object date = applictionMap.get("date");
		System.out.println("date : " + date);

		Map<String, Object> sessionMap = actionContext.getSession();

		sessionMap.put("sessionKey", "sessionValue");

		//没有getRequest方法,只能靠get函数传入"request"获取数据
		Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
		requestMap.put("requestKey", "requestValue");
		
		//获取请求参数,只能读,不能写入数据,但是写入数据不报错,但不得起作用
		Map<String, Object> parametersMap = actionContext.getParameters();
		
		//actionContext.getParameters()返回值是Map<String, Object>
		String[] t =(String[])parametersMap.get("name"); 
		
		parametersMap.put("age", 100);
		
		System.out.println(t[0]);
		
		return "success";
	}
}

package com.weixuan.structs03;

import java.util.Map;

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,
		RequestAware, ParameterAware {
	private Map<String, Object> application;
	private Map<String, Object> session;
	private Map<String, Object> request;
	private Map<String, String[]> paramet;

	public String execute() {
		// 向application中加入一个属性
		application.put("applicationKey2", "applicationValue2");
		// application中读取属性
		System.out.println(application.get("date"));
		
		session.put("sessionKey2", "sessionValue2");
		System.out.println(session.get("sessionKey")+"  "+session.get("sessionKey2"));
		return "success";
	}

	@Override
	public void setApplication(Map<String, Object> application) {
		// TODO Auto-generated method stub
		this.application = application;
	}

	@Override
	public void setParameters(Map<String, String[]> paramet) {
		// TODO Auto-generated method stub
		this.paramet = paramet;
	}

	@Override
	public void setRequest(Map<String, Object> request) {
		// TODO Auto-generated method stub
		this.request = request;
	}

	@Override
	public void setSession(Map<String, Object> session) {
		// TODO Auto-generated method stub
		this.session = session;
	}
}
package com.weixuan.structs03;

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() {

		HttpServletRequest request = ServletActionContext.getRequest();
		// HttpSession session = request.getSession();
		HttpSession session = ServletActionContext.getRequest().getSession();
		ServletContext servletcontext = ServletActionContext
				.getServletContext();
		return "success";
	}
}

package com.weixuan.structs03;

import java.util.Map;

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.interceptor.SessionAware;
import org.apache.struts2.util.ServletContextAware;

public class TestServletAwareAction implements ServletRequestAware,
		ServletResponseAware, ServletContextAware {

	private ServletContext context;
	private HttpServletResponse response;
	private HttpServletRequest request;

	@Override
	public void setServletContext(ServletContext context) {
		// TODO Auto-generated method stub
		System.out.println(context);
		this.context = context;
	}

	@Override
	public void setServletResponse(HttpServletResponse response) {
		// TODO Auto-generated method stub
		System.out.println(response);
		this.response = response;
	}

	@Override
	public void setServletRequest(HttpServletRequest request) {
		// TODO Auto-generated method stub
		System.out.println(request);
		this.request = request;
	}

	public String execute() {
		return "success";
	}
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值