Servlet的调用图
前面我们已经学过了Servlet的生命周期了,我们根据Servlet的生命周期画出Servlet的调用图加深理解
Servlet的细节
一个已经注册的Servlet可以被多次映射
同一个Servlet可以被映射到多个URL上。
<servlet> <servlet-name>Demo1</servlet-name> <servlet-class>zhongfucheng.web.Demo1</servlet-class> </servlet> <servlet-mapping> <servlet-name>Demo1</servlet-name> <url-pattern>/Demo1</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Demo1</servlet-name> <url-pattern>/ouzicheng</url-pattern> </servlet-mapping>
无论我访问的是http://localhost:8080/Demo1还是http://localhost:8080/ouzicheng。我访问的都是Demo1。
Servlet映射的URL可以使用通配符
通配符有两种格式:
- *.扩展名
- 正斜杠(/)开头并以“/*”结尾。
匹配所有
匹配扩展名为.jsp的
如果.扩展名和正斜杠(/)开头并以“/”结尾两种通配符同时出现,匹配的是哪一个呢?
- 看谁的匹配度高,谁就被选择
*.
扩展名的优先级最低
Servlet映射的URL可以使用通配符和Servlet可以被映射到多个URL上的作用:
- 隐藏网站是用什么编程语言写的【.php,.net,.asp实际上访问的都是同一个资源】
- 用特定的后缀声明版权【公司缩写】
<servlet> <servlet-name>Demo1</servlet-name> <servlet-class>zhongfucheng.web.Demo1</servlet-class> </servlet> <servlet-mapping> <servlet-name>Demo1</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Demo1</servlet-name> <url-pattern>*.net</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Demo1</servlet-name> <url-pattern>*.asp</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Demo1</servlet-name> <url-pattern>*.php</url-pattern> </servlet-mapping>
Servlet是单例的
为什么Servlet是单例的
浏览器多次对Servlet的请求,一般情况下,服务器只创建一个Servlet对象,也就是说,Servlet对象一旦创建了,就会驻留在内存中,为后续的请求做服务,直到服务器关闭。
每次访问请求对象和响应对象都是新的
对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,**service方法再根据请求方式分别调用doXXX方法。
线程安全问题
当多个用户访问Servlet的时候,服务器会为每个用户创建一个线程。当多个用户并发访问Servlet共享资源的时候就会出现线程安全问题。
原则:
- 如果一个变量需要多个用户共享,则应当在访问该变量的时候,加同步机制synchronized (对象){}
- 如果一个变量不需要共享,则直接在 doGet() 或者 doPost()定义.这样不会存在线程安全问题