1.Servlet是什么?(来自百度,知道的可以忽略本段)
Servlet是sun公司提供的一门用于开发动态web资源的技术。
Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
1、编写一个Java类,实现servlet接口。
2、把开发好的Java类部署到web服务器中。
按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet
2.Servlet的工作流程?
Servlet程序是Web服务器调用,web服务器接到客户端的Servlet请求后:
1.web服务器首先检查是否装载并创建了该Servlet的实例对象,如果是执行4,否则执行2,
2.装载并创建Servlet的一个实例对象,并调用init()方法
4.创建一个封装http请求信息的HttpServletRequest对象和响应的HttpServletResponse对象,
5.web程序停止之前,调用Servlet的destroy()方法,卸载Servlet。
3.使用Servlet注意的几个问题?
因为我们是通过url访问web服务器中的资源,Servlet若想被外界访问,必须映射到url地址上,这个工作
在web.xml文件中使用<servlet>元素和<servlet-mapping>元素中完成。
4 缺省Servlet
如果<servlet-mapping>元素的<url-pattern>中的映射路径仅为(/),那么这个Servlet就是缺省的Servlet,用于
处理其他Servlet都不处理的访问请求.
5.Servlet的线程安全问题
当多个客户端并发访问同一个Servlet,web服务器会为每一个客户端的访问请求创建一个线程,
并调用service()方法,因此service方法内如果访问了同一个资源,就可能引发线程安全问题。
public class ServletDemo3 extends HttpServlet { 12 13 int i=1; 14 public void doGet(HttpServletRequest request, HttpServletResponse response) 15 throws ServletException, IOException { 16 /** 17 * 加了synchronized后,并发访问i时就不存在线程安全问题了, 18 * 为什么加了synchronized后就没有线程安全问题了呢? 19 * 假如现在有一个线程访问Servlet对象,那么它就先拿到了Servlet对象的那把锁 20 * 等到它执行完之后才会把锁还给Servlet对象,由于是它先拿到了Servlet对象的那把锁, 21 * 所以当有别的线程来访问这个Servlet对象时,由于锁已经被之前的线程拿走了,后面的线程只能排队等候了 22 * 23 */ 24 synchronized (this) {//在java中,每一个对象都有一把锁,这里的this指的就是Servlet对象 25 i++; 26 try { 27 Thread.sleep(1000*4); 28 } catch (InterruptedException e) { 29 e.printStackTrace(); 30 } 31 response.getWriter().write(i+""); 32 } 33 34 } 35 36 public void doPost(HttpServletRequest request, HttpServletResponse response) 37 throws ServletException, IOException { 38 doGet(request, response); 39 } 40 41 }
这种做法是给每个Servlet对象加了一把锁,假如有9999个人同时访问一个Servlet,那么就得按先后顺序排序,不适应。
由于时间关系,笔者参阅了下面的部分内容,在此表示感谢,也请大家踊跃指正帮助更多的想学习servlet的孩子:
http://www.cnblogs.com/xdp-gacl/p/3760336.html