Bootstrap

程序媛JavaEE第三章Servlet基础-干知识点总结

目录

了解JavaEE

浏览器和服务器的交互模式

HTTP协议

HTTP协议的特点

HTTP协议之URL

HTTP协议之请求

HTTP协议之响应

Tomcat服务器

Servlet的实现

Servlet的实现

Servlet的工作流程

Servlet的其他实现方法

Servlet的生命周期

HttpServletRequest对象

接收请求

请求乱码问题

请求转发 

HttpServletRequest对象的使用

HttpServletResponse对象

响应数据

响应乱码问题

 重定向


因为程序媛JavaEE第一章Servlet入门-超详细教程-CSDN博客真的超级详细,手把手教程,所以篇幅有点长,所以本篇对其进行的知识点提炼!!!

了解JavaEE

  • 概述:JavaEE(Java Enterprise Edition),Java企业版,是一个用于企业级web开发(不需要使用控制台)平台。
  • 作用:JavaEE平台规范了在开发企业级web应用中的技术标准。
  • 包含:在JavaEE平台共包含了13个技术规范,分别是:JDBC、JNDI、EJB、RMI、Servlet、JSP、XML、JMS、Java IDL、JPA、JTA、JavaMail和JAF。

浏览器和服务器的交互模式

  • 客户端:浏览器
  • 服务端:服务器
  • 请求:客户端发送数据给服务端的过程
  • 响应:服务端返回给客户端的过程
  • HTTP协议:请求和响应的标准

HTTP协议

  • 概述:HTTP 协议(Hypertext Transfer Protocol, 超文本传输协议),是请求和响应的标准协议,规定了浏览器和万维网服务器之间互相通信的规则。
  • 规定:客户端发送给服务器的格式叫"请求协议";服务器发送给客户端的格式叫"响应协议"。

HTTP协议的特点

  1. 支持客户/服务器模式。
  2. 简单快速:HTTP协议规则简单,规模小,通信速度快。
  3. 灵活:HTTP协议允许传输任意类型的数据对象。
  4. 无连接:每次只处理一个请求,完成一次请求与响应后,立即断开连接,节省传输时间。eg:HTTP1.1版本后支持可持续链接。
  5. 无状态:对事务处理没有记忆,即在本次传输中,不记得上一次传输的信息。

HTTP协议之URL

http://host[:port]/[abs_path]
  • http:HTTP协议
  • host:主机域名或IP地址
  • port:端口号
  • abs_path:指定请求资源的URI
  • 请求参数用?拼接
  • 多个请求参数之间用&相连

HTTP协议之请求

  • 浏览器向服务器发送请求的3种方式:a.浏览器输入URL地址  b.表单提交  c.超链接
  • HTTP请求由三部分组成:请求行、请求头、请求体 
    eg:请求方法get中没有方法体,post方法有
  • 请求行:以方法符号开头,后面跟着请求的URI和协议的版本
    格式:Method Request-URI HTTP-Version CRLF
  • 请求体:用于说明发送请求的是谁,或者客户端的喜好,便于服务器提供更好的响应。
    格式:key:value
  • 请求体:客户端传递给服务器的数据。一般用来存储post的数据。
    1. get请求:没有请求体,浏览器使用查询字符串的方式进行数据的传递,即:query string Parameters
    2. post请求:请求的数据在请求体内

HTTP协议之响应

  • HTTP响应由三部分组成:响应行、响应头、响应体
  • 响应行:与请求消息相比,多一个“响应状态码”,响应给客户端本次请求的处理结果。
  • HTTP状态码5种类型:
  1. 1xx Informational (信息性状态码)
  2. 2xx Success (成功状态码)
  3. 3xx Redirection (重定向状态码)
  4. 4xx Client Error (客户端错误状态码)
  5. 5xx Server Error (服务器错误状态码)
  • 响应头:浏览器通过获取响应头中的信息,判断如何处理响应结果。
    格式:key:value
  • 响应体:响应的消息体

