Servlet深入学习之请求转发、重定向、Cookie、Session、ServletContext、ServletConfig

基于前面两篇文章,我们已经具备一定的servlet基础,接下来我们要对servlet做更深入的剖析,这篇文章主要针对请求转发、重定向、Cookie、Session、ServletContext、servletConfig的作用以及使用方式做一个总结,并针对这些知识点做了一个小的web应用,读者如果需要可以在github上进行下载,下载链接:https://github.com/hlc0216/Login。

一、请求转发

  • 作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。
  • 使用方式req.getRequestDispatcher("要转发的地址").forward(req, resp); //地址:相对路径,直接书写servlet的别名即可
  • 特点:一次请求,浏览器地址栏不改变
  • 注意:请求转发后直接return结束即可!!

问题:使用请求转发后,不同的sevlet之间怎么进行数据的共享呢?或者说数据怎么从一个servlet流转给另外一个servlet呢?
解决方法:使用request对象的作用域

request对象作用域

request.setAttribute(Object name,Object value);
request.getAttribute(Object name);
  • 作用:解决了一次请求内的不同servlet的数据(请求数据+其他数据)共享问题。
  • 作用域:基于请求转发,一次请求中的所有servlet共享。
  • 特点:服务器创建;每次请求都会创建;生命周期一次请求
  • 注意:使用Request对象进行数据流转,数据只在一次请求内有效。

二、重定向

问题1:如果当前的请求,servlet无法进行处理怎么办?如果使用请求转发,造成表单数据重复提交怎么办?
解决:使用重定向

  • 使用方式:Response.sendRedirect(“路径”); //本地路径为:uri ;网络路径为:定向资源的url
  • 特点: 两次请求

问题2:请求转发和重定向的区别?
解答

  1. 请求转发只能访问当前项目的资源,而重定向可以访问外部的项目的资源。
  2. 请求转发只有一个request对象(一次请求)。重定向是两个request对象(两次请求,两个request对象不一样)。
  3. 请求转发属于服务器行为,重定向属于浏览器行为(站点的根目录–webapps里面);
  4. 使用请求转发,使用request对象作用域获取参数数据(请求转发整个过程只有一个request对象)而重定向使用request域对象保存了数据,但是获取不到数据(重定向的整个过程产生两个request对象,不一样的对象)。

三、Cookie

  • 作用:解决了发送的不同请求的数据共享问题。
  • 特点:浏览器的数据存储技术。
  • 使用方式
  1. 创建cookie对象:
    Cookie ck =new Cookie("mouse", "lenovo");

  2. 设置cookie:
    ck.setMaxAge(3*60*60); //设置cookie的有效期(以秒为单位)
    ck.setPath("test"); //设置cookie的有效路径

  3. 响应cookie信息给客户端:
    resp.addCookie(ck);

  4. cookie的获取
    Cookie[] cks = req.getCookies()

  5. 遍历数组获取cookie信息

	if (cks != null) {
			for (Cookie c : cks) {
				String name = c.getName();
				String value = c.getValue();
				System.out.println(name + ":" + value);
			}
		}
  • 注意
  1. 一个Cookie对象存储一条数据;创建多条数据可以创建多个cookie对象;
  2. 存储的数据声明在服务器端:
    临时存储:存储在浏览器的运行内存中,浏览器关闭即失效。
    定时存储:设置了cookie的有效期,存储在客户端的硬盘中,在有效期内符合路径要求的>请求都会附带该信息。
  3. 默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径。

四、Session

问题:一个用户的不同请求处理的数据共享怎么办??
解决:使用Session技术
用户第一次访问服务器,服务器会创建一个session对象给用户,并将该session对象的
JSESSIONID使用Cookie技术存储到浏览器中,保证用户的其他请求能够获取到同一个session对象,也保证了不同请求能够获取到共享数据。
特点

  1. 存储在服务器端
  2. 服务器进行创建
  3. 依赖Cookie技术
  4. 一次会话(不关浏览器这段时间)
  5. 默认存储时间是30分钟

作用:解决了一个用户不同请求处理的数据共享问题
使用方式:

  1. 创建session对象/获取session对象:HttpSession hs = req.getSession();
  • 如果请求中拥有session的标识符即JSESSIONID,则返回其对应的session对象。
  • 如果请求中没有session的标识符即JSESSIONID,则创建新的session对象,并将其JSESSIONID作为cookie数据存储到浏览器中。
  • 如果session对象失效了,也会重新创建一个session对象,并将其JSESSIONID存储在浏览器内存中。
    注意:JSESSIONID存储在Cookie的临时存储空间中,浏览器关闭即失效。
  1. 设置session的存储时间(可选):hs.setMaxInactiveInterval(30*60);//单位是秒

注意:在指定时间内的session对象没有被使用则销毁,如果使用了则重新计时。

  1. 存储和获取数据:hs.setAttribute(String name, Object value);//存储 hs.getAttribute(String name);//获取,返回的数据类型为Object

