Servlet动态扩展服务器功能,以提供在 Web 上进行请求和响应服务。当客户机发送请求至服务器时,服务器可以将请求信息发送给 Servlet,并让 Servlet 建立起服务器返回给客户机的响应。
1.Servlet的生命周期
周期;始于装入服务器的内存,结束于停止或重新装入Servlet!
(1).初始化
Servlet对象一旦创建就会驻留在内存中,为后续的其它请求提供服务,直到web容器退出,servlet实例对象才会销毁!
1).配置web应用的web.xml文件,设置服务器启动的时候加载
<servlet>
<servlet-name>name</servlet-name>
<servlet-class>com.baidu.Name</servlet-class>
<load-on-startup>2</load-on-startup> <!-- 数字为等级 数值小等级高-->
</servlet>
2).首次向Servlet发出请求时
3).重新装入 Servlet
服务器创建一个 Servlet 实例并且调用 Servlet 的 init() 方法.
(2).请求处理
服务器创建一个request和response对象,服务器并调用 Servlet 的 service(request, response) 方法,从request中读取信息,在response中写入信息,只有service方法完成时,才会向浏览器回送数据!浏览器的每一次请求,都会产生新的request和response对象!
(3).消亡
当服务器关闭或重新装入 Servlet 的新实例时,服务器会调用 destroy() 方法.
2.ServletConfig
当在执行init方法时,会将web.xml的Servlet相应的<init-param>标签读取,其配置信息应属于当前Servlet
<servlet>
<init-param>
<param-name>name</param-name>
<param-value>zhang</param-value>
</init-param>
</servlet>
ServletConfig config = this.getServletConfig();
String str = config.getInitParameter(name);
3.ServletContext
ServletContext是一个容器,为当前web应用的信息,其所作用的域为当前web应用。服务器开启就存在,服务器关闭才释放,所有用户公用一个(session一个用户一个,request一个用户多个,page用户当前页)
1).作用域
容器中每个web应用都有一个ServletContext接口的实例对象,一个web应用将在每个服务器中都有一个ServletContext实例对象;
2).初始化
web.xml的web应用下添加初始化信息
<context-param>
<param-name>name</param-name>
<param-value>zhang</param-value>
</context-param>
再通过ServletContext的方法获得信息
getInitParameter()
getInitParameterNames()
3).配置上下文信息的相关操作
setAttribute()
getAttribute()
getAttributeNames()
removeAttribute()
上下文属性对于创建它们的服务器来说是本地的。
4).资源的相关操作
getResource()
getResourceAsStream()
关于资源读取相关操作及注意问题看下面代码
5).临时工作目录
4.Servlet的使用细节:
(1).当一个web应用news被复制成copyNews,如果此时的web应用copyNews发布到服务器上,还为news,如果想成功添加上服务器,以copyNews命名,应该修改web属性myeclpise-web
(2).一个完整的servlet应用配置web.xml应该设置两部分信息
<servlet>
<servlet-name>name</servlet-name>
<servlet-class>com.baidu.Name</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>name</servlet-name>
<url-pattern>/name</url-pattern>
</servlet-mapping>
(3).服务器每个请求都实际访问的为Servlet,当访问/news/index.html时,由于不存在该Servlet资源,则服务器会找到一个Servlet名称为default的Servlet,该Servlet会读取存在的资源信息并写入response中!
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
</servlet>
(4).线程安全问题
当多个浏览器访问同一个Servlet时,服务器会为每个浏览器的访问分配一个线程并调用service方法!假如,这些线程访问公共资源,就存在线程安全问题!
1).继承SingleThreadModel
该接口并没有定义任何的方法,是一个标记接口!但是当一个Servlet继承该方法后,当该Servlet多次被访问后,将会产生大量的对象很多垃圾,不建议使用!
2).使用synchronized代码块