JAVAEE_Servlet_16_HttpServletRequest中常用方法(三)

HttpServletRequest中常用方法(三)


 *  回顾ServletContext对象,ServletContext对象是Servlet上下文对象
           
    - 创建ServletContext对象
          
  	ServletContext application = config.getServletContext();



    - ServletContext是Servlet上下文对象,该接口也有这样几个方法,管理ServletContext范围内的数据
       
                - Object    getAttribute(String name)              从ServletContext范围中读取数据  

    	              - void      setAttribute(String name  Object o)    向ServletContext范围中添加数据

    	              - void      removeAttribute(String name)           移除ServletContext范围中的数据


    - ServletContext是怎样的一个范围?
         
         一个Webapp只有一个ServletContext , 所有用户共享的一个上下文范围对象,可以实现数据共享,一般将ServletContext变量命名为Application,可见这个对象代表一个应用。





* HttpServletRequest中常用方法第三类:   操作HttpServletRequest范围内的对象

       -  方法:  

              Object    setAttribute(String name  Object o)      向ServletRequest范围中添加数据

    	        void      getAttribute(String name)               从ServletRequest范围中读取数据

    	        void      removeAttribute(String name)            移除ServletRequest范围中的数据



  - HttpServletRequest是怎么样的一个范围? 
         
         1.HttpServletRequest的变量通常命名为 request,代表当前用户的本次请求, 一次请求代表一个request对象。

         2.request只能完成在同一次请求中传递数据。  比如有ServletA和ServletB , A将数据存进去,B是取不出来的,因为B取得时候A请求已经结束了,不是一个请求。

         3.如果想要实现 A将数据存进去,B能将数据取出来,需要将两个请求进行连接,执行完成A后自动跳转到B开始执行, 将ServletA和ServletB,放在同一个请求里,必须使用转发技术(forward)。


     
     - 向ServletRequest范围中添加数据 和 读取数据      Object    setAttribute(String name  Object o) 

              // 创建一个User对象
                User user=new User();
                user.setUserCode("11111");
                user.setUserName("Morty");


              // 向HttpServletRequest范围内添加数据
                 request.setAttribute("userObj",user);

             // 从HttpServletRequest范围内取出数据
                Object obj=request.getAttribute("userObj");


             // 输出该对象

                response.setContentType("text/html;charset=UTF-8");
                PrintWriter out=response.getWriter();
                out.print(obj);
                System.out.println(obj);

           以上代码,因为实在同一个request中进行的存取操作,所以存进去的数据,可以取出来, 如果在一个Servlet对象中向request对象中添加数据,然后在另一个Servlet对象中取出来,那么就取不出来了,因为第一个请求已经结束了。


## RequestDispatcher 转发

  - 如何才能实现在AServlet对象的请求中存入数据,而在Bservlet对象的请求中取出来呢?

           * 使用转发技术(forward),将两次Request请求合并在一起,就可以实现了,AServlet对象执行结束后接着执行Bservlet。

           * 代码  forward 转发技术

                ```
              // 1.获取请求转发器对象,以下转发器对象指向了ServletRequestTestB

                   String dispatcherPath="/ServletRequestTest2";        // 需要跳转的对象的路径 <url-pattern>

                   RequestDispatcher requestDispatcher=request.getRequestDispatcher(dispatcherPath);


              // 2.调用请求转发器对象的forward方法,将两个请求合并,即可完成转发

                   requestDispatcher.forward(request,response);

           

              // 以上代码合并成一行代码,获取请求转发器对象,调用转发器对象的forward方法

                 request.getRequestDispatcher("/ServletRequestTest2").forward(request,response);




## 关于范围对象 ServletContext 和  HttpServletRequest 的选择 ?
         
     - ServletContext 应用范围广, 可以夸用户传递数据。

     - HttpServletRequest 请求范围很小,只能在同一个请求中传递数据,使用请求转发器后可以夸Servlet传递数据,但不可以跨用户传递,因为一个用户一个请求,不同的用户是不同的请求。

        - 但优先选择HttpServletRequest传递数据,因为该范围对象占用资源小,请求结束就销毁了。

  


     






             
posted @ 2021-04-21 18:51  失昼  阅读(83)  评论(0)    收藏  举报