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>
这里前端代码就不给了,没什么东西。。。。。

浙公网安备 33010602011771号