sevlet API
API就是一组类和方法
HttpServlet
这是写servlet代码用到的核心的类,通过继承这个类,并重写其中的方法,让Tomcat去调用这里的逻辑.
init:webapp被加载的时候,执行
destroy:webapp被销毁的时候(Tomcat结束)执行,进行一些收尾工作.但是这个方法不保证能够调用到!!!
Tomcat有两种方式结束:
1.通过8005端口,给Tomcat发起特殊的请求,Tomcat就关闭了.(能够执行destroy)
2.直接杀死Tomcat进程.(无法执行到destroy)
(实际开发过程中,第二种方式居多,尤其是在Linux上,所以写代码的时候就不能依赖destroy)
service:每次收到请求,都会执行service,处理每个请求,但是我们通常使用doXXX方法来代替service
针对上述的这些方法,浏览器只能比较方便的构造get请求.
其他方法想要构造,就需要要使用postman
当然,实际开发中,用的最多的还是GET和POST.
HttpServletRequest
注意第三行:getRequestURI.
URI:唯一资源标识符
URL:唯一资源定位符,描述了网络上的一个资源.
URL也可以理解为URI的一种实现方式
getParameterNames()与getParameter()
这两个方法就可以让我们给服务器传递自定义数据.
主要是传输query string以及body.
query string本身是键值对结构的数据,Tomcat收到这个请求之后,就会把这个query string解析成Map这样的键值对,使用getParameter就可以根据key获取value
如果通过post form表单的形式提交请求的话,此时Body也是键值对格式,和query string 一样的.
getHeaderNames()与getHeader
获取到请求头里的键值对.Tomcat收到请求之后,也会把请求头解析成Map
getInputStream()
这个流对象就能得到body的内容
但是这里没有换行,\n在HTML中并不是换行,而需要使用
标签来表示换行
这里就和费德勒里面的结果类似.
更多的时候是希望获取到query string 或者 body 中的内容
获取query string
获取body(只考虑form表单的格式)
注意保证一个项目中,所有的servletPath不能重复的!!!
获取body(考虑body为JSON格式)
{
username:"zhangsan",
password:"123"
}
这种格式在开发中非常常见Servlet自身不能对JSON格式的数据进行解析,就需要引入第三方库,来解析body数据.
此时就需要添加新的依赖.
注意如果你的Maven获取源已经改为阿里云了,那么你要做的,便是等待下载(会非常慢,但没办法,手动导入很麻烦)
下载好之后,如何使用?
ObjectMapper:对象映射器:把一个对象映射到JSON字符串,也可以吧JSON字符串,映射到对象.
JSON转对象
这个方法有很多个版本,作用就是把JSON字符串给解析成Java对象.其中这里的第一个参数是一个流对象,也就表示JSON从哪里来读.
请求的body是通过getInputStream得到的流对象,进一步的读取出来的.
第二个参数,则是指定的类型,也就是说当前这边得到的JSON字符串,需要转成一个啥样的Java对象,需要指定一下对象的类型.
我们还需要定义一个类,这个类当中的属性的名字和类型都和JSON字符串匹配.
这个过程,输入的是JSON字符串,得到的是一个user对象,这就是把JSON字符串,映射成一个Java对象的过程.
直接在地址栏输入,这是一个get请求,而我们写的是一个post请求,所以会出现405
在postman里面,就可以这样操作了,注意在这里我将JSON的key也加上了"",但是在之前的注释中,没加""
这是因为JSON格式,key一定是字符串类型.所以原则上,key不写""也是完全可以的.但是有些库/程序,检查更加严格,就必须强制我们把key加上"".用js的ajax的方式来构造JSON,此时key就是没有引号的.
此时服务器已经顺利的将客户端发来的JSON格式的数据给进行了解析.
readValue就把req的body中的字符串读取并解析了,然后构造成了User对象,user对象中的属性,就是前面在JSON中所体现的内容.
对象转JSON
重点理解Jackson的readValue工作过程:
先把JSON字符串解析成键值对,先放到Map中.再根据参数填入的类对象,通过反射API就可以知道这个类里面有哪些属性,每个属性的名字和类型.依次把这里的每个属性都读取出来,通过属性名字查询上述的Map,把得到的值,赋值给这个类的属性.
约定前后端交互接口:此处的JSON相当于前端与后端传输数据的媒介,开发这样的项目需要前端和后端进行配合,配合之前就需要,先把要交互的数据给规定好(JSON是啥格式的,有哪些key,value是什么类型的,包括请求使用什么路径)
HttpServletResponse
HttpServletResponse 同样也是和HTTP响应数据相匹配,这不过HttpServletResponse是可以针对这些属性(状态码,各种header,body...)进行"设置"(写),而HttpServletRequest 是为了获取里面的属性(读)
对于doXXX这样的方法来说,本身要做的事情就是根据请求计算响应.
请求对象,是Tomcat收到请求之后,对http协议解析得到的对象.
响应对象,是Tomcat创建的空的对象,我们在代码中把响应对象的属性设置好(响应对象,就相当于是一个输出型参数).
注意:使用addHeader,header中就可能出现,key相同的两个键值对.
一般来说,是约定键值对中的key是唯一的.但是实践中,有些情况,确实也需要key不唯一,这种情况就相当于一个key对应多个value了.Tomcat内部不一定是吧header解析成标准库的Map,Java标准库的Map不允许key重复,但是有些第三方库是允许的.
注意此处说的允许重复的key是header中的,不是刚才body的JSON里的.
键值对,是计算机中非常常见的概念.
setStatus()
其实是可以在返回状态码的同时,给body也写入数据,这样就可以得到一些"个性化的错误页面"(可以对照搜狗和B站)
Tomcat也有内置的错误页面
日常开发一般不用Tomcat自带的这个.大部分情况下都需要自己写一个更好看的404.
setHeader()
设置任意的响应报头.此处我们举个例子:通过refresh属性,设置浏览器自动刷新.
例如我们设置refresh:2
此时浏览器就会每隔两秒自动刷新一次!!!
重定向响应
通过费德勒我们可以看到这样的一个操作过程.
这一行代码与上述两行代码是等价的.
控制body
此时出现??的原因是因为编码问题.一般在idea里直接写一个中文字符串,就是UTF-8编码.
浏览器,默认跟随系统编码.Windows简体中文版,默认的编码是gbk,拿着UTF-8的数据,浏览器按照gbk的方式来解析,势必就会出现乱码.
但是注意,在servlet中,给resp设置属性读的时候,必须要注意顺序!!!先设置header,后设置body,一旦开始设置body,此时就相当于header和status都定型了,已经来不及修改了.
上述已经交代了这三个核心api涉及到的类了.