主要介绍获取Web资源的四种方式
一、使用Struts2Aware拦截器
使用Struts2 Aware拦截器来获取web资源,首先必须是在Action中进行,然后还得实现ServletRequestAware,ServletResponseAware,ServletContextAware接口来获取对应的ServletRequest、ServletResponse、ServletContext对象。
package cn.lovepi.chapter03.action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by icarus on 2016/7/9.
* 使用Struts2 aware拦截器获取web资源
* 首先这是一个action
* 然后得实现对应的接口来获取对应的web类
*/
public class FirstAction extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{
// 设置类中的对应的request和response对象和context对象
private ServletRequest request;
private ServletResponse response;
private ServletContext context;
/**
* action执行方法
* @return
* @throws Exception
*/
@Override
public String execute() throws Exception {
String username=request.getParameter("username");
System.out.println("第一种拦截器获取资源:"+username);
return "success";
}
/**
* 设置传递到action中的ServletRequest
* @param httpServletRequest
*/
@Override
public void setServletRequest(HttpServletRequest httpServletRequest) {
request=httpServletRequest;
}
/**
* 设置传递到action中的ServletResponse
* @param httpServletResponse
*/
@Override
public void setServletResponse(HttpServletResponse httpServletResponse) {
response=httpServletResponse;
}
/**
* 设置传递到action中的ServletContext,即application
* @param servletContext
*/
@Override
public void setServletContext(ServletContext servletContext) {
context=servletContext;
}
}
二、使用Struts2RequestAware拦截器
接下来使用RequestAware拦截器来获取web资源,只要实现RequestAware接口就可以了,然后实现其中的setRequest方法。不同的是,这里将ServletRequest、ServletResponse、ServletContext对象放置在了一个集合当中,需要使用Struts2当中的key值来获取对应的对象。
package cn.lovepi.chapter03.action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.StrutsStatics;
import org.apache.struts2.interceptor.RequestAware;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.util.Map;
/**
* Created by icarus on 2016/7/9.
* 使用RequestAware拦截器获取web资源
* 需要实现RequestAware接口
*/
public class SecondAction extends ActionSupport implements RequestAware{
private ServletResponse response;
private ServletRequest request;
private ServletContext context;
/**
* 对应action方法
* @return
* @throws Exception
*/
@Override
public String execute() throws Exception {
String username=request.getParameter("username");
System.out.println("第二种方法获取web资源:"+username);
return "success";
}
/**
* 获取对应的web资源,使用map集合方式
* 即键值对获取
* @param map
*/
@Override
public void setRequest(Map<String, Object> map) {
request= (ServletRequest) map.get(StrutsStatics.HTTP_REQUEST);
response= (ServletResponse) map.get(StrutsStatics.HTTP_RESPONSE);
context= (ServletContext) map.get(StrutsStatics.SERVLET_CONTEXT);
}
}
三、使用Struts2内置静态对象ActionContext
这种方式来获取web资源并不需要实现任何的接口
package cn.lovepi.chapter03.action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* Created by icarus on 2016/7/9.
* Struts2获取web资源对象第三种方法
* 使用Struts2内置静态对象ActionContext
* 使用这种方式不需要实现任何的接口
* -----------------------------------
* 注:HttpServlet只是Servlet的子类
*/
public class ThirdAction extends ActionSupport{
@Override
public String execute() throws Exception {
ActionContext ac=ActionContext.getContext();
ServletRequest request= (ServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);
ServletContext context= (ServletContext) ac.get(ServletActionContext.SERVLET_CONTEXT);
ServletResponse response= (ServletResponse) ac.get(ServletActionContext.HTTP_RESPONSE);
String username=request.getParameter("username");
System.out.println("第三种方式:"+username);
return "success";
}
}
四、使用Struts2内置静态对象ServletActionContext
这是最简单最多使用的方法
package cn.lovepi.chapter03.action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
/**
* Created by icarus on 2016/7/9.
* Struts2获取web资源的第四种方式
* 使用Struts2内置对象ServletActionContext
* 这是四种方法中最好的方式
* 不需要实现任何接口,也可以按照需求获取所需的对象
*/
public class FourthAction extends ActionSupport{
@Override
public String execute() throws Exception {
ServletRequest request= ServletActionContext.getRequest();
ServletResponse response=ServletActionContext.getResponse();
ServletContext context=ServletActionContext.getServletContext();
String username=request.getParameter("username");
System.out.println("第四种方式:"+username);
return "success";
}
}
总结:
通过四种方法都可以获取到对应的web资源,但是使用Aware拦截器需要实现对应的接口才可以获取到对应的资源,而使用RequestAware则只需实现一个接口便可以获取到所有的web资源对象。对于使用Struts2内置的静态对象来获取Web资源来说并不需要实现任何的接口,相比较与前两种使用拦截器的方式来说,使用内置静态对象的方式更值得推荐。而在后两种方式中:使用内置对象ActionContext返回的是一个map集合,得需要使用对应的key来获取所需的资源对象。而ServletActionContext则可以根据不同的方法直接获取对应的web资源对象。
虽然使用内置对象ServletActionContext的方式来获取Web资源是最好的方式,值得推荐。但是,我们也得了解前三种获取web资源的方式,因为在某些项目中可能会遇到别人使用前三种方式来获取web资源。但在日常的开发中我们必须得熟练掌握第四种获取web资源的方式,即ServletActionContext方式。
补充说明:
ServletContext,也就是Application,服务器对象,只要服务器不关闭,这个对象就永远存在。该信息是存储与服务器中的,一般数据我们是严禁存储到application对象中去的,因为这样很容易导致服务器内存溢出,程序崩溃。
他的实际应用场景是:在驾校考试系统中,用户只需要注册就可以免费答题,用户量庞大。而在页面中每次只出现一道题,答完之后显示下一道。假如我们每次的数据处理如下图所示:
如上图所示,我们在这里使用到了Application对象来存储对应的题目信息,这样省去了我们每次都去数据库中获取下一道题目的步骤。在这种情况下,系统一启动就从数据库中获取全部的题目信息保存到Application对象中去,然后用户只需访问ServletContext就好,然后直接在界面中显示对应的Application中的数据就行。