Tomcat服务器

Servlet的实现

  • Servlet 是 Server 与 Applet 的缩写,是服务端小程序的意思。
  • 要实现 web 开发,需要实现 Servlet 标准。
  • Servlet创建、使用、销毁都由Servlet 容器进行管理(Servlet 容器:如Tomcat)
  • Servlet可以处理 HTTP 协议相关的所有内容
  • Servlet是JavaWeb开发的三大组件之一(另外两个是过滤器filter与监听器listener,后面也会学习)
  • 创建web项目详细教程, 请移步程序媛JavaEE第一章Servlet入门-超详细教程-CSDN博客

Servlet的实现

  • 继承HttpServlet 类:实现 Servlet 规范
  • 重写service方法:继承HttpServlet类,只能满足接收请求,因为接收请求后要对请求进行分析,所有还要重写service方法
  • 设置注解:Servlet对外访问路径的设置,特定的请求 对应特定的资源

Servlet的工作流程

  1. 通过请求头 得知浏览器访问的是哪个主机
  2. 通过请求行 得知访问的哪个web应用
  3. 通过请求行种的请求路径 得知访问的哪个资源
  4. 通过前面获取到的资源路径 在配置中匹配到真实路径
  5. 服务器创建servlet对象
  6. 调用service方法,生成HttpServletRequest实现类对象和HttpServletResponse实现类对象,来处理请求和响应
  7. service方法完成后 返回服务器 由服务器将response缓冲区的数据取出 并以http响应格式发送回给浏览器

Servlet的其他实现方法

  • 实现Servlet规范的3种方法:
  1. extends HttpServlet 类(推荐)
  2. extends GenericServlet 抽象类
  3. implements Servlet 接口
  • Servlet对外访问路径的设置:
  1. 设置注解:@WebServlet(“/路径”)
  2. web.xml配置文件:启动web项目后,servlet容器会读取web.xml配置文件,可以在web.xml中对servlet路径做配置,具体代码 请移步程序媛JavaEE第一章Servlet入门-超详细教程-CSDN博客

Servlet的生命周期

  1. 初始化:请求到达容器,容器查找servlet对象是否存在,不存在则进行初始化
    init 初始化方法,在 Servlet 实例创建之后执行,系统方法服务器自动调用
  2. 调用:容器调用servlet对象的service方法
    service 就绪/调用/服务方法,每次有请求到达某个 Servlet 方法时执行,用来处理请求,系统方法服务器自动调用
  3. 销毁:容器关闭时,将程序中Servlet销毁
    destroy 销毁方法,Servlet 实例销毁时执行,系统方法服务器自动调用
  • Servlet 的生命周期:
  1. Web Client 向 Servlet 容器(Tomcat)发出 Http 请求
  2. Servlet 容器接收 Web Client 的请求
  3. Servlet 容器根据反射构建Servlet对象
    1. 构建HttpServletRequest 实现类对象、HttpServletResponse 实现类对象 ,处理请求和响应

    2. Servlet 容器调Servlet 对象的service 方法,把HttpServletRequest 实现类对象 与 HttpServletResponse 实现类对象 作为service的参数,供给方法内部使用

    3. Servlet 对象调用 HttpServletRequest 实现类对象的有关方法,获取 Http 请求信息

    4. Servlet 对象调用 HttpServletResponse实现类 对象的有关方法,生成响应数据

    5. Servlet 容器把 Servlet对象 的响应结果传给 Web Client

HttpServletRequest对象

  • 主要作用是用来接收客户端发送过来的请求信息

接收请求

常用方法

