1.什么是WEB资源?
HttpServletRequest,HttpSession,ServletContext等原生的Servlet API。
2.为什么访问WEB资源?
B/S的应用的Controller中必然需要访问WEB资源,例如,向域对象中读写属性,读写Cookie,获取realPath等等。
3.如何访问?
在Action中,可以通过一下方式访问web的HttpSession,HttpServletRequest,HttpServletResponse等资源
与Servlet API解耦的访问方式:只能访问有限的Servlet API对象,且只能访问其有限的方法(获取请求参数,读写域对象的属性,使session失效)
为了避免与Servlet API耦合在一起,方便Action做单元测试,struts2对HttpServletRequest,HttpSession和ServletCOntext进行封装,构造了3个Map对象来替代这3个对象,在Action中可以直接使用HttpServletRequest,HttpServletSession,ServletContext对应的Map对象来保存和读取数据。
通过com.opensymphony.xwork2.ActionContext
通过Action实现如下接口:
org.apache.struts2.interceptor.ApplicationAware;
org.apache.struts2.interceptor.RequestAware;
org.apache.struts2.interceptor.SessionAware;
与Servlet API耦合的访问方式:(可以访问更多的Servlet API对象,即可以调用其原生的方法)
通过org.apache.struts2.ServletActionContext
通过实现对应的ServletXxxAware接口
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"参数实现。
看代码:
package logan.struts2.study; import java.util.Map; import org.apache.struts2.dispatcher.Parameter; import com.opensymphony.xwork2.ActionContext; public class TestActionContext { 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); //2.session Map<String,Object> sessionMap = actionContext.getSession(); sessionMap.put("sessionKey", "sessionValue"); //3.request //ActionContext中并没有提供getRequest方法来获取Request对应的Map //需要手工调用get()方法,传入request字符串来获取。 Map<String,Object> requestMap = (Map<String, Object>) actionContext.get("request"); requestMap.put("requestKey", "requestValue"); //4.获取请求参数对应的Map,并获取指定的参数值 //parameters这个Map只能读,不能写。如果写入,不会报错,但是也不起作用。 Map<String,Parameter> parameters = actionContext.getParameters(); System.out.println(parameters.get("name")); return "success"; } }
<?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> <!-- action VS Action类 action:代表一个Struts2的一个请求 Action类:能够处理Struts2请求的类 --> <package name="default" namespace="/" extends="struts-default"> <action name="TestActionContext" class="logan.struts2.study.TestActionContext"> <result>/test-actionContext.jsp</result> </action> </package> </struts>
index.jsp
<%@page import="java.util.Date"%> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!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=ISO-8859-1"> <title>Insert title here</title> </head> <body> <a href="TestActionContext.action?name=logan&name=logan2">Test ActionContext</a> <% if(application.getAttribute("date") == null){ application.setAttribute("date", new Date()); } %> </body> </html>
test-actionContext.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!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=ISO-8859-1"> <title>Insert title here</title> </head> <body> <h4>Test ActionContext Page</h4> application:${applicationScope.applicationKey } <br><br> session:${sessionScope.sessionKey } <br><br> request:${requestScope.requestKey } <br><br> <br><br> </body> </html>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>Struts2-2</display-name> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>