第5章:作为Web应用:属性和监听者/5.4 Servlet属性的线程安全性、请求属性与请求分派

  • 上下文属性

  1. 它不是线程安全的,因为它属于应用所有,全部servlet都都可以修改它,所以在调用setAttribute,removeAttribute时要加锁操作
  2. 操作方法如:第5章:作为Web应用:属性和监听者/5.4 Servlet属性的线程安全性、请求属性与请求分派_第1张图片锁要针对getServletContext对象

 

  • 请求属性-线程安全

  1. 请求属性是线程安全的,因为每个属性都是一个线程中,而且它的属性值是独立的,不是共享的,所以是安全的
  • 会话属性-线程不安全

  1. 它不是线程安全的,因为一个用户可能在多个浏览器窗口连续发送请求,但是对容器来说,它还是属于同一个用户的会话,所以在会话中的setAttribute,removeAttribute操作也不是安全的,也要加锁
  2. 操作方法如:第5章:作为Web应用:属性和监听者/5.4 Servlet属性的线程安全性、请求属性与请求分派_第2张图片,锁要针对request.getSession( )对象

 

  • 请求属性和请求分派

  1. 请求属性就是用请求参数HttpServletRequest request调用setAttribute方法设置某些属性,这些属性可以是某个具体类的对象,然后将设置后的属性传递给应用的其它部分,例如JSP,
  2. 请求分派就是通过请求参数HttpServletRequest request获取某个JSP的分派器对象,然后再告诉JSP接受请求
  3. 获取请求分派器对象的两种方式
    1. 从请求对象获取

        

         //获取my.jsp分配器,这里的my.jsp资源的路径可以是相对路径,也可以带/的绝对路径
      
                 RequestDispatcher requestDispatcher = request.getRequestDispatcher("my.jsp");

       

    2. 从上下文对象获取
       //获取my.jsp分配器,这里的my.jsp必须带/开头的绝对路径    
      
                 RequestDispatcher requestDispatcher2 = getServletContext().getRequestDispatcher("/my.jsp");

       

  4. 代码演示:
    //创建某个对象
    
               Dog dog1 = new Dog("mydog1");
    
               Dog dog2 = new Dog("mydog2");
    
               //设置对象属性1
    
               request.setAttribute("dog1", dog1);
    
               //设置对象属性2
    
               request.setAttribute("dog2", dog2);
    
               //获取my.jsp分配器
    
               RequestDispatcher requestDispatcher = request.getRequestDispatcher("my.jsp");
    
               //发送分派请求
    
               requestDispatcher.forward(request, response);
    //在后续的my.jsp中可以通过隐藏的HttpServletRequest对象通过getAttribute方法获取到传递过去的属性

    》》》》》未完:易学笔记--Servlet和JSP--入门就看这一篇就够了》》》》》

你可能感兴趣的:(Servlets与JSP)