servlet内置对象(传递数据)
一个servlet向另一个servlet发送数据,可以将数据放置在一个容器中(io、数据库、servlet的内置对象),servlet的内置对象成本最小。
一共有三个内置对象。
| 名字 | 类型 |
| request | HttpServletRequest |
| session | HttpSession |
| application | ServletContext |
1.Request对象
1.1获取方式:
在doGet(HttpServletRequest req,HttpServletResponse resp)或者doPost(HttpServletRequest req,HttpServletResponse resp)方法参数中,可以直接使用该对象。
1.2存取数据方式:
存放数据:req.setAttribute("key",value); key都是String类型 value值为任意类型,相同key值得数据会被覆盖。一定要先存数据再转发。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//生命周期为一次请求
request.setAttribute("name", "梁伟");
request.setAttribute("name", "摩西");
request.setAttribute("age", 15);
request.getRequestDispatcher("/r2").forward(request, response);
}
取数据:req.getAttribute("key");
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object msg = request.getAttribute("name");
Object age = request.getAttribute("age");
System.out.println(msg);
System.out.println(age);
}
删除数据:req.removeAttribute("key");
1.2生命周期:
客户端每次发请求,服务器端就会创建一个新的request对象,本次访问结束后,该request对象就会被销毁,因此生命周期为一次请求。
1.3作用范围:使用request存取数据只能在一次请求内起作用。比如服务器内部跳转的时候(因为服务器内部跳转客户端只发一次请求)。 浏览器中的url不变代表一次请求。
客户端重定向是不行的,因为客户端重定向会发出多个请求(多个request对象),一个请求结束,下一个请求是获取不到上一个请求的数据的。

2.session(是存在服务器 端的一个对象) 默认30分钟自动销毁,一般把登录的信息放在session中,保护了信息安全。
2.1获取方式:
HttpSession session = request.getSession();
HttpSession session = request.getSession(false);
HttpSession session = request.getSession(true);
无参或者参数为true代表request有对应的session,那么就返回这个session,没有就创建一个。
如果参数为false,代表request有对应的session则返回这个session,没有就返回null。
存储数据的方式和request对象的方式一样,都是调用setAttribute(参数1,参数2)、getAttribute(参数1)方法。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.setAttribute("name", "tom");
session.setAttribute("name2", "jery");
session.setAttribute("nam3", new Person());
// 销毁session对象
//session.invalidate();
//session.setMaxInactiveInterval(5);
response.sendRedirect(request.getContextPath() + "/session2");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(false);
System.out.println(session.getAttribute("name"));
}