// 获取客户端请求的完整URL (从http开始,到?前面结束)
String url = request.getRequestURL().toString();
System.out.println("获取客户端请求的完整URL:" + url);
//  获取客户端请求的部分URL (从站点名开始,到?前面结束)
String uri = request.getRequestURI();
System.out.println("获取客户端请求的部分URL:" + uri);
// 获取请求行中的参数部分
String queryString = request.getQueryString();
System.out.println("获取请求行中的参数部分:" + queryString);
// 获取客户端的请求方式
String method = request.getMethod();
System.out.println("获取客户端的请求方式:" + method);
// 获取HTTP版本号
String protocol = request.getProtocol();
System.out.println("获取HTTP版本号:" + protocol);
// 获取webapp名字 (站点名)
String webapp = request.getContextPath();
System.out.println("获取webapp名字:" + webapp);

获取请求参数

// 获取指定名称的参数,返回字符串
String uname = request.getParameter("uname");
System.out.println("uname的参数值:" + uname);
// 获取指定名称参数的所有参数值,返回数组
String[] hobbys = request.getParameterValues("hobby");
System.out.println("获取指定名称参数的所有参数值:" + Arrays.toString(hobbys));

请求乱码问题

  • 解决get方法乱码:Tomcat8及以上,get方法不会中文乱码
  • 解决post乱码:

    中文乱码原因:传过来的字节转字符串默认的解码方式为ISO-8859-1,改为UTF-8就可以了,但是这种方式只针对 POST 有效(必须在接收所有的数据之前设定)

    request.setCharacterEncoding("UTF-8");
    

请求转发 

  • 服务器的行为:客户端请求到达服务器,服务器进行转发
  • 没法完成向服务器外部资源请求转发,只能在服务器内部跳转
  • URL地址不改变
  • 从始至终只有一个请求发出
  • 实现方式如下,达到多个资源协同响应的效果

    request.getRequestDispatcher(url).forward(request,response);

HttpServletRequest对象的使用

  • HttpServletRequest可以作为一个域对象(request域对象)使用
    作用范围:在一次请求中有效,即服务器跳转有效。
// 设置域对象内容
request.setAttribute(String name, String value);
// 获取域对象内容
request.getAttribute(String name); 
// 删除域对象内容
request.removeAttribute(String name);
  • 在请求转发的过程中可以通过 request 来传输/共享数据。

HttpServletResponse对象

  • 主要功能用于服务器对客户端的请求进行响应,将 Web 服务器处理后的结果返回给客户端。

响应数据

  • 接收到客户端请求后,通过 HttpServletResponse 对象直接进行响应,响应时需要获取输出流。
    // 响应数据:
    // PrintWriter字符输出流-获取字符流(只能响应回字符)
    resp.getWriter().write("hi01");//只能打印输出文本格式,不可以输出对象
    resp.getWriter().print("hi01");//可以输出对象
    
    // ServletOutputStream字节输出流-获取字节流(能响应一切数据)
    resp.getOutputStream().write("hi".getBytes());
    // 设置响应头,一般用于更新原来的响应头,key相同,后面设置的会覆盖前面设置的
    resp.setHeader("key1","value1");
    resp.setHeader("key1","value2");
    // 设置响应头,一般用于添加新的响应头,key不同,后面设置的不会覆盖前面设置的
    resp.addHeader("key3","value3");
    resp.addHeader("key3","value4");
    

响应乱码问题

  • 设置传输过程中编码格式,写在响应之前:
response.setCharacterEncoding("UTF-8");
  • 设置浏览器解码格式:
// 下面两行代码是等价的
response.setHeader("content-type", "text/html;charset=UTF-8");
response.setContentType("text/html;charset=UTF-8");

 重定向

  • 重定向是一种服务器指导客户端的行为。
  • 客户端发出第一个请求,被服务器接收处理后,服务器会进行响应,在响应的同时,服务器给客户端一个新的地址(下次请求的地址 response.sendRedirect(url);)
  • 当客户端接收到响应后,会自动根据服务器给的新地址发起第二个请求,服务器接收请求并作出响应,重定向完成。
  • 有两个请求存在,属于客户端行为
  • URL地址栏发生变化
  • 既能跳转服务器内部资源,又能跳转服务器外部资源
// 重定向跳转到index.jsp
response.sendRedirect("index.jsp");
;