• 背景:本系列为个人学习复盘查漏补缺,并非从0至1的学习笔记。浏览学习不要以本系列概全局。

    什么是servlet

    1 servlet 是 javaee规范之一,规范就是接口
    2 servlet 是 javaweb三大组件之一 三大组件分别是 servlet程序 filter 过滤器,listener 监听器
    3 servelet 是运行在服务器上的一个java小程序,可以接受客户端发送过来的请求,并响应数据给客户端

    类关系图

    image.png

    手动实现一个servlet程序

    1 编写一个类实现servlet接口 ```java package com.addicated.servlet_01;

import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException;

public class servlet_01 implements Servlet {

  1. @Override
  2. public void init(ServletConfig servletConfig) throws ServletException {
  3. // 获取servletname
  4. System.out.println(servletConfig.getServletName()); // 用来获取该servlet程序在web.xml 中配置的别名
  5. // 获取web.xml 中对一个servlet程序配置的初始化变量
  6. System.out.println(servletConfig.getInitParameter("url"));
  7. // 获取servletcontext对象
  8. ServletContext servletContext = servletConfig.getServletContext();
  9. }
  10. @Override
  11. public ServletConfig getServletConfig() {
  12. return null;
  13. }
  14. /*
  15. * @Author shihu
  16. * @Description //TODO 专门用来处理请求和响应
  17. * @Date 10:01 下午 2021/9/9
  18. * @Param [servletRequest, servletResponse]
  19. * @return void
  20. **/
  21. @Override
  22. public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
  23. // 当前存在问题,就是所有请求都会走service
  24. // servletRequest 的父类中有getMethod方法 用来得到前端页面传来请求的类型
  25. // 但是其本身并没有getMethod方法,这时候使用多太特性,向下转型,父类转子类
  26. HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
  27. // 调用父类中的getMethod方法拿到请求类型和
  28. String method = httpServletRequest.getMethod();
  29. // 之后通过对method判断进行分别调用
  30. if ("GET".equals(method)){
  31. //get 代码
  32. doGet();
  33. }else if ("POST".equals(method)){
  34. // post 代码
  35. doPost();
  36. }
  37. // 但是上面这样写代码 如果请求中的逻辑很多的话,不方便维护。所以封装出来doGet doPost
  38. System.out.println("hello addicated this is a servlet");
  39. }
  40. public void doGet(){
  41. }
  42. public void doPost(){
  43. }
  44. @Override
  45. public String getServletInfo() {
  46. return null;
  47. }
  48. @Override
  49. public void destroy() {
  50. }

}

2 实现service请求方法,处理请求,并且响应数据<br />3 到web.xml 中进行servlet程序注册
```java
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">



<!--   context-param是上下文参数  属于整个web工程-->
    <context-param>
        <param-name>username</param-name>
        <param-value>context</param-value>
    </context-param>



    <!--servlet 标签给tomcat配置servle程序-->
    <servlet>
        <!--    servlet name 标签,给servlet程序起一个别名 -->
        <servlet-name>servlet_01</servlet-name>
        <!--    servlet 的犬类名-->
        <servlet-class>com.addicated.servlet_01.servlet_01</servlet-class>
<!--        配置初始化参数-->
        <init-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql//localhost:3306?</param-value>
        </init-param>
    </servlet>

    <servlet>
        <servlet-name>servlet02</servlet-name>
        <servlet-class>com.addicated.servlet_02.servlet02</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>Servlet03</servlet-name>
        <servlet-class>com.addicated.servlet_03.Servlet03</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>ContextServlet</servlet-name>
        <servlet-class>com.addicated.servlet_4.ContextServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>Servlet05</servlet-name>
        <servlet-class>com.addicated.servlet_4.Servlet05</servlet-class>
    </servlet>


    <servlet-mapping>
<!--        标签作用告诉服务器,当前配置是给那个servlet程序来进行使用-->
        <servlet-name>servlet_01</servlet-name>
<!--        告诉服务器,访问该servlet程序的访问路径
    /hello
    / 斜杠在服务器解析的时候表示地址为 http://ip:port/工程路径
    / hello 表示 工程路径/hello

-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>


    <servlet-mapping>
        <servlet-name>servlet02</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>ContextServlet</servlet-name>
        <url-pattern>/ContextServlet</url-pattern>
    </servlet-mapping>
</web-app>

常见的错误

  • url-pattern 中的配置没有以 / 开头
    • servlet 中 / 会被解析成为当前服务器中部署项目的地址
      • 假如 端口为 8888 ,项目名为 addicated ,那么 / 在解析之后的地址其实是 localhost:8888/addicated/
      • 也就不难理解为什么不加 / 会发生404 之类的错误,因为访问不到对应的servlet程序
  • 如果servlet-mapping 与上面servlet-class 中的值不一致,会报错,servlet-name不存在
  • servlet-class 全类名错误

    servlet的生命周期

    一个servlet程序创建的过程

  • 执行servlet的构造方法

  • 执行 init 初始化方法
    • 前两步是在第一次访问时创建servlet会自动调用
  • 执行service 方法处理请求
    • 每次处理请求的时候出发
  • 执行destory 方法
    • web工程停止的时候触发