1.1Servlet原理
Servlet是由Web服务器调用,web服务器在收到浏览器请求之后,会:
1.2Mapping问题
我们点击web.xml,如下所示:
1.一个Servlet可以指定一个映射路径
<!--Servlet的请求路径-->
<!--localhost:8080/untitled/hello-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
2.一个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>
我们运行之后进行查看:
我们发现,我们选择不同的路径,都是可以进入到这个页面的。
3.一个Servlet可以指定通用映射路径。
我们将通配符*运用到路径里面来进行查看效果:
<!--Servlet的请求路径-->
<!--/hello/*代表hello下的任何请求都可以被映射-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
之后我们重新运行之后,出现无论hello后面的路径是什么,都可以进入该界面:
只写一个hello也可以进入该界面。
4.默认请求路径
<--默认请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
之后我们选择进行重启,如下所示:
我们通过网址可以看到,我们再进index.jsp了,我们没有进入首页。所以尽量不要这样子去写。
5.指定一些后缀或者前缀等等.....
<!--Servlet的请求路径-->
<!--可以自定义后缀实现请求映射
注意点,*前面不能加项目映射的路径,比如/hello/*.rgf会出现报错,但是/hello/ypl.rgf是可以实现的-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.rgf</url-pattern>
</servlet-mapping>
我们重新启动,进入如下所示:
6.优先级问题(自定义404)
我们创建一个ErrorServlet:
之后我们进行编辑该类:
package com.rgf.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 {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter writer = resp.getWriter();
writer.print("<h1>404</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
里面的setContentType在开发者工具里面找到:
之后,我们编辑web,xml里面的文件:(将该文件添加进去)
<!--404-->
<servlet>
<servlet-name>error</servlet-name>
<servlet-class>com.rgf.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
我们运行之后如下所示:
我们判断看后面加hello最后进入哪个页面:
我们发现hello也属于/*,但是我们进入hello的界面。
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求;