servlet-mapping问题

  1. 新建Maven项目:javaweb-02-servlet
    笔记:创建Servlet项目_java

  2. 删除项目中src(其他没用的都可以删除,可以按下图删除)

  3. 在项目中新建 -> 新模块(module):servlet01
    笔记:创建Servlet项目_xml_02

  4. 在main方法中新建目录(不就是文件夹么):java和resources

  5. 右键 -> 标记 ; 标记java为源目录,标记resources为资源目录
    笔记:创建Servlet项目_ide_03

  6. 在java中新建包:com.linz.servlet;然后在包中新建HelloServlet类
    笔记:创建Servlet项目_xml_04

  7. 继承HttpServlet类,直接输入extends HttpServlet,然后选中爆红的HttpServlet进行Alt+Enter,导入jar包、导入类
    笔记:创建Servlet项目_ide_05

  8. 方法中重写doGetdoPost方法(IDEA快捷键:ctrl+O),在doPost方法中使用doGet

public class HelloServlet extends HttpServlet {
    public int x = 12;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置servlet的编码格式  utf-8是乱码   csdn懂哥说设置成GBK 好使
        resp.setCharacterEncoding("GBK");
        int x = 2626;
        //引入PrintWriter中的writ()方法,在页面中打印出文字
        PrintWriter writer = resp.getWriter();
        writer.println("引入PrintWriter中的writ()方法,在页面中打印出文字");

        //设置成x输出2626   设置成this.x输出12   ???why???
        writer.println(x);
        //request请求 response响应
        //响应response 请求request
        //request request request request request request 请求
        //response 响应 response response response response response response response 响应
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
  1. 把web.xml内容换成Tomcat中的ROOT里的web.xml(因为比较新比较new);然后在web.xml中注册servlet和设置servlet的请求路径(servlet-mapping)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
                      https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0"
         metadata-complete="true">
    <!--注册servlet-->
    <servlet>
        <!--自定义servlet名称 跟自定义一个方法名差不多的意思?反正都是自定义-->
        <servlet-name>wow</servlet-name>
        <!--指向自己的servlet类-->
        <servlet-class>com.linz.servlet.HelloServlet</servlet-class>
    </servlet>
    
    
    <!--servlet的请求路径-->
    <servlet-mapping>
        <!--跟注册时自定义的servlet名称一样,不一样会报错-->
        <servlet-name>wow</servlet-name>
        <!--如果要访问这个servlet类,在浏览器中会变成 http://localhost:8080/s1(在设置Tomcat时下面自己自定义的名称)/wow-->
        <url-pattern>/wow</url-pattern>
    </servlet-mapping>
</web-app>
  1. servlet-mapping的多种规则方式 (注意servlet-mapping标签里的"/")

    1. 一个Servlet可以指定一个映射路径

      <servlet-mapping>
          <servlet-name>wow</servlet-name>
          <url-pattern>/wow</url-pattern>
      </servlet-mapping>
      
    2. 一个Servlet可以指定多个映射路径

      <servlet-mapping>
          <servlet-name>wow</servlet-name>
          <url-pattern>/wow</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
          <servlet-name>wow</servlet-name>
          <url-pattern>/wow1</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
          <servlet-name>wow</servlet-name>
          <url-pattern>/wow2</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
          <servlet-name>wow</servlet-name>
          <url-pattern>/wow3</url-pattern>
      </servlet-mapping>
      
    3. 一个Servlet可以指定通用映射路径

      <servlet-mapping>
          <servlet-name>wow</servlet-name>
          <url-pattern>/wow/*</url-pattern>
      </servlet-mapping>
      
    4. 默认请求路径

      <servlet-mapping>
          <servlet-name>wow</servlet-name>
          <!--改完直接淦掉首页,此servlet变为首页-->
          <url-pattern>/*</url-pattern>
      </servlet-mapping>
      
    5. 指定一些后缀或者前缀等等…

      <!--可以自定义后缀实现请求映射
          注意点:*前面不能加项目映射的路径(就斜杠"/")-->
      <servlet-mapping>
          <servlet-name>wow</servlet-name>
          <url-pattern>*.abc</url-pattern>
      </servlet-mapping>
      
    6. 优先级问题

      指定了Mapping的映射路径优先级最高,如果找不到就会走默认请求
      意思就是/*通配符的优先级比那些指定的/wow优先级低,找不到其他的servlet就走这个/*

      <!--404:找不到的页面-->
      <servlet>
          <servlet-name>error</servlet-name>
          <servlet-class>com.linz.servlet.ErrorServlet</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>error</servlet-name>
          <url-pattern>/*</url-pattern>
      </servlet-mapping>