zoukankan      html  css  js  c++  java
  • 【Web】Servlet三大作用域、JSP四大作用域

    request

    生命周期:

    • 创建:客户端向服务器发送一次请求,服务器就会创建request对象.
    • 销毁:服务器对这次请求作出响应后就会销毁request对象.

    有效:仅在当前请求中有效。

    作用:常用于服务器间同一请求不同页面之间的参数传递,常应用于表单的控件值传递。

    • 获取表单提交参数: request.getParameter()
    //从login.jsp中获取用户名和密码 
    String username = request.getParameter("username"); 
    String password = request.getParameter("password"); 
    String imageText = request.getParameter("imageText");
    • 传值到表单: request.setAttribute()
    if(user == null) { 
        //用户名和密码不匹配 
        request.setAttribute("msg", "用户名和密码不匹配!"); 
        return “/jsp/login.jsp”; 
    }

    请求转发与请求重定向

    jsp 或 Servlet 都会用到页面跳转,可以用
    request.getRequestDispatcher("p3.jsp").forward(request,response);这种方法称为转发,地址栏上的 URL 不会改变;
    response.sendRedirect("p3.jsp");这种方法称为重定向,地址栏的 URL 会改变;
    这样实现跳转到 p3.jsp。可是这两种方法有着本质的不同,requset 是请求,是在服务器端运行的,response 是响应,是在客户端运行的;

    例如:
    有 3 个页面 p1.jsp,p2.jsp,p3.jsp;
    p1.jsp 提交给 p2.jsp, p2.jsp 在转发给 p3.jsp

    • 转发(forward):

      如果在 p2 用转发发到 p3,由于是浏览器请求的是 p2,请求的一些参数被封装在 request 中,发给服务器,服务器用 request.getRequestDispatcher("p3.jsp").forward(request,response);
      转到 p3,服务器把 p3 发给浏览器浏览器不知道被偷梁换柱了,所以 URL 没变,URL 还是 p2.jsp;也完全可以用request.getParameter("name");得到 p1.jsp 中的表单控件的值,因为在这里用了 forward() 把 request 传了下去

      注意:转发是在服务器中进行请求转发,由于是同一个请求转发,所以 URL 并没有改变,请求域也是相同的。

    • 重定向(redirect):

      如用第二种方法,这是浏览器主动请求了 p3,所以浏览器知道请求的地址,所以 URL 变了
      而又一次请求,产生了另外一个 request,这个和请求 p2 的 request 不同,所以在 p3 中用 request.getParameter("name"); 得不到 p1.jsp 中的表单控件的值。

      注意:重定向是在浏览器中进行请求重定向,浏览器将请求重新定向到一个新的位置,发了一个新的请求,所以是不同的请求,URL 改变了,请求域也并不相同。

    总结:

    1. request.getRequestDispatcher("a.jsp").forward(rquest,response); request 转发,它可以保存 request 中的数据,页面调整,但是地址是不调整的
    2. response.sendRedirect("b.jsp"); 方式是重定向,它的数据是不共享的,也就是说,request 中保存的数据在 b.jsp 页面中是获取不到的 这种方式是表单是不能重复提交的,response 跳转是可以实现跨域的 地址栏也会变化。

    session

    生命周期:

    • 创建:服务器端第一次调用 getSession();(保存在服务器内存中)

      解释 session:当访问服务器某个网页的时候,会在服务器端的内存里开辟一块内存,这块内存就叫做session,而这个内存是跟浏览器关联在一起的。当访问一个页面的时候给浏览器创建一个独一无二的号码,也给同时创建的session赋予同样的号码。这个浏览器指的是浏览器窗口,或者是浏览器的子窗口,意思就是,只允许当前这个session对应的浏览器访问,就算是在同一个机器上新启的浏览器也是无法访问的。而另外一个浏览器也需要记录session的话,就会再启一个属于自己的session

    • 销毁:
      1. 非正常关闭服务器(正常关闭 session 会序列化,再次启动服务器 session 会被反序列化);

        注意:服务器正常关闭,再启动,Session 对象会进行钝化和活化操作。同时如果服务器钝化的时间在 session 默认销毁时间之内,则活化后 session 还是存在的。否则 Session 不存在。  如果 JavaBean 数据在 session 钝化时,没有实现 Serializable 则当 Session 活化时,会消失。

      2. session 过期了默认30分钟;
      3. 手动调用 session.invalidate();
      4. 关闭浏览器。

        注意:关闭浏览器再次访问会找不到 session 的会话 id 而不是 session 被销毁了。
        备注:session 是服务器端对象,保存在服务器端。并且服务器可以将创建 session 后产生的 sessionid 通过一个 cookie 返回给客户端,以便下次验证。(session 底层依赖于 cookie)

    有效:用户打开浏览器会话开始,直到关闭浏览器会话才会结束。一次会话期间只会创建一个session对象。

    注意:只关闭标签页的话,session 状态是还在的。要完全关闭浏览器后,重新打开才会启用新的 session。
    session 有自身的生命周期,如一定的时间内不再激活的话就会过期,被服务器注销。

    session 是基于 cookie 的一种会话技术,数据存放存放在服务器端。客户端在 cookie 携带 JSESSIONID(tomcat服务器生成),来访问服务端,获取对应 JSESSIONID 的 session 数据。
    问题:setAttribute 存放的值,在浏览器关闭后,还有没有?
    回答:有!就算客户端把电脑砸了也还有。
    问题:为何关闭浏览器后,再次访问会觉得 session 失效了呢,这里的失效意思是 session 的数据丢失了?
    回答:其实,这里 session 数据并没有丢失,只是关闭浏览器后,因为默认的 cookie 生命周期为浏览器的内存,即关掉浏览器之后 cookie 就失效了,此时 JSESSIONID 也就没有了。再次访问后,服务器又生成一个新的 JSESSIONID,此时 request.getSession() 通过 JSESSIONID 获取到的 session 就不是之前的 session了。

    作用:常用于 web 开发中的登陆验证界面(当用户登录成功后浏览器分配其一个 session 键值对)。

    • 读取生成的验证码信息:
    //图片的验证码 
    String imageMsg = (String) request.getSession().getAttribute("imageMsg");
    • 用户保持登录状态:
    //登录成功 保存用户登录状态 
    request.getSession().setAttribute("user", user);
    • 购物车物品保存:
    //将cart放入session中 
    request.getSession().setAttribute("cart", cart);

    application

    生命周期:

    • 创建:服务器启动的时候,服务器为每个WEB应用创建一个属于该 web 项目的对象 ServletContext 类。
    • 销毁:服务器关闭或者项目从服务器中移除的时候。

      注意:服务器只会创建一个 ServletContext 对象,所以如果在代码中,你创建了两个 application ,其实它们就是同一个,他们的值是互通的。

    有效:此信息在整个服务器上被保留。

    三大作用域的区别

    • request:每一次请求都是一个新的 request 对象,如果在 web 组件之间需要共享同一个请求中的数据,只能使用请求转发。
    • session:每一次会话都是一个新的 session 对象,如果如果需要在一次会话中的多个请求之间需要共享数据,只能使用session。
    • application:应用对象,Tomcat启动到关闭,表示一个应用,在一个应用中有且只有一个 application 对象,作用于整个 Web 应用,可以实现多次会话之间的数据共享。

    共同点

    1. 设置作用域中的共享数据(保存数据)
      作用域对象.setAttribute(String name,Object value);

    2. 获取作用域中的共享数据(获取数据)
      Object value=作用域对象.getAttribute(String name);

    3. 删除作用域中的指定的共享数据(删除数据)
      作用域对象.removeAttribute(String name);

    总结

    总结:

    1. 作用域:request、session、application
      使用作用域传递数据和存储数据
      使用作用域传递数据时,必须掌握作用域对应的生命周期和作用范围

    2. 生命周期:
      1. request:只限于一次请求
      2. session:一次会话(多次请求)
        • 开始:用户向服务器发送请求的时候
        • 结束:
          • 客户端:丢失JsessionId值的时候(关闭浏览器)
          • 服务器端:关闭服务器、超过会话的不活动周期时间
      3. application:项目的加载到卸载
    3. 作用范围:
      1. requset:所有被请求转发的Servlet
      2. session:所有的Servlet
      3. application:所有的Servlet(换一个浏览器演示,跟session作用域区分)
    4. 如何正确的选择作用域:
      1. request:跟当前操作功能相关
      2. session:跟用户信息相关
      3. application:跟项目全局信息相关----》京东配送地址
    5. 如何正确的选择作用域不正确,会出现什么情况?
      内存浪费

    记录一系列状态
    session 服务端 开会 会话(服务器与客户端之间的会话,将会话信息存在服务器)
    cookie 客户端 饼干(与 session 类似,只不过将信息存在客户端)
    request 请求域共享

    JSP 四大作用域

    jsp 九大内置对象中有四大域对象
    jsp 四大域对象(这是范围概念,而不是时间概念)(如 请求是指一次请求范围(包括响应),而不是请求的那个时刻)(就如求婚的范围=求婚、思考、接收,而不是指求婚那个时刻)

    对象类型 对象名称 范围 备注
    PageContext pageContext 当前jsp页面范围内有效 JSP的域对象
    HttpServletRequest request 一次请求内有效 servlet的域对象
    HttpSession session 一次会话范围内有效 servlet的域对象
    会话(打开浏览器访问服务器,直到关闭浏览器)
    ServletContext application 整个web工程范围内都有效 servlet的域对象
    工程(只要web工程不停止,数据都在)

    请求范围将请求-处理-响应整合在一起了,请求范围能直接 get、set 值,不然如果分开的话请求 get、set,而响应 get、set,要都在一个域里面,就很复杂。这样的话就不是在一个域里面了,是在两个域里了,就很复杂。

    一次请求:页面跳到另一个页面 整个过程都是一次请求。我解释的没有错,从请求到处理请求都是请求过程(都在请求中),包含响应都是请求过程。
    请求过程:请求-处理-响应,都是请求过程。

    Request 和 Response 对象起到了服务器与客户机之间的信息传递作用。Request 对象用于接收客户端浏览器提交的数据,而 Response 对象的功能则是将服务器端的数据发送到客户端浏览器。
    请求-后台处理-响应
    服务器-服务器-浏览器

    其实,Tomcat 访问任何的资源都是在访问 Servlet!当然了,JSP 也不例外!JSP 本身就是一种 Servlet。为什么我说 JSP 本身就是一种 Servlet 呢?其实 JSP 在第一次被访问的时候会被编译为 HttpJspPage 类(该类是 HttpServlet 的一个子类)

    jsp就是在html里面写java代码,servlet就是在java里面写html代码…其实jsp经过容器解释之后就是servlet.只是我们自己写代码的时候尽量能让它们各司其职,jsp更注重前端显示,servlet更注重模型和业务逻辑。不要写出万能的jsp或servlet来即可。

    每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。

    EL 语法

    在 JSP 中访问模型对象是通过 EL 表达式的语法来表达。所有EL表达式的格式都是以“${}”表示。例如,${userinfo} 代表获取变量 userinfo 的值。当 EL 表达式中的变量不给定范围时,则默认在 page 范围查找,然后依次在 request、session、application 范围查找。也可以用范围作为前缀表示属于哪个范围的变量,例如:${pageScope.userinfo} 表示访问 page 范围中的 userinfo 变量。

    工作流程

    其实没有那么复杂,View 页面视图中为需要请求的东西设置了占位符,如 ${msg},这样发送请求;
    而我们后台接收到请求后,为这个请求的参数属性设置值而已,request.setAttribution()。
    前后端之间,通过request的set、get来实现数据交流。(model、map、modelmap也行)

  • 相关阅读:
    streamsets 集成 cratedb 测试
    streamsets k8s 部署试用
    streamsets rest api 转换 graphql
    StreamSets sdc rpc 测试
    StreamSets 相关文章
    StreamSets 多线程 Pipelines
    StreamSets SDC RPC Pipelines说明
    StreamSets 管理 SDC Edge上的pipeline
    StreamSets 部署 Pipelines 到 SDC Edge
    StreamSets 设计Edge pipeline
  • 原文地址:https://www.cnblogs.com/blknemo/p/13202619.html
Copyright © 2011-2022 走看看