1.HttpServlet抽象类

继承结构

  • HttpServlet中有doGet() doPost()等方法,其实现子类可以重写
  • HttpServlet中也有service()方法,即模板设计模式,判断当前请求
    是GET还是POST。如果是GET请求,那么会去调用本类的doGet()方法,
  • HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持(如GET POST等请求方式的区分、)
  • 通常我们都会通过继承HttpServlet来完成自定义的Servlet

2.Servlet对象生命周期

  • 一个Servlet对象的根接口
  • Servlet的实现类 的实例只能由Http服务器创建
  • 一个类一个唯一实例对象
  • 服务器启动时自动创建,服务器关闭时自动销毁(不像Spring的Bean可以自己决定懒汉还是饿汉)

3.HttpServletRequest接口

  • 是对ServletRequest接口的Http功能封装
  • 可以获取请求行、请求头、请求体(用getInputStream()但默认只能读取一次,除非用自行持久化)
  • Http服务器已经对该接口有几个实现类
  • 作为“入参”在多个Servlet对象(请求)之间传递
  • HttpServletRequest 的方法:
    • String getParameter(String paramName):获取指定请求参数的值;
    • String getMethod():获取请求方法,例如GET或POST;
    • String getHeader(String name):获取指定请求头的值;
    • void setCharacterEncoding(String encoding):设置请求体的编码!因为GET请求没有请求体,所以这个方法只只对POST请求有效。当调用
      request.setCharacterEncoding(“utf-8”)之后,再通过getParameter()方法获取参数值时,那么参数值都已经通过了转码,即转换成了UTF-8编码。所以,这个方法必须在调用getParameter()方法之前调用!
  • 还可以getCookies() getSession
  • HttpServletRequest虽然可以获取Cookie,Session,但是他的作用域是一次请求

4.HttpServletResponse接口

  • void setCharacterEncoding(String encoding):用来设置字符响应流的编码,例如在调用setCharacterEncoding(“utf-8”);之后,再response.getWriter()获取字符响应流对象,这时的响应流的编码为utf-8,使用response.getWriter()输出的中文都会转换成utf-8编码后发送给客户端;
  • void setHeader(String name, String value):向客户端添加响应头信息,例如setHeader(“Refresh”, “3;url=http://www.baidu.cn”),表示3秒后自动刷新到http://www.baidu.cn;有没有那种既视感~
  • void setContentType(String contentType):该方法是setHeader(“content-type”, “xxx”)的简便方法,即用来添加名为content-type响应头的方法。content-type响应头用来设置响应数据的MIME类型,例如要向客户端响应jpg的图片,那么可以setContentType(“image/jepg”),如果响应数据为文本类型,那么还要台同时设置编码,例如setContentType(“text/html;chartset=utf-8”)表示响应数据类型为文本类型中的html类型,并且该方法会调用setCharacterEncoding(“utf-8”)方法;ContentType资料
  • void sendError(int code, String errorMsg):向客户端发送状态码,以及错误消息。例如给客户端发送404:sendError(404, “您要查找的资源不存在!”)。
  • PrintWriter getWriter():获取字符响应流,使用该流可以向客户端输出响应信息。例如response.getWriter().print(“<h1>Hello JavaWeb!</h1>”);
  • ServletOutputStream getOutputStream():获取字节响应流,当需要向客户端响应字节数据时,需要使用这个流,例如要向客户端响应图片;
  • print()方法:用上面两个流对象来调用,即把输出流写到响应体

serContentType参考

重定向参考

5.GET和POST请求

HTTP报文格式

  • 实际上HTTP请求格式中,请求方法请求体正文都是写在二进制流中的,不存在说GET方式就不能存在请求体
  • 但是HTTP协议并没有为GET请求的body部分赋语义,即不要求也不禁止
  • 但是像谷歌浏览器则在此基础上禁止了GET请求携带body
  • 如果服务提供者支持GET请求携带body,那么可以放心使用,但是不建议。
  • GET请求的参数Param直接写在了URL上,相对更不安全; 而POST请求的参数写在了body中,安全且能携带更多的信息
  • 二者都是明文传输,没有加密的数据流都是明文传输

6.重定向和转发

资源重定向

  • 外部跳转
  • 需要完整URL
  • 重定向的请求必须是GET方式,一来本质是通过地址栏访问,只能是GET;二来可以防止对外部网站用POST进行攻击
  • response.sendRedirect(“www.baidu.com”)

请求转发

  • 内部跳转
  • 只需要相对资源路径URI
  • 因为浏览器只发送了一次请求,只有一个Http请求协议包,所以请求转发之间的所有Servlet对象都可以共享这同一个Request和Response
  • 且请求方式可以一样(共享Request对象携带的请求体)

7.多个Servlet之间数据共享的方案

ServletContext接口——服务器全局域

  • 服务器级别的全局作用域对象
  • 相当于服务器中存储的一个Map
  • 服务器启动时创建唯一ServletContext实例,服务器关闭时销毁
  • 通过request.getServletContext()获取,然后调用setAttiribute()或getAttribute()
  • 相当于一个永久的Session

Cookie类——浏览器域

  • 键值对,k,v只能是String类型
  • 自动存在浏览器中,可以通过setMaxAge()来设置该Cookie的存活时间在这里插入图片描述

HttpSession类——会话域

  • 键值对,k是String类型,v可以为任意类型,因为他存放在服务器中
  • 类似于HashMap,通过String类型的k来获取任意类型的v
  • request.getSession().getAttribute(“key”)就可以获取任意类型的value了

request.getSession(boolean create)

可以看到,空参相当于create=true,即如果当前发送请求的浏览器并没有对应的session存在于服务器中,则创建一个目标浏览器的唯一session

空参
有参

Session的创建和销毁

  • 首先:Session就是HttpSession,HttpSession是没有父类的
  • 创建:
    • 当浏览器发送请求时,服务器检测到Cookie中没有JSEESIONID的键值对,就自动在服务器内部创建一个Session对象,并生成一个uuid即JSEESIONID自动写入到reponse.addCookie(“JESSIONID”,“这是一串随机码”)中
    • 此后的浏览器发送请求,只要Cookie中有JESSIONID,服务器就可以request.getSession()获取
    • 这个Cookies中的JSESSIONID只能存在于浏览器缓存中,不能设置,当然你可以自己手动设置一个JESSIONID设置存活时间
  • 销毁:
    • 如果浏览器关闭导致存放JSESSIONID的Cookie失效,服务器还会一直持有这个Session对象吗?
    • 并不会!Tomcat默认的空闲时间是30min,超过这个时间就会销毁服务器中对应的session对象

HttpServletRequest接口——请求域

上面已经写了很多,这里不再赘述了。

参考:
1

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