目录
1 Servlet 是否符合线程安全?
2 Servlet对象的创建时间?
3 Servlet 绑定url 的写法
3.1 一个Servlet 可以绑定多个url
3.2 在web.xml 配置文件中 url-pattern写法
1 Servlet 是否符合线程安全?
答案:不安全
判断一个线程是否安全?条件是 是否存在共享元素【全局变量】
举例
因为一个类型的Servlet只有一个实例对象,那么就有可能会现时出一个Servlet同时处理多个请求,那么Servlet是否为线程安全的呢?答案是:“ 不是线程安全的 ”。这说明Servlet的工作效率很高,但也存在线程安全问题!
所以我们不应该在Servlet中便宜创建成员变量,因为可能会存在一个线程对这个成员变量进行写操作,另一个线程对这个成员变量进行读操作。
2 Servlet对象的创建时间?
通过之前的学习,我们知道想要创建Servlet 对象,必须要满足两个条件
- 首先要启动tomcat服务器
- 其次要使用浏览器通过url访问Servlet,服务器创建Servlet 对象
在之前的博客中,有提到使用注解@WebServlet("url")【一般来说 :url: /.... 的方式】 形式关联我们创建的Servlet 比在xml配置文件中添加,更加方便 。
但当浏览器访问时,通过url直接或间接 找到Servlet ,这里有个问题。第一次访问Servlet 时,等待时间比较长!在这里我称这种行为是:第一次惩罚。
注意
1 Servlet 和url 路径,本质上是映射的关系。我们可以通过url 找到与它匹配的Servlet
- 我们可以理解成map集合中的key-value 键值对的
2 这里的“直接”的意思是:我们指定启动服务器的首页,刚好是要访问的Servlet 的前端页面
3 这里的“间接”的意思是:我们没有指定,而是手动在浏览器的搜索栏中输入和Servlet 匹配的路径,去访问
有什么方式,可以加快Servlet的创建速度,节省创建所需要的时间?
答案:让服务器在启动时就创建Servlet
假设这里我是AServlet 操作
应该怎么做呢?
解决办法
- 在xml配置文件中添加 <load-on-startup> 数字</load-on-startup>
- @WebServlet 注解上添加
1 在xml配置文件中添加 <load-on-startup> 数字</load-on-startup>
<load-on-startup>数字</load-on-startup>
<servlet><servlet-name>AServlet</servlet-name> <!-- 对应在AServle中的路径:包名.类名--><servlet-class>fs.AServlet</servlet-class><init-param> <!-- 初始化参数--><param-name>key</param-name><param-value>value</param-value></init-param><load-on-startup>1</load-on-startup></servlet>
这样我就把Servlet的创建提前到服务器启动的时候。
启动服务器:
2@WebServlet 注解上添加
注意:使用注解时,要把之前在xml配置文件上的添加url 的标签,要注释掉,否则会报错
原因:问题出在 @WebServlet 注解的使用上。具体来说,错误提示表明存在两个不同的 Servlet 类都尝试映射到同一个 URL 模式 /a
@WebServlet(value = "/a", loadOnStartup = 1)
注意
在这里value ,是不能被省略的。原因是只有一个参数时,value可以被省略,其余的不能被省略
3 Servlet 绑定url 的写法
3.1 一个Servlet 可以绑定多个url
注意:但这种方式不推荐
我们一般在@WebServlet 注解的使用
@WebServlet({"/a", "/aa"})
运行
使用/a
使用/aa
注意:我们第一次访问时创建了AServlet对象,因此之后的访问中,不会再创建该对象,之后调用service()方法
3.2 在web.xml 配置文件中 url-pattern写法
- 精确匹配:/字符串
- 借助通配符 *
- 匹配所有:/*
- 前缀匹配:/abc/*
- 后缀匹配:*/.后缀名