• Servlet 请求和响应


     Servlet的存在就是要为客户服务。servlet的任务是得到一个客户的请求,再发回一个响应。

    1 servlet的生命周期

    加载类

    容器加载servlet类。

    初始化servlet

    Servlet类的无参构造函数运行。

    init()

    在service()方法被调用之前执行,且Servlet在整个生命周期中,值执行一次。

    service()

    处理客户请求,有这个方法决定调用哪个方法(doGet或doPost 或者其他)。

    destory()

    容器调用这个方法,在servlet被回收前有机会清理资源。

    表 servlet的生命周期

    1.1 init() 方法

    构造函数只是使Servlet类成为一个对象,而执行完init()是成为一个Servlet。

    在执行init()方法期间,将会访问到ServletConfig及ServletContext对象。

    ServletConfig

    1. 每个servlet都有一个ServletConfig对象。
    2. 用于向servlet传递部署时信息。
    3. 用于访问ServletContext。
    4. 参数在部署描述文件中配置。

    ServletContext

    1. 每个Web应用有一个ServletContext(AppContext)。
    2. 用于访问Web应用参数(也在部署描述文件中配置)。
    3. 相当于一种应用公告栏,可以在这放置消息,应用的其他部分可以访问这些信息。
    4. 用于得到服务器信息,包括容器名称、版本以及所支持AP I得版本等。

    表 ServletConfig和ServletContext对象

    2 HTTP方法

    GET

    从服务器获取资源。

    POST

    用于向服务器提交数据、创建新的资源。通常用于提交表单数据、发送数据到服务器上的数据库或进行身份验证。

    HEAD

    只要求得到GET返回结果的首部部分。

    TRACE

    要求请求信息回送,以便客户可以看到中间服务器进行了哪些进度或增量,一般用于测试。

    PUT

    更新资源。主要用来传输文件,就像FTP协议的文件上传一样。但是因为HTTP/1.1 的PUT方法不带验证机制,存在安全性问题,所以一般都不用这个方法进行文件传输。

    DELETE

    用于删除服务器上的资源。

    OPTIONS

    用于向服务器请求关于支持的方法、认证信息和可接受的内容类型等信息。

    CONNECT

    要求连接以便建立隧道。

    表 http常见方法

    2.1 幂等操作

    幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。

    GET、HEAD和PUT方法是幂等的。

    3 请求 HttpServletRequest

    getParameteValue() 是用来从请求中得到一个参数。返回值总是一个String。

    如果对应一个给定的参数名有多个参数值,要使用getParameteValues()方法来返回一个String数组。

    getReader()和getInputStream()方法:只包含请求体和不包含请求头。

    getHeader()和getIntHeader()方法:获取请求头信息。

    getRemotePort()

    获取客户的端口。

    getServerPort()

    获取服务器所监听的端口。

    getLocalPort()

    服务器会为每个请求线程找一个不同的本地端口,该方法获取的就是这个本地端口。

    表 getServletPort()、getLocalPort()和getRemotePort()方法对比

    4 实战

    编写一个Servlet,要求打印出其生命周期中各个节点,同时编写Servlet对应的多个HTTP方法,获取相关请求参数及做出响应。

    1. public class LifeServlet extends HttpServlet {
    2. public LifeServlet() {
    3. System.out.println("LifeServlet 无参数构造函数");
    4. }
    5. @Override
    6. public void init() throws ServletException {
    7. super.init();
    8. System.out.println("LifeServlet init()");
    9. }
    10. @Override
    11. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    12. super.service(req, resp);
    13. System.out.println("LifeServlet service()");
    14. }
    15. @Override
    16. public void destroy() {
    17. super.destroy();
    18. System.out.println("LifeServlet destroy");
    19. }
    20. @Override
    21. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    22. System.out.println("doGet");
    23. }
    24. @Override
    25. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    26. System.out.println("doPost");
    27. }
    28. // 运行结果:
    29. // LifeServlet 无参数构造函数 // 在第一次发起该servlet请求时触发
    30. // LifeServlet init()
    31. // doGet
    32. // LifeServlet service()
    33. // ... // 停止tomcat
    34. // LifeServlet destroy
    35. }
    36. public class HttpMethodsServlet extends HttpServlet {
    37. @Override
    38. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    39. }
    40. @Override
    41. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    42. System.out.println("param1:" + req.getParameter("params1"));
    43. String[] param2s = req.getParameterValues("param2");
    44. System.out.println("param2:" + Arrays.asList(param2s));
    45. System.out.println("headNames:" + req.getHeaderNames());
    46. BufferedReader reader = req.getReader();
    47. System.out.println("reader:" + reader.readLine());
    48. PrintWriter writer = resp.getWriter();
    49. writer.println("hello response");
    50. reader.close();
    51. writer.close();
    52. }
    53. @Override
    54. protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    55. }
    56. @Override
    57. protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    58. }
    59. @Override
    60. protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    61. }
    62. @Override
    63. protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    64. }
    65. @Override
    66. protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    67. }
    68. }
    1. <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    4. version="2.4">
    5. <servlet>
    6. <servlet-name>lifeServlet</servlet-name>
    7. <servlet-class>controller.LifeServlet</servlet-class>
    8. </servlet>
    9. <servlet-mapping>
    10. <servlet-name>lifeServlet</servlet-name>
    11. <url-pattern>/lifeServlet</url-pattern>
    12. </servlet-mapping>
    13. <servlet>
    14. <servlet-name>httpMethodsServlet</servlet-name>
    15. <servlet-class>controller.HttpMethodsServlet</servlet-class>
    16. </servlet>
    17. <servlet-mapping>
    18. <servlet-name>httpMethodsServlet</servlet-name>
    19. <url-pattern>/httpMethods</url-pattern>
    20. </servlet-mapping>
    21. </web-app>

    web.xml

  • 相关阅读:
    自制操作系统日记(7):字符串显示
    mmpose关键点(三):轻量型Lite-HRNet与onnx输出
    双非二本上岸滴滴暑期实习总结
    学生个人网页设计作品:旅游网页设计与实现——成都旅游网站4个页HTML+CSS web前端网页设计期末课程大作业 学生DW静态网页设计 学生个人网页设计作品
    【数据挖掘】2022年2023届秋招宏瓴科技公司机器学习算法工程师 笔试题
    基于Python网络爬虫的二手房数据采集及可视化分析项目源码+使用教程+爬虫+报告PPT+详细注释(高分毕业设计)+全部数据
    C++ 分支编译(预处理指令)
    MatrixOne完成与麒麟信安、欧拉的兼容互认
    使用LDA(线性判别公式)进行iris鸢尾花的分类
    基于springboot实现校友社交平台管理系统项目【项目源码+论文说明】计算机毕业设计
  • 原文地址:https://blog.csdn.net/qq_25308331/article/details/132613561