Servlet 访问WEB资源的方式

  WEB资源:

      HttpServletRquest,HttpServletSession,Cookie等,原生Servlet  API


  Servlet访问WEB资源的方式

    Servlet API解耦的方式(只能访问到有限的Servlet API对象和方法)

       >使用ActionContext

import java.util.Map;

import org.apache.struts2.dispatcher.SessionMap;

import com.opensymphony.xwork2.ActionContext;

public class TestActionContextAction {

	public String execute(){
		
		//0. 获取 ActionContext 对象
		//ActionContext 是 Action 的上下文对象. 可以从中获取到当往 Action 需要的一切信息
		ActionContext actionContext = ActionContext.getContext();
		
		//1. 获取 application 对应的 Map, 并向其中添加一个属性
		//通过调用 ActionContext 对象的 getApplication() 方法来获取 application 对象的 Map 对象
		Map<String, Object> applicationMap = actionContext.getApplication();
		//设置属性
		applicationMap.put("applicationKey", "applicationValue");
		
		//获取属性
		Object date = applicationMap.get("date");
		System.out.println("date: " + date);
		
		//2. session
		Map<String, Object> sessionMap = actionContext.getSession();
		sessionMap.put("sessionKey", "sessionValue");
		
		System.out.println(sessionMap.getClass()); 
		
		if(sessionMap instanceof SessionMap){
			SessionMap sm = (SessionMap) sessionMap;
			sm.invalidate();
			System.out.println("session 失效了. ");
		}
		
		//3. request* 
		//ActionContext 中并没有提供 getRequest 方法来获取 request 对应的 Map
		//需要手工调用 get() 方法, 传入 request 字符串来获取. 
		Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
		requestMap.put("requestKey", "requestValue");
		
		//4. 获取请求参数对应的 Map, 并获取指定的参数值. 
		//键: 请求参数的名字, 值: 请求参数的值对应的字符串数组
		//注意: 1. getParameters 的返回值为在 Map<String, Object>, 而不是 Map<String, String[]>
		//     2. parameters 这个 Map 只能读, 不能写入数据, 如果写入, 但不出错, 但也不起作用!
		Map<String, Object> parameters = actionContext.getParameters();
		System.out.println(((String[])parameters.get("name"))[0]);
		
		parameters.put("age", 100);
		
		return "success";
	}
	
}

   其中 actionContext 是也是一个Map类型,将request 、 response 放在了value中,因此可知通过键值对的方式调用request和response,如:actionContext.get("request")


    前台页面通过EL表达式获取数据

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!--
有四个隐含对象:applicationScope,sessionScope,requestScope,pageScope.
与application,session,request,pageContext相对应.例如applicationScope用来获取application范围的属性值  
         -->
	<h4>Test ActionContext Page</h4>
	
	application : ${applicationScope.applicationKey }
	<br><br>
	
	session: ${sessionScope.sessionKey }
	<br><br>
	
	request: ${requestScope.requestKey }
	<br><br>
	
	age: ${parameters.age }
	
</body>
</html>


       >实现XxxAware接口(类似依赖注入)

            1.重写setXxxx(Map Xxxx)方法

            2. 设置Xxxx属性

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{
	
	public String execute(){
		
		//1. 向 application 中加入一个属性: applicationKey2 - applicationValue2
		application.put("applicationKey2", "applicationValue2");
		
		//2. 从 application 中读取一个属性 date, 并打印. 
		System.out.println(application.get("date"));
		
		return "success";
	}
	
	public String save(){
		
		return null;
	}

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

	@Override
	public void setParameters(Map<String, String[]> parameters) {
		
	}

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

	@Override
	public void setSession(Map<String, Object> session) {
		// TODO Auto-generated method stub
		
	}
	
}
  若在一个Action类中有多个action方法则建议选用实现XxxAware接口的方式
  小细节:sessionse对应的Map是sessionMap类型的, sessionMap.invalidate()可以使session失效


    Servlet API耦合的方式(访问更多API,调原生方法)

       >使用ServletActionContext

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

import org.apache.struts2.ServletActionContext;


public class TestServletActionContext {
	/**
	 * 直接获取 HttpServletRequest 对象==》	 常用
	 * 		ServletActionContext.getRequest()
	 * 直接获取 HttpSession 对象==  》常用
	 * 		ServletActionContext.getRequest().getSession()
	 * 直接获取 ServletContext 对象==  》较为常用
	 * 		ServletActionContext.getServletContext()
	 * 直接获取 HttpServletResponse 对象==  》不常用
	 * 		ServletActionContext.getResponse()
	 */
	ServletContext servletActionContext=ServletActionContext.getServletContext();
	HttpServletRequest request=ServletActionContext.getRequest();
	HttpServletResponse response=ServletActionContext.getResponse();
	HttpSession session=ServletActionContext.getRequest().getSession();
}

       >实现ServletXxxAware接口

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 TestServletAware implements ServletContextAware, ServletRequestAware, ServletResponseAware {
	/**
	 * 实现三个Aware接口
	 * 必须要添加execute方法
	 */
	public void setServletResponse(HttpServletResponse response) {
		// TODO Auto-generated method stub

	}

	public void setServletRequest(HttpServletRequest request) {
		// TODO Auto-generated method stub

	}

	public void setServletContext(ServletContext context) {
		// TODO Auto-generated method stub

	}

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜马拉雅以南

奶茶,干杯?!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值