目的:当前主要掌握三个类:
HttpServlet,HttpServletRequest,HttpServletResponse。
HttpServlet
我们写 Servlet 代码的时候, 首先第一步就是先创建类, 继承自 HttpServlet, 并重写其中的某些方法.
核心方法
方法名称 | 调用时机 |
---|---|
init | HttpServlet 实例化之后被调用一次,tomcat自动调用 |
destroy | 在 HttpServlet 实例不再使用的时候调用一次 |
service | 收到 HTTP 请求的时候调用 |
doGet | 收到 GET 请求的时候调用(由 service 方法调用) |
doPost | 收到 POST 请求的时候调用(由 service 方法调用) |
doPut/doDelete/doOptions/... | 收到其他请求的时候调用(由 service 方法调用) |
可以在里面写sout,每次打开页面,触发一次请求,打印一次
destroy能不能被执行出来还有待被商榷:
1.如果通过 smart tomcat 的停止按钮,这个操作本质上是通过 tomcat 的 8005 端口主动停止的,这能够触发 destroy 。
2.如果是直接杀进程,此时可能就来不及执行 destroy 就没了。
影刺,我们不太推荐使用 destroy ,不太靠谱
3.当HttpServlet实例不再使用时调用该方法,啥时候该实例就不再使用了?服务器只要不停止,该实例就一直被使用,只有当服务器停止后了,才会调用该方法,只执行一次
service:doGet就是在 service 中调用的。
service: 每次收到HTTP请求就会调用 ,HttpServlet父类里会有一个service方法,service会调用doGet。doPut,doDelete…也是同理,在收到对应请求时调用,由service调用
注意! init 和 destroy 方法,都是一个 Servlet 对象调用一次。
而 service 可能会被一个对象,给调用很多次。
毕竟我们大部分时候,进入一个网站都是有目的,至少UI浏览一下,在浏览的过程中就需要进行多次交互,也就会发送多次请求,service 自然也就会被调用多次。
servlet 生命周期:1。开始时执行 init;2.每次收到请求执行 service;3.结束销毁时,执行 destroy
后面的内容,可以关注Servlet API 详解_servlet-api_lambo mercy的博客-CSDN博客
浏览器通过form表单构造了一个HTTP请求,这个请求到达tomcat,tomcat解析请求,构造了一个req对象,再到servlet里面,servlet再去解析里面的内容再来构造响应,返回给浏览器。
不过在引用的链接中,
存在一点失误,要改成
class Student {
public int userId;
public int classId;
}
@WebServlet("/xxx")
public class xxx extends HttpServlet{protected void doPost(...) throws ...{
// 使用jackson涉及到的核心对象
ObjectMapper objectMapper = new ObjectMapper();
// readValue就是把一个json格式的字符串转成java对象
Student student = objectMapper.readValue(req.getInputStream(),Student.class);
System.out.println(student.classId+","+student.userId);}
}
在引用博客的这一块
能修改成
另外的状态码:手动返回404页面
这个是返回tomcat自带的错误页面
下面接着写引用博客里没有写完的内容
引用后续:
代码示例: 自动刷新 AutoRefreshServlet 类
实现一个程序, 让浏览器每秒钟自动刷新一次. 并显示当前的时间戳.
@WebServlet("/autoRefreshServlet")
public class AutoRefreshServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setHeader("Refresh", "1");
long timeStamp = new Date().getTime();
resp.getWriter().write("timeStamp: " + timeStamp);
}
}
- 通过 HTTP 响应报头中的 Refresh 字段, 可以控制浏览器自动刷新的时机.
- 通过 Date 类的 getTime 方法可以获取到当前时刻的毫秒级时间戳.
前后端交互代码注意事项