这篇文章主要讲解servlet中常用的API,主要涉及到HttpServlet, HttpServletRequest,
HttpServletResponse,这三个类.
首先创建一个servlet程序,这只是其中的代码部分
- 创建一个类 HelloServlet , 继承自 HttpServlet\n
- 在这个类上方加上 @WebServlet(“/hello”) 注解, 表示 Tomcat 收到的请求中, 路径为 /hello的请求才会调用 HelloServlet 这个类的代码. (这个路径未包含 Context Path)\n
- 重写 doGet 方法. doGet 的参数有两个, 分别表示收到的 HTTP 请求 和要构造的 HTTP 响应. 这个方法会在 Tomcat 收到 GET 请求时触发
- HttpServletRequest 表示 HTTP 请求. Tomcat 按照 HTTP 请求的格式把 字符串 格式的请求转成了一个 HttpServletRequest 对象. 后续想获取请求中的信息(方法, url, header, body 等)
都是通过这个对象来获取.- HttpServletResponse 表示 HTTP 响应. 代码中把响应对象构造好(构造响应的状态码, header, body 等)
- resp.getWriter() 会获取到一个流对象, 通过这个流对象就可以写入一些数据, 写入的数据会被构造成一个 HTTP 响应的 body 部分, Tomcat 会把整个响应转成字符串, 通过 socket 写回给浏览器. 经被包含在 Tomcat 里
HttpServlet
接下来看看httpServlet中的方法.
并不是在实例化之后就调用该方法,而是在tomcat首次收到了和该类相关联的请求的时候会调用该方法.我们用上面的代码进行解释
通过@webServlet这个注解把"/hello" 和helloServlet连接起来,当tomcat收到/hello这样的路径请求,就会调用到HelloServlet,于是对HelloServlet进行实例化(只实例化一次),后续在收到/hello的请求,直接复用之前的helloServlet实例即可.而HelloServlet继承自
HelloServlet,也可以重写父类的init方法.
当服务器终止的时候会调用一次.
收到http请求的时候就会调用一次,其中,向上面写的doGet方法就是在这里面被调用的.
服务器中不同的请求会调用不同的方法.
通过ajax构造http请求
在url里访问的是method这个servlet构造的动态页面 .
具体文件的放置位置
谈谈servlet的生命周期
开始的时候执行init方法, 每次收到请求执行service方法, 销毁之前,执行destroy方法.
HttpServletRequest
HttpServletRequest表示的是一个http请求.这个对象是tomcat自动构造的,tomcat其实会实现监听端口,接受连接,读取请求,解析请求,构造请求等一系列工作.
核心方法如下:
前端给后端传参
通过GET ,query string的形式传递参数
这里的query string 键值对会自动被tomcat处理成形如Map这样的结构,后续就可以随时通过key获取到value.通过POST,参数通过body借助form表单传参
对于前端是form表单这样的数据,后端还是使用getParameter
通过抓包方法来观察请求
使用getParameter,既可以获取到jquery string中的键值对,也可以获取到form表单中构造的body中的键值对.POST,参数通过body借助json格式来传递前后端
通过postman构造出一个post请求,body就是json数据.
请求到达tomcat,tomcat解析成req对象,在servlet代码中,req.getInputStream,读取body中的内容,有把body的内容构造成响应结果,返回给浏览器(postman)中.
当前通过json传递数据,但是服务器这边只能把整个body读取出来,没有按照键值对的方式来处理,不能根据key获取value,可以使用第三方库来解析json格式,这里使用jackson,使用maven引入第三方库,导入到pom.xml中.引入依赖.
用postman构造一个http请求
java代码如下
在java中,一般属性都设置成private的,但是要想把类作为jackson返回的对象,就需要让jackson能够看到里面有哪些属性,此处有两种方法.
- 直接把属性设置成public
- 可以给属性提供public的getter 和setter.
其中详细说说下面这行代码的作用
- 会从body中读取Json格式的字符串
- 根据第二个参数的类对象,创建Student实例
- 解析上述json格式的数据,处理成Map键值对结构
- 遍历所有键值对,看 键 的名字和Student实例中那个属性名字匹配,就把对应的value设置到该属性中
- 返回该student实例
HttpServletResponse
servlet中的doXXX方法就是根据请求计算得到响应,然后把获得的响应设置到HttpServletResponse对象中,然后tomcat就会把HttpServletResponse对象按照Http协议的格式转化成一个字符串,然后通过socket写回到浏览器.
HttpServletResponse的核心方法如下.
注意: 对于状态码/响应头的设置要放到 getWriter / getOutputStream 之前. 否则可能设置失效.