注意:存储的动作和取出的动作发生在不同的请求中,但是存储要先于获取执行。

使用时机:一般用户在登陆web项目时会将用户的个人信息存储到Sesion中,供该用户的其他请求使用。
总结:

  1. Session解决了一个用户的不同请求的数据共享问题,只要在JSESSIONID不失效和swssion对象不失效的情况下。
  2. 用户的任意请求在处理时都能获取到同一个session对象。
  3. 作用域:一次会话(在JSESSION和session对象不失效的情况下为整个项目内)
  4. Session 失效处理:将用户请求中的JSESSIONID和后台获取的session对象的JSESSIONID进行比对,如果一致则session没有失效,如果不一致则证明session失效了(当然还有其他方法比如判断是否是null),重定向到登陆页面,让用户重新来过。

Cookie和Session的区别

  1. Cookie 在客户端(浏览器、易伪造、不安全),Session 在服务器端(会消耗服务器资源)。
  2. Cookie 只能保存ASCII字符串,如果是Unicode字符或者二进制数据需要先进行编码。Cookie中不能直接存取Java对象。 Session能够存取很多类型的数据,包括String、Integer、List、Map等,Session中也可以保存JJava对象。

五、ServletContext

问题:Request解决了一次请求内的数据共享问题,Session解决了同一用户不同请求的数据共享问题,那么不同用户间的数据共享该怎么办呢??
解决:使用servletContext对象解决不同用户的数据共享问题。

  • 原理:
    ServletContext对象由服务器进行创建,一个项目只有一个对象。不管在项目的任意位置进行获取得到的都是同一个对象,那么不同用户发起的请求获取到的也就是同一个对象了,该对象由用户共同拥有。
  • 特点
  1. 服务器创建
  2. 用户共享
  3. 一个项目只有一个
  4. 生命周期:服务器启动到服务器关闭
  5. 作用域:项目内
  • 使用方式:
  1. 获取servletContext对象
 //第一种方式
ServletContext sc =this.getServletContext();
//第二种方式
ServletContext sc2 = this.getServletConfig().getServletContext();
//第三种方式
ServletContext sc3 = req.getSession().getServletContext();
  1. 使用servletContext对象完成数据共享
//数据存储
Sc.setAttribute(String name,Object value);
//数据获取
Sc.getAttribute(String name);

注意 :

  1. 不同的用户可以给ServletContext对象进行数据的存取
  2. 存取的数据不存在返回null
  1. 获取项目中web.xml文件中的配置数据
sc.getInitParameter(String name);//根据键的名字返回String类型的值
Sc.getInitParameterNanmes();//返回键名的枚举

配置方式:一组标签只能存储一组键值对数据,多组可以声明多个进行存储

<context-param> 
<param-name>namepara-name>
<param-value>valuepara-value> 
context-param>
  • 作用:将静态数据和代码进行解耦。

  • 获取项目webroot下的资源

//获取项目根目录下的资源的绝对路径
String path=sc.getRealPath(String path);
String path=sc.getRealPath("/doc/1.txt");

获取的路径为项目根目录,path参数为根目录中的路径

//获取webroot下的资源的流对象
InputStream is = sc.getResourceAsStream(String path);

注意:此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要使用类加载器获取。

六、ServletConfig对象学习

问题:如何获取web.xml中每个servlet单独配置的数据呢?
解决:使用servletConfig对象

使用如下:

  • web.xml中的配置数据
 <init-param>
    <param-name>configparam-name>
    <param-value>utf-8param-value>
 init-param>
  • 获取servletConfig对象
//获取ServletConfig对象
	ServletConfig sc = this.getServletConfig();
	String str = sc.getInitParameter("config");

七、Web.xml文件使用总结

作用: 存储项目相关的配置信息,保护servlet,解耦一些数据对程序的依赖。
使用位置:(1)每个web项目中 (2) tomcat服务器中
区别:web项目下的web.xml文件为局部配置,针对本项目的位置,Tomcat下的web.xml文件为全局配置,配置公共信息。
内容(核心组件)

  • 全局上下文配置(全局配置参数)
  • servlet配置
  • 过滤器配置
  • 监听器配置

加载顺序:web容器会按照servletContext->context-param->listener->filter->servlet这个顺序加载组建,这些元素可以配置在web.xml文件中的任意位置。
加载时机:服务器启动

八、servlet流程总结

  1. 浏览器发送请求到服务器(请求)
  2. 服务器接收浏览器的请求,进行解析,创建request对象存储请求数据
  3. 服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
  4. servlet的方法执行进行请求处理(这是我们程序员做的,上面是服务器自动帮我们做的)
//设置请求编码格式
//设置响应编码格式
//获取请求信息
//处理请求信息
   //创建业务层对象
   //调用业务层对象的方法
//响应处理结果
  1. 数据流转流程
    浏览器–》服务器–》数据库
    数据库–》服务器–》浏览器

你可能感兴趣的:(Java-webapp)