1.基础
    1.1 概念和作用

    • Servlet是按Servlet规范编写的Java类
    • 由Sun公司定义,具体细节由Servlet容器实现
    • 用于处理Web应用中的HTTP请求,如:提交数据、会话跟踪、读取和设置HTTP头信息等

    1.2 结构体系

    • Servlet对象、ServletConfig对象定义了Servlet的基本方法,并封装了Servlet的相关配置信息
    • GenericServlet对象为Servlet接口和ServletConfig接口提供了部分实现,但没有对HTTP请求处理进行实现
    • HttpServlet是GenericServlet的子类,该对象为HTTP请求提供了具体的操作方法
    • 以上均可通过源码了解到
    • 在开发中,通常我们编写的Servlet对象都继承于HttpServlet,所说的Servlet就是指HttpServlet对象

    image.png

    1.3 技术特点

    • Servlet对象在Servlet容器启动时被初始化,初次被请求时,Servlet容器将其实例化,并储存于内存中
    • 若存在多个请求,Servlet不会再被实例化
    • 每一个请求是一个线程,而不是进程
    1. 开发Servlet程序
      2.1 构建Maven项目
    • 创建一个普通(不用模板)的Maven项目,删掉里面的src目录
    • 在pom.xml文件中添加依赖,具体参照Maven中内容6.7
    • 在项目中建立Moudel,这个空的工程就是Maven主工程
    • 关于Maven父子工程的理解

      • 子项目可以直接使用父项目中的jar包
      • 父项目中有:

        1. <modules>
        2. <module>servlet-01</module>
        3. </modules>
      • 子项目中有:

        <parent>
        <artifactId>javaweb-02-Maven</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
        </parent>
        

    2.2 Maven环境优化并配置服务器

    • 修改web.xml为最新的(复制Tomcat中的)
    • 将Maven的结构搭建完整(在main中添加java和resource文件夹)
    • 配置Tomcat

    2.3 创建并配置Servlet

    • 步骤
      • 编写一个类,继承HttpServlet类,并重写该类中的方法
      • 把开发好的Java类部署到web服务器中
      • 具体操作步骤参照Maven文章中第8节
    • 为什么需要映射
      • 我们写的Servlet是JAVA程序,但是要通过浏览器访问
      • 而浏览器需要连接web服务器
      • 所以我们需要在web服务中注册所写的Servlet,还要给它一个浏览器能够访问的路径

    3.Servlet原理

    4.Mapping问题
    4.1 一个Servlet可以指定一个映射路径

    <!--声明Servlet对象-->
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.luo.servlet.HelloServlet</servlet-class>
    </servlet>
    <!--映射Servlet-->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    

    4.2 一个Servlet可以指定多个映射路径

    • 以下代码表示通过/hello或/hello2或/hello3或/hello4或/hello5发起请求,都会进入com.luo.servlet.HelloServlet类中,从而有相同的响应
      <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.luo.servlet.HelloServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
            <servlet-name>hello</servlet-name>
      <url-pattern>/hello2</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello3</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello4</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello5</url-pattern>
      </servlet-mapping>
      

    4.3 一个Servlet可以指定通用映射路径

    • 以下代码表示通过/hello或/hello/任意字符发起请求 均有相同的响应
      <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.luo.servlet.HelloServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello/*</url-pattern>
      </servlet-mapping>
      

    4.4 默认请求路径

    • 此方法可以干掉默认显示的index.jsp页面(非常不推荐使用)
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/*</url-pattern>
      </servlet-mapping>
      

    4.5 指定一些后缀或者前缀等等….

    • 映射路径设置中,前面不能加项目映射的路径,比如/h/.fuma不合法
    • 但h/*.fuma路径合法
      <servlet-mapping>
      <servlet-name>hello</servlet-name>
      <url-pattern>*.fuma</url-pattern>
      </servlet-mapping>
      

    4.6 优先级问题

    • 指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
    • 以下代码中用/hello发起请求,会进入com.luo.servlet.HelloServlet类中,同其他地址发起请求则进入com.luo.servlet.ErrorServlet类(自己编写),得到404响应。 ```xml hello com.luo.servlet.HelloServlet hello /hello

    error com.luo.servlet.ErrorServlet

    error /* ```