Servlet快速入门

Posted ylcc-zyq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet快速入门相关的知识,希望对你有一定的参考价值。

一、servlet的生命周期

  1. 第一次调用到服务器关闭
  2. 如果servlet配置 load-on-startup为1时,生命周期为服务器启动到服务器关闭。
    注意:init方法是对servlet进行初始化的一个方法,会在servlet第一次加载进行存储时执行。destroy方法是在servlet被销毁时执行,也就是服务器关闭时。

二、Service方法和doGet方法和doPost方法的区别

  1. Service方法:可以处理get/post方式的请求,如果servlet中有service方法,会优先调用service方法
  2. doGet方法:处理get方式的请求
  3. doPost方法:处理post方式的请求
    注意:在父类的service方法中,会判断请求方式来执行doGet或者doPost方法。所以,一般不在重写的service中调用父类的service方法,避免出现错误。

三、request对象学习

  • 作用:request对象中封存了挡当前请求中的所有请求信息

  • 使用:

    • 获取请求行数据
      • req.getMethod(); 获取请求方式
      • req.getRequestURL(); 获取请求URL信息
      • req.getRequestURI(); 获取请求URI信息
      • req.getScheme(); 获取协议
    • 获取请求头数据
      • req.getHeader(键名); 返回指定的请求头信息
      • req.getHeaderNames(); 返回请求头的键名的枚举集合
    • 获取用户数据
      • req.getParameter(键名); 返回指定的用户数据
      • req.getParameterValues(键名); 返回同键不同值的请求数据(多选),返回的数组
      • req.getParameterNames() 返回所有用户请求数据的枚举集合
  • 注意:request对象由tomcat服务器创建,并作为实参给处理请求的servlet的service方法

四、respons对象学习

  • 作用:用来响应数据到浏览器的一个对象
  • 使用:
    • 设置响应头

      • setHeader(String name,String value);在响应头中添加响应信息,但是同键会覆盖
      • addHeader(String name,String value);在响应头中添加响应信息,但是不会覆盖
    • 设置响应状态

      • sendError(int num,String msg);自定义响应状态码
    • 设置响应实体

      • resp.getWriter().writer(String str);响应具体的数据给浏览器
    • 设置响应编码格式:

      • resp.setContentType("text/html;charset=utf-8");
      • resp.setHeader("content-type","text/html;charset=utf-8");

service请求处理代码流程

  • 设置响应编码格式
  • 获取请求数据
  • 处理请求数据(MVC思想)
  • 响应处理结果

五、请求中文乱码的解决

  1. 使用String进行数据重新编码
    uname=new String(uname.getBytes("iso8859-1"),"utf-8");
  2. 使用公共配置
    • get方式:
      步骤1:req.setCharacterEncoding("utf-8");
      步骤2:在tomcat的conf目录下的server.xml文件中,在Connector标签中增加属性useBodyEncodingForURI=true
    • post方式:
      req.setCharacterEncoding("utf-8");

六、servlet流程总结

  1. 浏览器发送请求到服务器
  2. 服务器接受请求,进行解析,创建request对象存储请求数据
  3. 服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
  4. servlet的方法进行请求处理(需要实现):
    • 设置请求编码格式
    • 设置响应编码格式
    • 获取请求信息
    • 处理请求信息
      • 创建业务层对象
      • 调用业务层对象的方法
    • 响应处理结果

七、请求转发

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

八、request对象的作用域

  • 作用:使用请求转发后,为了让不同的servlet之间进行数据的共享,实现数据在不同servlet之间的流转,使用request对象的作用域解决了一次请求内的不同servlet的数据共享问题。
  • 使用:
    • req.setAttribute(Object name,Object value)
    • req.getAttrubute(Object obj)
  • 作用域:基于请求转发,一次请求中的servlet共享
  • 注意:使用Reques对象进行数据流转,数据只在一次请求内有效
  • 特点:
    • 服务器创建
    • 每次请求都会创建
    • 生命周期一次请求

九、重定向

  • 问题:
    • 如果当前的请求,servlet无法进行处理怎么办
    • 如果使用请求转发,造成表单数据重复提交怎么办
  • 解决:使用重定向
  • 使用:resp.sendRedirect(String url);
  • 特点:
    • 两次请求,两个request对象
    • 浏览器地址栏信息改变
  • 时机:
    • 如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向
    • 如果请求被servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源

十、Cookie

  • 作用:解决了发送的不同请求的数据共享问题
  • 使用:
    • cookie的创建和存储
      • 创建Cookie对象:Cookie c = new Cookie(String name,String value);
      • 设置cookie
        • 设置有效期:c.setMaxAge(int seconds);
        • 设置有效路径:c.setPath(String uri);
      • 响应Cookie信息给客户端:resp.addCookie(c);
      • cookie的获取
        • 获取cookie信息数组: Cookie cks=req.getCookies();
        • 遍历数组获取cookie信息:使用for循环遍历即可,先进行非空判断
    • 注意:一个Cookie对象存储一条数据。多条数据,可以多创建几个Cookie对象进行存储。
  • 特点:
    • 浏览器端的数据存储技术
    • 存储的数据声明在服务器端
    • 临时存储:存储在浏览器的运行内存中,浏览器关闭即失效
    • 定时存储:设置了Cookie的有效期,存储在客户端的硬盘中,在有效期内符合路径要求的请求都会附带该信息。
    • 默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径,这样当浏览器访问设置的uri时,发送的请求才会带上cookie。

