一个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内置对象(传递数据)的更多相关文章

  1. 数据绑定-绑定Servlet内置对象

    数据绑定:获取用户提交的参数,绑定到入参的参数中,就叫数据绑定. 绑定Servlet内置对象: 测试:

  2. WebForm 内置对象、数据增删改、状态保持

    一.内置对象 1.Response对象:响应请求 Response.Write("<script>alert('添加成功!')</script>"); → ...

  3. servlet内置对象

    request                请求对象       类型javax.servlet.ServletRequest   作用域Request response              ...

  4. JS内置对象有哪些?

    JS内置对象分为数据封装类对象和其他对象 数据封装类对象:String,Boolean,Number,Array,和Object; 其他对象:Function,Arguments,Math,Date, ...

  5. servlet运行机制、Request内置对象和服务器端跳转

    servlet运行机制: 当发送一个请求到服务器的时候,容器(Tomcat)会判断该路径属于哪一个 Servlet 进行处理,Servlet 有一个抽象父类“HttpServlet”,这个类是一个模板 ...

  6. jsp九个内置对象、四个域对象及Servlet的三大域对象

    一,什么是内置对象? 在jsp开发中会频繁使用到一些对象,如ServletContext HttpSession PageContext等.如果每次我们在jsp页面中需要使用这些对象都要自己亲自动手创 ...

  7. jsp中9个内置对象与servlet对应关系及四个作用域

    参考:  <jsp&servlet学习笔记.第2版.林信良><JSR-245 JavaServer Pages 2.2 Maintenance Release Specifi ...

  8. JSP内置对象与servlet对应关系

    隐式对象 说明 out 转译后对应JspWriter对象,其内部关联一个PringWriter对象 request 转译后对应HttpServletRequest/ServletRequest对象 r ...

  9. Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结

    1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...

随机推荐

  1. C++基本之 运算符重载

    =====>友元运算符#include <iostream> using namespace std; class Test { public: Test(int a = 0) { ...

  2. jQuery操作CheckBox的方法(选中,取消,取值)详解

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...

  3. Educational Codeforces Round 89 (Rated for Div. 2) B. Shuffle(数学/双指针)

    题目链接:https://codeforces.com/contest/1366/problem/B 题意 大小为 $n$ 的数组 $a$,除了 $a_x = 1$,其余 $a_i = 0$,依次给出 ...

  4. Codeforces Round #645 (Div. 2) D. The Best Vacation (贪心,二分)

    题意:一年有\(n\)个月,每月有\(d_{i}\)天,找出连续的\(x\)天,使得这\(x\)天的日期总和最大,任意一年都能选. 题解:首先要先贪心,得到:连续的\(x\)天的最后一天一定是某个月的 ...

  5. A - 你能数的清吗 51Nod - 1770

    题目: 演演是个厉害的数学家,他最近又迷上了数字谜.... 他很好奇  xxx...xxx(n个x)*y 的答案中 有多少个z,x,y,z均为位数只有一位的整数. 大概解释一下: 22222*3 = ...

  6. 2017, X Samara Regional Intercollegiate Programming Contest M. Last Man Standing (贪心,双指针)

    题意:有\(n\)个吃鸡玩家,在某个时间段给你他们每个人的杀敌数,判断数据是否合法,并输出每个人对应的杀敌情况. 题解:刚开始写的是直接暴力枚举,向后去找并且标记,然后存到vector最后输出,结果一 ...

  7. 二、Jmeter 后置处理器(BeanShell PostProcessor)

    1.新建JDBC Request,如下图所示: 重要的参数说明: Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable N ...

  8. C++实现二叉树的基本操作:建立、遍历、计算深度、节点数、叶子数等

    题意: 代码实现: #include<iostream> #include<queue> #include<stack> using namespace std; ...

  9. pyhook的简单使用

    实验内容: 通过python编程调用windows的api,编写键盘和鼠标监控的hook,将相关信息保存记录到txt文档中. 实验步骤: 1.Hook技术,pyHook3和pywin32简介 1.1  ...

  10. codeforces 1036B - Diagonal Walking v.2【思维+构造】

    题目:戳这里 题意:起点(0,0),终点(n,m),走k步,可以走8个方向,问能不能走到,能走到的话最多能走多少个斜步. 解题思路:起点是固定的,我们主要分析终点.题目要求走最多的斜步,斜步很明显有一 ...