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

适用场景:登录时,存取登录的用户信息,达到用户信息跨页面共享的效果。

后端:HttpSession session,session.setAttribute("stu", stu)

前端:${session['stu'].name}

生命周期:

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

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

  • **销毁: **

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

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

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

    注意:关闭浏览器再次访问会找不到 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也行)

【Web】Servlet三大作用域、JSP四大作用域的更多相关文章

  1. JSP四大作用域属性范围

    JSP四大作用域分别为:page, request ,session, application . 第一个作用域是page,他只在当前页面有效,也就是用户请求的页面有效,当当前页面关闭或转到其他页面时 ...

  2. jsp九大内置对象 ,三大指令,四大作用域,七大动作

    九大内置对象: application:应用程序对象 对整个web工程都有效 request:对当前请求的封装 pageConfig:只对当前页面有效,里面封装了基本request和session的对 ...

  3. java Web jsp四大作用域和九大内置对象

    JSP中的四大作用域:page.request.session.application 这四大作用域,其实就是其九大内置对象中的四个,为什么说他们也是JSP的四大作用域呢?因为这四个对象都能存储数据, ...

  4. JSP运行过程 JSP脚本 静态动态包含 jsp指令 jsp内置对象jsp四大作用域 jsp动作元素 EL表达式 JSTL 设计模式 JSP开发模式 EL内置对象

    Day38 JSP JSP的运行过程具体如下: (1)客户端发出请求,请求访问JSP文件. (2)JSP容器先将JSP文件转换成一个Java源文件(Java Servlet源程序),在转换过程中,如果 ...

  5. jsp四大作用域之request

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  6. jsp四大作用域

  7. jsp四大作用域之Application

    <%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding=& ...

  8. jsp四大作用域之Session

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  9. jsp四大作用域之page

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  10. JSP九大内置对象和四大作用域和Servlet的三大作用域对象

    一.JSP九大内置对象:内置对象(又叫隐含对象,有9个内置对象):不需要预先声明就可以在脚本代码和表达式中随意使用 内置对象特点: 由JSP规范提供,不用编写者实例化. 通过Web容器实现和管理 所有 ...

随机推荐

  1. Android增加USB Camera摄像头驱动支持

    一般情况下kernel需要添加以下宏 ================================= CONFIG_VIDEO_DEV=yCONFIG_VIDEOBUF2_CORE=yCONFIG ...

  2. 修复展锐SL8541E 偶现开机无法启动OTG

    哎,又是紫光展锐,真的拉啊!!! 问题是这样的,当USB口插上OTG线再开机,会偶现无法启动OTG.这个问题排查了好久,现在终于改好了,下面记录一下分析过程. 异常log[上]和正常log[下] 前面 ...

  3. linux 亲测wget安装7.3 liferay流程

    liferay wget 7.3版本安装1. 下载软件包 sudo wget https://sourceforge.net/projects/lportal/files/Liferay%20Port ...

  4. Linux 开发环境常用配置

    记录下我个人 Linux 开发环境常用配置,后续可以简单写个小脚本可以把一系列安装配置操作自动化一把. zsh install & conf https://blog.csdn.net/amo ...

  5. Qemu-KVM基本工作原理介绍

    本文分享自天翼云开发者社区<Qemu-KVM基本工作原理介绍>,作者:郑****文 1.KVM与Qemu关系 Qemu本身并不是KVM的一部分,而是一整套完整的虚拟化解决方案,它是纯软件实 ...

  6. ABB机器人IO板DSQC651维修检查方法

    ABB机器人作为工业自动化的重要设备,其稳定性和可靠性对于生产线的持续运行至关重要.然而,在实际使用中,由于各种原因,可能会出现ABB机器人IO板DSQC651故障,影响机器人的正常运行. 一.ABB ...

  7. nginx失效 nginx不起作用

    nginx失效的原因 今天大晚上的,服务器更新了,重启了,然后我重新开一下后端,nginx. 奇了个怪,一直给我报404,而且不是nginx给我报的啊,就是普通的404,完全404了. 我看nginx ...

  8. QT5笔记: 20. QStringListModel的使用

    主要为 :添加.插入.修改.删除.清空等操作 例子:本例子中QListView 没有做任何处理,只是拖放至ui文件,设置了布局 MainWindow.h #ifndef MAINWINDOW_H #d ...

  9. Linux - [-bash: jps: command not found]

    jps是jdk提供的一个查看当前java进程的小工具, 全称是 JavaVirtual Machine Process Status Tool $ jps [options] [hostid] opt ...

  10. 来自deepseek:php禁止跨域请求

    在PHP中,禁止API被跨域调用可以通过设置HTTP响应头来实现.跨域资源共享(CORS,Cross-Origin Resource Sharing)是一种机制,允许浏览器从不同域名的服务器请求资源. ...