6、Servlet
6.4、Mapping问题
-
一个Servlet可以指定一个映射路径
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern> </servlet-mapping>
-
一个Servlet可以指定多个映射路径
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello01</url-pattern> </servlet-mapping> <servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello02</url-pattern> </servlet-mapping>
-
一个Servlet可以指定通用映射路径(即使用通配符==*==)
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello/*</url-pattern> </servlet-mapping>
注意:如果什么都不写直接写==/,则会直接把index页面给挤掉,servlet优先级更高,因此请考虑好再使用/==的写法
-
指定一些后缀或者前缀等等
<servlet-mapping><servlet-name>hello</servlet-name><url-pattern>*.do</url-pattern> </servlet-mapping>
此处用了后缀即,我们可以通过localhost:8080/javaweb-02-servlet/xxxxxx.do进入servlet页面(xxxxxx可以随便写)
注意:*前面不能加映射的路径(如:/hello)
-
优先级问题:
指定了固有的映射路径优先级最高,如果找不到就会走/*处理比如:
<web-app><display-name>Archetype Created Web Application</display-name><!--注册Servlet--><servlet><servlet-name>hello</servlet-name><!--全限定类名--><servlet-class>com.xu.servlet.HelloServlet</servlet-class></servlet><servlet><servlet-name>error</servlet-name><servlet-class>com.xu.servlet.ErrorServlet</servlet-class></servlet><!--Servlet的注册(请求)路径--><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern></servlet-mapping><servlet-mapping><servlet-name>error</servlet-name><url-pattern>/*</url-pattern></servlet-mapping> </web-app>
此处定义了两个servket,一个路径为/hello,一个路径为/ *。按理来说,/ *包含了/hello,但由于优先级问题,我们在网址栏输入/hello时,它会优先找/hello,如果找不到,再找/ *。
注意:根据多次试错发现:servlet标签必须放一起,写完servlet之后再将对应的servlet-mapping写完,这样才能不报错。(一开始笔者写一个servlet,就写其对应的servlet-mapping,结果web-app报错了)
-
自己写一个404页面:
-
创建一个ErrorServlet.java
package com.xu.servlet;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter;public class ErrorServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// resp.setContentType("test/html");// resp.setCharacterEncoding("utf-8");resp.getWriter().writer.print("<h1>404</h1>");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }
这里为什么注释掉
// resp.setContentType("test/html");// resp.setCharacterEncoding("utf-8");
因为根据狂神说的视频,需要写上这两句来调整页面的字体布局,但是笔者在经历多次打不开页面而出现以下情况后:
便开始排查问题,一开始是以为web.xml配置问题,但是经过几次调整后都没有解决,后来排查java文件是否出现问题,一开始以为自己少引入了包,后来修改doget后才恢复正常
-
在web.xml配置多个servlet映射路径(这里有两个servlet,一个是hello,一个是404)
<!--注册Servlet--> <servlet><servlet-name>hello</servlet-name><servlet-class>com.xu.servlet.HelloServlet</servlet-class> </servlet> <servlet><servlet-name>error</servlet-name><servlet-class>com.xu.servlet.ErrorServlet</servlet-class> </servlet><!--Servlet的注册(请求)路径--> <servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern> </servlet-mapping> <servlet-mapping><servlet-name>error</servlet-name><url-pattern>/*</url-pattern> </servlet-mapping>
-