chrome浏览器向服务器发送数据,发送时会携带JSESSIONID(请求头中),发送完成时,服务器会调用getSession方法根据ISEESIONID查找对应的session对象(有则直接使用,没有就创建),此时并没有session对象,所以会创建session对象,HttpSession session = req.getSession();创建完后往session里存了数据,接下来发生了重定向,tomcat会把请求返回给浏览器,并携带session对应的JSESSIONID,浏览器会存储该id,当下一次访问时会携带这个id,通过id查找对应的session对象,发现可以找到session对象(所以不需要再去创建)此时这个session对象就是session2,这两个session是同一个session对象,当使用火狐直接访问sessionn2时并不能拿到数据,是因为火狐浏览器也有自己唯一的JSESSIONID,当他访问session2时,这个id并不能找到对应的session对象,所有便会重新创建一个session对象,session3,此时session3中并没有任何数据,所以访问不到数据。
2.2生命周期:
session创建:第一次调用该方法 request.getSession()创建session对象。
session销毁:
session.invalidate();
session如果自动超时的话,也会被销毁,默认时间是30分钟
超时时间可以在代码或者web.xml中设置
// session超时时间是指:客户端不与服务器进行交互的时间
//在代码中设置:
session.setMaxInactiveInterval(5); //单位是秒
// 在web.xml中设置 1分钟超时,负数或者0为不限制时间
<session-config><session-timeout>1</session-timeout></session-config>
2.3作用范围:
在一个会话中起作用,一个会话可以包括多个request请求,所以可以放在session中被多个request请求所共享。
tomcat服务器正常关闭时,tomcat会把session对象序列化到本地文件中,如果非正常关闭,将不会序列化到本地。若要实现序列化,那么session里面的数据必须实现序列化接口。
3.application
3.1获取方式
request.getServletContext();
this.getServletContext();
request.getSession().getServletContext();
this.getServletConfig().getServletContext();
// 注意:无论哪一种方式,拿到的都是同一个application对象
3.2存取数据方式:
删除、存取数据和session一样。
3.3生命周期:
整个项目在运行期间,只有一个application对象,所以这个对象是所有用户共享的,大家都可以向这个对象里面存数据,也可以再拿出来.因为这个对象一个项目中只有一个。
servlet内置对象(传递数据)的更多相关文章
- 数据绑定-绑定Servlet内置对象
数据绑定:获取用户提交的参数,绑定到入参的参数中,就叫数据绑定. 绑定Servlet内置对象: 测试:
- WebForm 内置对象、数据增删改、状态保持
一.内置对象 1.Response对象:响应请求 Response.Write("<script>alert('添加成功!')</script>"); → ...
- servlet内置对象
request 请求对象 类型javax.servlet.ServletRequest 作用域Request response ...
- JS内置对象有哪些?
JS内置对象分为数据封装类对象和其他对象 数据封装类对象:String,Boolean,Number,Array,和Object; 其他对象:Function,Arguments,Math,Date, ...
- servlet运行机制、Request内置对象和服务器端跳转
servlet运行机制: 当发送一个请求到服务器的时候,容器(Tomcat)会判断该路径属于哪一个 Servlet 进行处理,Servlet 有一个抽象父类“HttpServlet”,这个类是一个模板 ...
- jsp九个内置对象、四个域对象及Servlet的三大域对象
一,什么是内置对象? 在jsp开发中会频繁使用到一些对象,如ServletContext HttpSession PageContext等.如果每次我们在jsp页面中需要使用这些对象都要自己亲自动手创 ...
- jsp中9个内置对象与servlet对应关系及四个作用域
参考: <jsp&servlet学习笔记.第2版.林信良><JSR-245 JavaServer Pages 2.2 Maintenance Release Specifi ...
- JSP内置对象与servlet对应关系
隐式对象 说明 out 转译后对应JspWriter对象,其内部关联一个PringWriter对象 request 转译后对应HttpServletRequest/ServletRequest对象 r ...
- Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结
1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...
随机推荐
- BZOJ 4516. [Sdoi2016]生成魔咒【SAM 动态维护不同子串数量】
[Sdoi2016]生成魔咒 动态维护不同子串的数量 想想如果只要查询一次要怎么做,那就是计算各个点的\(len[u]-len[link[u]]\)然后求和即可,现在要求动态更新,我们可以保存一个答案 ...
- Codeforces #640 div4 F~G (构造二连弹)
题意:求一个只由\(01\)组成的字符串,使得它所有长度为\(2\)的子串满足:每对子串的数字和为\(0,1,2\)的个数为\(a,b,c\). 题解:我们先考虑子串数字和为\(1\)的情况,构造出一 ...
- CF1474-C. Array Destruction
CF1474-C. Array Destruction 题意: 题目给出一个长度为\(2n\)的正整数序列,现在问你是否存在一个\(x\)使得可以不断的进行如下操作,直到这个序列变为空: 从序列中找到 ...
- 部署开源IP管理工具phpIPAM
一.安装环境程序: yum install httpd mariadb-server php php-cli php-gd php-common php-ldap php-pdo php-pear p ...
- python 调用麦克风;摄像头;截屏;
# -*- coding: utf-8 -*- """ Created on Mon Jun 24 14:47:35 2019 @author: erio "& ...
- Leetcode(23)-合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1-&g ...
- Bootstrap 中的 aria-label 和 aria-labelledby
正常情况下,form表单的input组件都有对应的label.当input组件获取到焦点时,屏幕阅读器会读出相应的label里的文本. <form> <div class=" ...
- 016.NET5_MVC_视图组件扩展定制
视图组件 1. 呈现页面响应的某一部分而不是整个响应 2. 包括在控制器和视图之间发生的关注分类和可测试优势 3.可以具有参数和业务逻辑 4. 通常在页面局部调用 如何自定义视图组件? 1.Razor ...
- Spring配置声明式事务
Spring的事务有两种配置,一种是编程式,另一种是声明式,这里我们配置的是声明式事务 <?xml version="1.0" encoding="UTF-8&qu ...
- 【Alpaca】.Net版开源配置中心 - 技术选型 Vue 3.0
是否可以用 Vue 3.0 现有的Vue 2.* 不推荐,坐等Vue 3.0出迁移工具吧,手动改的话工作量还是不小的 新项目 考虑下团队内对Vue + TS + VS Code的熟练程度.过程中你会遇 ...