Servlet的一些小细节
-
Servlet可以多重映射
多重映射是指:同一个Servlet可以被映射成多个路径,客户端有多个路径可以访问同一个Servlet。
对于Servlet的映射,有两种方式:(Servlet3.0开始支持注解方式)
-
web.xml文件配置
配置多个<servlet-mapping>,指定<url-pattern>
比如:创建一个Servlet,使用web.xml配置,相关文件如下:
public class TestServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("Hello World!"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!--配置Servlet --> <servlet> <servlet-name>TestServlet</servlet-name> <servlet-class>com.zzy.web.TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/test1</url-pattern> <url-pattern>/test2</url-pattern> <url-pattern>/test3</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/test4</url-pattern> <url-pattern>/test5</url-pattern> </servlet-mapping> </web-app>
当访问http://localhost/BlogTest/test1,http://localhost/BlogTest/test2,http://localhost/BlogTest/test3,http://localhost/BlogTest/test4,http://localhost/BlogTest/test5 时控制台都会输出Hello World!
-
-
注解方式@WebServlet
注解WebServlet的属性由以下几个:
属性名 类型 描述 name String Servlet的name属性,等价于<servlet-name>.若没有显示指定,则默认为类的全名(包括包名) value String[] 等价于urlPatterns,但是两个属性不能同时使用 urlPatterns String[] 指定Servlet的URL匹配模式,等价于<url-pattern> loadOnStartup int 指定servlet的加载顺序,等价于<load-on-startup> initParams WebInitParam[] 指定一组Servlet初始化参数,等价于<init-param> asyncSupported boolean 声明Servlet是否支持异步模式,等价于<async-supported> description String Servlet的描述信息,等价于<description> displayName String Servlet的显示名,等价于<display-name> 这里我们只关注两个:value和urlPatterns
注意:
-
当配置一个映射时,默认的value是可以省略不写的,因此可以简写不用写上urlPatterns,就比如:
@WebServlet("/test1")
-
当有多个映射时,此时value和urlPatterns不能同时使用,应该使用urlPatterns.
如:
@WebServlet(urlPatterns = {"/TestServlet", "/TestServlet2"})
修改上述例子,改为使用注解配置多重映射,删除web.xml文件,修改Servlet为:
@WebServlet(urlPatterns = {"/test1", "/test2", "/test3", "/test4", "/test5"}) public class TestServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("Hello World!"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
输出结果与上例一样。
-
-
Servlet路径配置
Servlet支持使用通配符*配置路径。
- *:表示任意字符
- /* :表示可以使用任意的字符来访问当前的Servlet(就是/abc,/123,/aaaa都可以)
- *.xxx:表示可以匹配扩展名为xxx的路径,比如*.jsp 则任意名字的.jsp都可以访问,aaa.jsp,123.jsp等
-
Servlet是单例的(学习博文:https://mp.weixin.qq.com/s/dCPSPqxTTY3SBwUTm3xuKA)
-
为什么Servlet是单例的。
浏览器多次对Servlet请求,一般情况下,服务器只创建一个Servlet对象。
也就是说,Servlet对象一旦创建了是常驻内存中的,持续为请求做服务,直到服务器关闭。
-
每次访问request对象和response对象都是新的。
对于每一个访问请求,Servlet都会创建一个新的HttpServletRequest对象和HttpServletResponse对象,
然后将这两个对象作为参数传递给调用的Servlet的service()方法,service方法再根据请求方式去调用相关的doGet方法或doPost方法等。
-
线程安全问题
当多个用户访问Servlet时,服务器会为每一个用户创建一个线程,当多个用户并发访问Servlet共享资源时候就可能产生线程安全问题了。
线程安全问题原则是:
- 如果一个变量需要被多个用户共享,则应在访问该变量时,使用同步机制synchronize(对象) {}
- 如果一个变量不需要共享,则直接在相关的doGet()或doPost()方法中定义,这样不会产生线程安全问题。
-
网友评论