<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">一句话概括Servlet</span>
Servlet是服务器端调用和执行的java类,产生HTML文档提交给客户端,显示给用户看。
Servlet容器
Servlet生命周期
1、创建servlet实例
<servlet>
<servlet-name>XXXServlet</servlet-name>
<servlet-class>Servlet绝对路径</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
2、初始化 init(ServletConfig)
在Servlet的生命周期中,该方法执行一次
3、service(ServletRequest request, ServletResponse response)方法
解析客户端请求-〉执行业务逻辑-〉输出响应页面到客户端
4、destroy()方法
应用重新装载,或服务器关闭时调用destroy()方法
Servlet线程安全问题
如何解决?
1.同步锁synchronized
<pre name="code" class="java"><pre name="code" class="javascript" style="font-family: Arial;"><pre name="code" class="java"><span style="font-weight: normal;"><span style="font-size:14px;">public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 加了synchronized后,并发访问i时就不存在线程安全问题了,
* 为什么加了synchronized后就没有线程安全问题了呢?
* 假如现在有一个线程访问Servlet对象,那么它就先拿到了Servlet对象的那把锁
* 等到它执行完之后才会把锁还给Servlet对象,由于是它先拿到了Servlet对象的那把锁,
* 所以当有别的线程来访问这个Servlet对象时,由于锁已经被之前的线程拿走了,后面的线程只能排队等候了
*
*/
synchronized (this) {//在java中,每一个对象都有一把锁,这里的this指的就是Servlet对象
i++;
try {
Thread.sleep(1000*4);
} catch (InterruptedException e) {
e.printStackTrace();
}
response.getWriter().write(i+"");
}
}</span></span>
2.SingleThreadModel接口(标记接口)让Servlet去实现一个SingleThreadModel接口,如果某个Servlet实现了SingleThreadModel接口,那么Servlet引擎将以单线程模式来调用其service方法。
事实上,在Servlet API 2.4中,已经将SingleThreadModel标记为Deprecated(过时的)没有定义任何方法和常量的接口称之为标记接口
让Servlet去实现一个SingleThreadModel接口,如果某个Servlet实现了SingleThreadModel接口,那么Servlet引擎将以单线程模式来调用其service方法。
事实上,在Servlet API 2.4中,已经将SingleThreadModel标记为Deprecated(过时的)没有定义任何方法和常量的接口称之为标记接口