servlet-mapping问题
-
新建Maven项目:javaweb-02-servlet
-
删除项目中src(其他没用的都可以删除,可以按下图删除)
-
在项目中新建 -> 新模块(module):servlet01
-
在main方法中新建目录(不就是文件夹么):java和resources
-
右键 -> 标记 ; 标记java为源目录,标记resources为资源目录
-
在java中新建包:com.linz.servlet;然后在包中新建HelloServlet类
-
继承HttpServlet类,直接输入
extends HttpServlet
,然后选中爆红的HttpServlet进行Alt+Enter,导入jar包、导入类 -
方法中重写doGet和doPost方法(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);
}
}
- 把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>
-
servlet-mapping的多种规则方式 (注意servlet-mapping标签里的"/")
-
一个Servlet可以指定一个映射路径
<servlet-mapping> <servlet-name>wow</servlet-name> <url-pattern>/wow</url-pattern> </servlet-mapping>
-
一个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>
-
一个Servlet可以指定通用映射路径
<servlet-mapping> <servlet-name>wow</servlet-name> <url-pattern>/wow/*</url-pattern> </servlet-mapping>
-
默认请求路径
<servlet-mapping> <servlet-name>wow</servlet-name> <!--改完直接淦掉首页,此servlet变为首页--> <url-pattern>/*</url-pattern> </servlet-mapping>
-
指定一些后缀或者前缀等等…
<!--可以自定义后缀实现请求映射 注意点:*前面不能加项目映射的路径(就斜杠"/")--> <servlet-mapping> <servlet-name>wow</servlet-name> <url-pattern>*.abc</url-pattern> </servlet-mapping>
-
优先级问题
指定了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>
-