1. 获取Request和Response的方法
1.1. ServletActionContext的静态方法
HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse();
1.2. ActionContext对象的方法
ActionContext ctx = ActionContext.getContext(); HttpServletRequest request = (HttpServletRequest)ctx.get(StrutsStatics.HTTP_REQUEST); HttpServletResponse response = (HttpServletResponse)ctx.get(StrutsStatics.HTTP_RESPONSE);
1.3. ServletRequestAware,ServletResponseAware接口的实现
public class TestActionimplements ServletRequestAware, ServletResponseAware { private HttpServletRequest request; private HttpServletResponse response; public void setServletRequest(HttpServletRequest request) { this.request = request; } public void setServletResponse(HttpServletResponse response) { this.response = response; } }
2. Request对象的常见应用
Request对象实际上保存的是从浏览器端发送来的请求信息,包括报文头中的信息、浏览器中的Cookie、表单中的数据等等。
2.1. 获取报文头中的信息
Request对象中提供了很多get方法来提供请求报文头中包含的信息,举例如下:
getServerName() 服务器名
getProtocol() 协议
getMethod() 方法
getServerPort() 端口号
getContextPath() Context路径
getServletPath() Servlet路径
getRequestURI() URI路径
getQueryString() 查询字符串
getRemoteAddr() 远程用户IP地址
getRemotePort() 远程用户端口号
2.2. 获取请求发送的数据
Request对象中包含了四个方法来获取浏览器端发送的数据:
String getParameter(String name) 获取名为name的参数值
Map getParameterMap() 获取数据的name –value映射表
Enumeration getParameterNames() 获取数据的name集合
String[] getParameterValues(String name) 获取同是名为name的数据的数组
获取到的数据值全部为String类型,与Struts2内置的数据获取形式相比效率较低。
另外,request还有另一套存取数据的方式,即:
void setAttribute(String name, Object value) 存储数据到request对象
Object getAttribute(String name) 从request对象中获取名为name的数据值
与parameter相比,attribute的区别在于它不是存在于报文中并解析出来的,而是直接存在于request对象内部的,它会随request对象的消亡而丢失。
2.3. 获取与该Request相关的Session
HttpSession getSession() 获取该Request所在作用域的Session
String getRequestedSessionId() 获取上述Session的ID
2.4. 跳转
request.getRequestDispatcher(String path).forward(HttpServletRequest request, HttpServletResponse response) throws IOException
request对象可以指定一个路径,并跳转到那个路径,这个跳转可以把当前action(servlet)中的request对象和response对象一并传递过去,基本不会丢失request请求中的数据信息以及response中的设置。
3. Response对象的常见应用
与request对象相比,response对象的用途似乎少了许多,因为无论是Struts2的action(其实质也是Servlet)还是Servlet,执行完跳转到下一个页面的过程实际上就是对下一个页面发送请求,因此需要传递的数据都会保存在request对象中作为attribute。response对象通常用于不向新页面发送请求的时候,对于Servlet来说,就是直接在Servlet中绘制JSP页面(通过PrintWriter getWriter()方法)的情况,或者需要绘制图像、传送JSON/ XML数据的情况。
通常情况下,在Struts2中很少会用到response对象。对于response对象的常见用法参见如下链接:
http://blog.163.com/hero_213/blog/static/39891214200922523616393/
3.1. 重定向
response.sendRedirect(String location)
虽然在Struts2里,通过上述方法来进行重定向显得非常没有必要,但是因为很多公司的面试题都会考到,所以还是有必要记一下。这种重定向操作相当于丢弃当前所有的数据信息,直接打开新的链接。与request对象中的forward方式相比,它更快,因为不包含数据。
之所以说它已经被Struts2所淘汰,是因为在struts.xml中配置action的时候,可以在<result>标签中添加type=”redirect”属性,这时的跳转就是重定向了。
4. 总结
虽然罗列了这么多,但是从Struts2的角度上讲,上述的方法除了获取Session、Cookie以及一些必要的报文头信息以外,基本上都已经过时了。这也正是Struts2将request和response隐藏了的原因,Struts2框架本身已经提供了其它的实现上述功能的途径。不过了解了总是好了,知其然亦知其所以然嘛。