servlet开发细节

SUN公司定义了两个默认实现类:分别为:GenericServlet,HttpServlet(建议使用)

HttpServlet指能够处理HTTP请求的Servlet,它在原有Servlet接口上添加了一些HTTP协议处理方法。它比Servlet接口的功能
更为强大,因此开发人员在编写Servlet时,通常应继承这个类。

HttpServlet在实现Servlet接口时,复写了service方法,该方法体内的代码会自动判断信用的请求方式,如GET请求,则调用
HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此开发人员在编写Servlet时,通常只需复写doGet或
doPost方法,而不去复写service方法

Servlet的细节问题

由于客户端是通过URL地址访问web服务器中的资源,所以servlet程序若想被外界访问,必须把servlet程序映射到一个url地址
上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成
<servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置servlet的注册
名称和servlet的完整类名

一个<servlet-mapping>元素用于映射一个已注册的servlet的一个对外访问路径,他包含两个子元素:<servlet-name>和<url-Patter>,
分别用于指定servlet的注册名称和servlet的对外访问路径。

同一个servlet可以映射到多个url上,即多个<servlet=mapping>元素的<servlet-name>子元素的设置值可以是同一个servlet的注册名。
在servlet映射到的url中也可以使用*通配符,但是只能有两种固定的格式:一种格式是"*.扩展名",另一种格式是以正斜杠(/)开头并以
"/*"结尾。例如/*,/new/*,*.do
问题:原则:通配匹配时
参考的标准:1.谁的匹配度高,谁命准2.*.do的优先级最低
当请求url/abc/a.html,"/abc/*"和"/*"都匹配,哪个servlet响应
当请求url为"/abc"时,"/abc/*"和“/abc”,都匹配,哪个servlet响应
当请求url为“/abc/a.do” “/abc/*”和“*.do”
url为"/xxx/yyy/a.do"时,/*和*.do

servlet是一个供其他java程序(servlet引擎)调用的java类,它不能独立运行,他的运行完全由servlet引擎
来控制盒调度。
针对客户端的多次servlet请求,通常情况下,服务器只会创建一个servle实例对象,也就是说servlet实例对象一旦创建,
它就会驻留在内存中,为后续的其他的请求服务,纸质web容器退出/或者reload该web应用,servlet实例对象才会销毁。
在servlet的生命周期内,servlet的inti方法只被调用一次。而对一个servlet的每次访问请求都导致servlet引擎调用一次servlet
的service方法。对于每次访问请求,servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse
响应对象,然后将这两个对象作为参数传递给它调用的servlet的service方法,service方法再根据请求方式分别调用doxxx方法。
servlet单例问题
当servlet被第一次访问后,就被加载到内存,以后该实例对各个请求服务,即在使用中是单例的。
因为servlet是单例,会出现线程安全问题,比如:售票系统,如果不加同步机制,则会出现问题

这里我给大家一个原则:

1.如果一个变量需要多个用户共享,则应该在访问该变量的时候,加同步机制synchronized(对象){同步代码}

如果一个变量不要共享,则直接在doGet()或者doPost定义,这样不会存在线程安全问题

servlet细节5

如果在<servlet>元素中配置了一个<load-on-startup>元素,那么web应用在启动时,就会装载并创建servlet的实例对象了,以及调用servlet对象init方法

用途:为web应用写一个initServlet,这个servlet配置为启东时加载,为整个web应用创建必要的数据库表和数据。

或者是启动一个后台线程,定时去完成某些工作,(比如每个10秒发一份电子邮件)

原文地址:https://www.cnblogs.com/jggz/p/3027188.html