不同映射方式
1)介绍
- 第一种
具体名称的方式。访问的资源路径必须和映射配置完全相同 - 第二种
/ 开头 + 通配符的方式。只要符合目录结构即可,不用考虑结尾是什么 - 第三种
通配符 + 固定格式结尾的方式。只要符合固定结尾格式即可,不用考虑前面的路径
注意:优先级问题。越是具体的优先级越高,越是模糊通用的优先级越低。第一种 -> 第二种 -> 第三种
2)第一种:具体名称的方式(精准匹配)
-
此种方式,只有和映射配置一模一样时,Servlet才会接收和响应来自客户端的请求。
-
例如:映射为:/servletDemo05
-
访问URL:http://localhost:8080/servletDemo5
-
新建ServletDemo05
package com.lichee.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ServletDemo05 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("ServletDemo05执行了..."); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req,resp); } }
-
配置Servlet
<servlet> <servlet-name>servletDemo05</servlet-name> <servlet-class>com.lichee.servlet.ServletDemo05</servlet-class> </servlet> <servlet-mapping> <servlet-name>servletDemo05</servlet-name> <url-pattern>/servletDemo05</url-pattern> </servlet-mapping>
3)第二种:/开头+通配符的方式
-
此种方式,只要符合目录结构即可,不用考虑结尾是什么。
-
例如:映射为:/*
-
访问URL:http://localhost:8080/servlet/lichee
http://localhost:8080/servlet/test
-
这两个URL都可以。因为用的*,表示/servlet/后面的内容是什么都可以。
-
我们还是使用ServletDemo05,只需要修改配置即可(把上一个具体名称的配置屏蔽掉)
<servlet> <servlet-name>servletDemo05</servlet-name> <servlet-class>com.lichee.servlet.ServletDemo05</servlet-class> </servlet> <servlet-mapping> <servlet-name>servletDemo05</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping>
4) 第三种:通配符+固定格式结尾
-
此种方式,只要符合固定结尾格式即可,其前面的访问URI无须关心(注意协议,主机和端口必须正确)
-
例如:映射为:*.do
-
访问URL:http://localhost:8080/aaa.do
http://localhost:8080/bbb.do
-
这两个URL都可以方法。因为都是以.do作为结尾,而前面用*号通配符配置的映射,所有无须关心。
-
依然使用ServletDemo05,修改配置即可
<servlet>2 <servlet-name>servletDemo05</servlet-name> <servlet-class>com.lichee.servlet.ServletDemo05</servlet-class> </servlet> <servlet-mapping> <servlet-name>servletDemo05</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
Servlet创建时机
- 第一次访问时创建
优势:减少对服务器内存的浪费。提高了服务器启动的效率
弊端:如果有一些要在应用加载时就做的初始化操作,无法完成
- 服务器加载时创建
优势:提前创建好对象,提高了首次执行的效率。可以完成一些应用加载时要做的初始化操作
弊端:对服务器内存占用较多,影响了服务器启动的效率
-
修改 Servlet 创建时机。在
<servlet>
标签中,添加<load-on-startup>
标签。 -
正整数代表服务器加载时创建,值越小、优先级越高。 负整数或不写代表第一次访问时创建
- <load-on-startup>加载顺序的序号</load-on-startup>
- 序号为1,就是服务器启动时第一个加载
- 序号为2,就是服务器启动时第二个加载
-
如果两个Servlet都要配置为正整数,那么值小的优先级高
-
配置:修改ServletDemo3的配置,增加load-on-startup
<!--演示Servlet生命周期的配置--> <servlet> <servlet-name>servletDemo03</servlet-name> <servlet-class>com.lichee.servlet.ServletDemo03</servlet-class> <!--配置Servlet启动时机 正整数代表服务器启动时创建,负数或不写代表第一次访问时创建--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>servletDemo03</servlet-name> <url-pattern>/servletDemo03</url-pattern> </servlet-mapping>
-
效果:如果不配置,是在访问ServletDemo3 的时候初始化,如果配置,那就是在启动tomcat的时候初始化
默认Servlet
-
默认Servlet是由服务器提供的一个Servlet,它配置在Tomcat的conf目录下的web.xml中。
-
它的映射路径是
<url-pattern>/<url-pattern>
,我们在发送请求时,首先会在我们项目中的 web.xml 中查找映射配置,找到则执行。 -
但是当找不到对应的 Servlet 路径时,就去找默认的 Servlet,由默认 Servlet 处理。所以,一切都是 Servlet。
-
如果我们访问一个不存在的url,浏览器会加载一个404界面,这个404界面,其实就是tomcat配置的默认的Servlet处理的结果。