十一、session技术学习

  • 作用:解决一个用户的不同请求处理的数据共享问题
  • 原理:用户第一次访问服务器。服务器会创建一个session对象给此用户,并将该session对象的JSESSIONID使用cookie技术存储到浏览器中,保证用户的其他请求能够获取到同一个session对象,也保证了不同请求能够获取到共享的数据。
  • 特点:
    • 存储在服务器端,服务器进行创建
    • 依赖cookie技术
    • 一次会话
    • 默认存储时间是30分钟
  • 使用:
    • 创建或获取session对象:HttpSession hs = req.getSession();.如果请求中拥有session的标识符也就是JSESSIONID,则返回其对应的session对象;如果请求中没有session的标识符也就是JSESSIONID,则创建新的session对象,并将其JSESSIONID作为cookie数据存储到浏览器内存中。如果session对象失效了,也会重新创建一个session对象,并将其JSESSIONID存储在浏览器内存中。
    • 设置session存储时间:hs.setMaxInactiveInterval(int seconds);在指定时间内session对象没有被使用则销毁,如果使用了则重新计时。
    • 设置session强制失效:hs.invalidate();
    • 存储和获取数据
      • 存储:hs.setAttribute(String name,Object value);
      • 获取:hs.getAttribute(String name) 返回的数据类型为Object
      • 存储和取出的动作发生在不同的请求中,但是存储要先于取出执行。
    • 使用时机:一般用户在登录web项目时会将用户的个人信息存储到session中,供该用户的其他请求使用。
    • 总结:session解决了一个用户的不同请求的数据共享问题,只要在JSESSIONID不失效和session对象不失效的情况下,用户的任意请求都能够获取到同一个session对象。
    • 作用域:一次会话。在JSESSIONID和session不失效下为整个项目。
    • session失效处理:将用户请求中的JSESSIONID和后台获取到的SESSION对象的JSESSIONID进行比对,如果一直则session没有失效,如果不一致则证明session失效了。重定向到登录页面。
  • 注意:JSESSIONID存储在了cookie的临时存储空间中,浏览器关闭即失效

十二、ServletContext学习

  • 作用:解决不同用户共享数据的问题
  • 特点:服务器创建,用户共享
  • 作用域:整个项目内
  • 生命周期:服务器启动到服务器关闭
  • 使用:
    • 获取ServletContext对象

      1. ServletContext sc=this.getServletContext();
    • 使用ServletContext对象完成数据共享

      • 数据存储:sc.setAttribute(String name,Obejct value);
      • 数据获取:sc.getAttribute(String name);返回的是object类型
      • 不同的用户可以对ServletContext对象进行数据的存储,获取的数据不返回null。
    • 获取web.xml文件的全局配置数据(将静态数据和代码进行解耦)

      • sc.getInitParameter(String name);根据键名返回web.xml配置的全局数据的值,返回String类型。如果数据不存在返回null
      • sc.getInitParameterNames();返回简明的枚举
      • 配置方式:一对context-param只能存储一组键值对
        <context-param> <param-name>name</param-name> <param-value>value</param-value> </context-param>
    • 获取web目录下的绝对路径:String path=sc.getRealPath(String path).获取的路径为项目根目录,path参数为项目根目录中的路径。

十三、ServletConfig对象学习

  • 作用:获取在web.xml中给每个servlet单独配置的数据
  • 使用:
    • 获取ServletConfig对象:ServletConfig sc = this.getServletConfig()
    • 获取web.xml中servlet的配置信息:标签配置

十四、web.xml文件使用总结

  • 作用:存储项目相关的配置信息,保护Servlet.解耦一些数据对程序的依赖
  • 使用位置:
    • 每个Web项目中
    • Tomcat服务器中(在服务器目录conf目录中)
  • 区别:
    • web项目下的web.xml文件为局部配置,针对本项目的配置
    • Tomcat下的web.xml文件为全局配置,配置公共信息
  • 内容(核心组件):
    • 全局上下文配置(全局配置参数)
    • Servlet配置
    • 过滤器配置
    • 监听器配置
  • 加载顺序:web容器会按ServletContext->context-param->listener->filter->servlet这个顺序加载组件,这些元素可配置在web.xml文件中的任意位置。

以上是关于Servlet快速入门的主要内容,如果未能解决你的问题,请参考以下文章

Servlet快速入门

Servlet快速入门

tomcat和servlet快速入门教程!!!

Servlet快速入门

Servlet快速入门

Servlet的快速入门