目录
因为程序媛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协议的特点
- 支持客户/服务器模式。
- 简单快速:HTTP协议规则简单,规模小,通信速度快。
- 灵活:HTTP协议允许传输任意类型的数据对象。
- 无连接:每次只处理一个请求,完成一次请求与响应后,立即断开连接,节省传输时间。eg:HTTP1.1版本后支持可持续链接。
- 无状态:对事务处理没有记忆,即在本次传输中,不记得上一次传输的信息。
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种类型:
- 1xx Informational (信息性状态码)
- 2xx Success (成功状态码)
- 3xx Redirection (重定向状态码)
- 4xx Client Error (客户端错误状态码)
- 5xx Server Error (服务器错误状态码)
- 响应头:浏览器通过获取响应头中的信息,判断如何处理响应结果。
格式:key:value - 响应体:响应的消息体
Tomcat服务器
- 一个符合 JavaEE WEB 标准的最小的 WEB 容器
- Tomcat 简单的说就是一个运行 Java 的网络服务器,底层是 Socket 的一个程序
- 是 JSP 和 Servlet 的一个容器
- 安装Tomcat超详细教程,请移步程序媛JavaEE第一章Servlet入门-超详细教程-CSDN博客
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的工作流程
- 通过请求头 得知浏览器访问的是哪个主机
- 通过请求行 得知访问的哪个web应用
- 通过请求行种的请求路径 得知访问的哪个资源
- 通过前面获取到的资源路径 在配置中匹配到真实路径
- 服务器创建servlet对象
- 调用service方法,生成HttpServletRequest实现类对象和HttpServletResponse实现类对象,来处理请求和响应
- service方法完成后 返回服务器 由服务器将response缓冲区的数据取出 并以http响应格式发送回给浏览器
Servlet的其他实现方法
- 实现Servlet规范的3种方法:
- extends HttpServlet 类(推荐)
- extends GenericServlet 抽象类
- implements Servlet 接口
- Servlet对外访问路径的设置:
- 设置注解:@WebServlet(“/路径”)
- web.xml配置文件:启动web项目后,servlet容器会读取web.xml配置文件,可以在web.xml中对servlet路径做配置,具体代码 请移步程序媛JavaEE第一章Servlet入门-超详细教程-CSDN博客
Servlet的生命周期
- 初始化:请求到达容器,容器查找servlet对象是否存在,不存在则进行初始化
init 初始化方法,在 Servlet 实例创建之后执行,系统方法服务器自动调用 - 调用:容器调用servlet对象的service方法
service 就绪/调用/服务方法,每次有请求到达某个 Servlet 方法时执行,用来处理请求,系统方法服务器自动调用 - 销毁:容器关闭时,将程序中Servlet销毁
destroy 销毁方法,Servlet 实例销毁时执行,系统方法服务器自动调用
- Servlet 的生命周期:
- Web Client 向 Servlet 容器(Tomcat)发出 Http 请求
- Servlet 容器接收 Web Client 的请求
- Servlet 容器根据反射构建Servlet对象
-
构建HttpServletRequest 实现类对象、HttpServletResponse 实现类对象 ,处理请求和响应
-
Servlet 容器调Servlet 对象的service 方法,把HttpServletRequest 实现类对象 与 HttpServletResponse 实现类对象 作为service的参数,供给方法内部使用
-
Servlet 对象调用 HttpServletRequest 实现类对象的有关方法,获取 Http 请求信息
-
Servlet 对象调用 HttpServletResponse实现类 对象的有关方法,生成响应数据
-
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");