• Struts2: Request & Response


    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框架本身已经提供了其它的实现上述功能的途径。不过了解了总是好了,知其然亦知其所以然嘛。

  • 相关阅读:
    api.js
    vue开关
    vue 单选框自定义
    vue 笔记
    Flutter 检测网络连接 监听网络变化
    lutter 调用原生硬件 Api 实现扫码
    flutter 支付宝支付流程以及用 Flutter 在 Android Ios 中实现支付宝支付
    js+css 动效+1的效果
    Vue -- filters 过滤器、倒计时效果
    移动端如何实现两行点点点?
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/2999230.html
Copyright © 2020-2023  润新知