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对象,所以这个对象是所有用户共享的,大家都可以向这个对象里面存数据,也可以再拿出来.因为这个对象一个项目中只有一个。