1. Servlet API 的学习
下面主要学习这三个类,就已经可以完成 Servlet 的大部分开发了;
1. Httpservlet
2. HttpServletRequest
3. HttpServletResponse
2. Httpservlet的学习
2.1 Httpservlet在tomcat的工作原理
写一个 Servlet 代码,往往都是要继承这个类,重写里面的方法.,我们之前写的代码如下:
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/hello") public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //把这句话打印在tomact的控制台上(服务器上) System.out.println("hell0 word"); //把内容显示到页面上,把hello word字符串作为http响应的body部分 //这个部分就会被浏览器显示在页面上 resp.getWriter().write("hello word"); } }
servlet这里的代码,只需要继承httpservlet就行,不必写一个main方法;
HttpServlet,继承这个类,重写里面的方法,目的就是为了把咱们自己定义的代码,“插入到" tomcat ”中;
简单了解其工作原理如下:
在 tomcat 中,就有形如以下这样的代码:
// 先通过 tcp socket 读取请求. http 也是基于 tcp
String requestString = readRequest();
// 解析这个请求
HttpServletRequest reg = parse(requestString);
// 构造空的响应对象
IttpServletResponse = new HttpServletResponse();// 创建一个 HttpServlet 对象.
Htpservlet s = new Helloservlet();------->Tomcat 能够自动的 new 出一个咱们写的子类;
进一步的,也就相当于,让咱们的代码"嵌入到"tomcat 内部运行了;
2.2 Httpservlet 的方法
一个 Servlet 不用了,说明 Tomcat 要关闭了,Tomcat 关闭有两种方式:
1.直接干掉 Tomcat 进程 (比如直接在任务管理器中结束任务或者直接一点x), 完全来不及调用 destroy 的.
2.通过 8005 管理端口,给 Tomcat 发送一个"停机"指令.这个时候是能够执行 destroy 的.关于servlet和Httpservlet的理解:
servlet:一组 api, 由tomcat 提供的来操作 http 协议的,也可以理解成是一个 HTTP 服务器框架;写网站的时候主要的工作步骤如下:1接收前端传来的 http 请求,并解析;2根据 http 请求计算出一个 http 响应;3HttpServlet把 http 响返回到浏览器这边
Httpservlet:一般需要继承这个类,并重写里面的方法,最后把重写的代码插入到 Tomcat 的既定流程之中;
3. HttpServletRequest
HttpServletRequest表示了一个 HTTP 请求;
3.1 关于HttpServletRequest的一些方法
上述介绍的方法,都是 get 系列的方法 (都是读方法),没有 set 系列 (没有写方法),我们当前拿到的 HttpServletRequest,这里的数据都是来自于客户端发来的,这些数据的内容已经确定下来了,我们是不应该修改的;
下面主要通过postman构造http请求,观察服务器的相关响应:
最终浏览器得到服务器返回的响应:
3.2 在服务器获取请求中的参数.(Query String)
query string 中的键值对, 都是程序猿自定义的,实际开发中都会非常广泛的使用到 qrery string 这样的机制,如下图所示:
1、http请求中没有query string
1、http请求中有query string
3.3 通过 http 请求的 body 来传递参数(POST)
1)、直接通过 form 表单(body 的格式就是 query string 的格式)
Content-Type: application/x-www-form-urlencoded前端往后端传输数据并顺利拿到:
该方式能被servlet支持;
2)、直接使用 json
(body 的格式就是json),Content-Type: application/jsonjson 本质上也是键值对,规则和 form 表单截然不同,解析方式自然也就变了,由于json 支持“嵌套”,因此自己手写解析 jon 的代码,并不容易的,其嵌入结构如下所示:
该方式不能被servlet支持,所以要下载第三方库;此处为了针对 json 格式的数据进行解析和构造,就需要引入 json 的库;java 世界中,json 的第三方库是非常多的.咱们使用的叫做 jackson,下载第三方库如下:
1)下载导入jackson 到项目中.通过 maven:
2)使用 jackson
一个类,两个方法:
ObjectMapper:对象映射器;
把json 字符串,映射成一个 Java 的对象,读方法;
把一个java 对象,映射成json 字符串,写方法;
使用逻辑如下:
网络传输的时候:使用 json 字符串;
站在服务器的角度:收到的请求,就是json 字符串.,需要把 json 字符串,先映射成java 对象,再进行一系列的业务逻辑处理,处理完了之后,可能还需要把得到的java 对象,映射回json字符串,并且通过响应来返回;
图解对象映射器的分析如下:
1、读方法
关于java.class文件的详细了解:
细节处理:
2、写方法
该端代码的分析:
3、postman构造请求:
postman 对于json 格式要求比较严格,key 必须加上 引号;
4. HttpServletResponse
HttpServletResponse的方法:
response 里的 api 都是 set 系列的方法,request 里的 api 都是 get 系列的方法;
有时候请求得到的响应,光是一个状态码但是 body 是空,不太友好,浏览器上是不会直接显示状态码,如下图所示:
ps:本次的学习就到这里了,如果大家感兴趣的话,就请一键三连哦!!!