文章目录
1 Servlet细节
1、Servlet与线程安全
因为一个类型的Servlet只有一个实例对象,那么就有可能会出现一个Servlet同时处理多个请求,那么Servlet是否为线程安全的呢?答案是:“不是线程安全的”。这说明Servlet的工作效率很高,但也存在线程安全问题!
所以我们不应该在Servlet中直接创建成员变量,因为可能会存在一个线程对这个成员变量进行写操作,另一个线程对这个成员变量进行读操作,但是可以创建无状态成员(成员中无成员属性),还可以创建有状态成员,但是成员中的属性是只读的。
2、让服务器在启动时就创建Servlet
默认情况下,服务器会在某个Servlet第一次收到请求时创建它,但是我们也可以在web.xml文件中设置,使服务器一启动就创建Servlet对象。语法格式如下:
<servlet>
<!-- 0代表启动顺序 -->
<load-on-startup>0</load-on-startup>
</servelt>
3、<url-pattern>
<url-pattern>
是<servlet-mapping>
的子元素,用来指定Servlet的访问路径,即URL。它必须是以“/”开头!
(1)可以在<servlet-mapping>
中给出多个<url-pattern>
,那就说明一个Servlet绑定了两个URL,无论访问那个URL,访问的都是同一个Servlet。
(2)还可以在<url-pattern>
中使用通配符,所谓的通配符就是指星号*
,星号可以匹配任何URL前缀或后缀,使用通配符可以命名一个Servlet绑定一组URL,例如:
|——路径匹配:<url-pattern>/servlet/*</url-pattern>
,匹配所有/servlet/sd
之类的URL。
|——扩展名匹配:<url-pattern>*.et</url-pattern>
,匹配所有/servlet/sd.et
之类的URL。
|——全匹配<url-pattern>/*</url-pattern>
,匹配所有URL。
请注意,通配符要么为前缀,要么为后缀,不能出现在URL的中间位置,也不能只有通配符。例如/*.te
就是错误的,因为星号出现在URL的中间位置上了。*.*
也是不对的,因为一个URL中最多只能出现一个通配符。
注意,通配符是一种模糊匹配URL的方法,如果存在更具体的<url-pattern>
,那么访问路径会去匹配具体的<url-pattern>
。
2 web.xml文件的继承
每个完整的JavaWeb应用中都需要有web.xml,但我们不知道所有的web.xml文件都有一个共同的父文件,它在Tomcat的conf/web.xml路径下。
<!-- 个人配置格式 -->
<servlet>
<servlet-name>love</servlet-name>
<servlet-class>org.lks.servlet.DServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>love</servlet-name>
<url-pattern>/DServlet</url-pattern>
</servlet-mapping>
<servlet>
<!-- 优先级最低,如果一个请求没有相应配置处理,那么它来处理,它显示404 -->
<servlet-name>default</servlet-name>
<!-- 当访问路径不存在时,会执行该Servlet,其实在访问index.html时,也是在执行这个Servlet-->
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>