Servlet的生命周期可以用下图来表示。

一个已经注册过的Servlet可以被多次映射
同一个Servlet可以被映射到多个URL上
<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/MyServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/OnMyServlet</url-pattern> </servlet-mapping>


两次访问的URL不同,但是实质访问的都是同一个Servlet。
Servlet映射的URL可以使用通配符
通配符有两种格式:
1)*.扩展名
2)正斜杠(/)开头并以“/*”结尾。
<servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/MyServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping>
/*:表示匹配所有
*.jsp:表示匹配扩展名为.jsp的
当两种匹配方式都存在,谁的匹配度高,就选择谁。
Servlet映射的URL可以使用通配符和Servlet可以被映射到多个URL上的作用:
- 隐藏网站是用什么编程语言写的【.php,.net,.asp实际上访问的可能都是同一个资源】
- 用特定的后缀声明版权【公司缩写】
Servlet是单实例的
浏览器多次对Servlet的请求,一般情况下,服务器只创建一个Servlet对象,也就是说,Servlet对象一旦创建了,就会保存在内存中,为后续的请求做服务,直到服务器关闭。
每次访问请求对象和响应对象都是新的
对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service()方法再根据请求方式分别调用doXXX方法。
线程安全问题
当多个用户访问Servlet的时候,服务器会为每个用户创建一个线程。当多个用户并发访问Servlet共享资源的时候就会出现线程安全。
如果一个变量需要多个用户共享,则应当在访问该变量的时候,加同步机制synchronized(对象){}
如果一个变量不需要共享,则直接doGet()或者doPost()定义,这样就不会存在线程安全问题。
<load-on-startup>元素
如果在<servlet>元素中配置了一个<load-on-startup>元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象,以及调用Servlet实例对象的init()方法。
<servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>MyServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
作用:
- 为Web应用写一个InitServlet,这个Servlet配置为启动时装载,为整个web应用创建必要的数据库表和数据。
- 完成一些定时的任务【定时写日志,定时备份数据】
在Web访问任何资源都是在访问Servlet
在启动Tomcat后,浏览器输入http://localhost:8080,出现Tomcat小猫的页面。是因为有缺省Servlet服务的。
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</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> </servlet> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
无论在web中访问什么资源,都是在访问Servlet。没有手工配置缺省Servlet的时候,访问web资源,缺省Servlet会在web站点中寻找该资源,如果有就返回给浏览器,没有就报404错误。
ServletConfig对象
通过此对象可以读取web.xml中配置的初始化参数。

ServletConfig servletConfig = this.getServletConfig(); System.out.println(servletConfig.getInitParameter("name")); response.setContentType("text/html;charset=UTF-8"); response.getWriter().write("我被访问了");
ServletContext对象
当Tomcat启动的时候,就会创建一个ServletContext对象。它代表着当前web站点。
1)ServletContext既然代表着当前的web站点,那么所有Servlet都共享着一个ServletContext对象,所以Servlet之间可以通过ServletContext实现通讯。
2)ServletConfig获取的是单个Servlet的参数信息,ServletContext可以获取的是配置整个web站点的参数信息。
3)利用ServletContext读取web站点的资源文件。
4)实现Servlet的转发(用ServletContext转发不多,主要用request转发)
ServletContext对象可以称之为域对象。实现Servlet之间通讯就要用到ServletContext的setAttribute(String name,Object obj)方法。
在一个Servlet中设置参数
ServletContext servletContext = servletRequest.getServletContext();
servletContext.setAttribute("name","张无忌");
在另个Servlet中获取参数
ServletContext servletContext = request.getServletContext();
String name = (String)servletContext.getAttribute("name");
获取web站点配置的信息
web.xml文件支持对整个站点进行配置参数信息【所有Servlet都可以取到该参数信息】
<context-param> <param-name>novelname</param-name> <param-value>天龙八部</param-value> </context-param>
在每个Servlet中都可以访问该配置参数
ServletContext servletContext = servletRequest.getServletContext();
String novelname = servletContext.getInitParameter("novelname");
posted on
浙公网安备 33010602011771号