Java Servlet【2】Servlet工作原理(生命周期)

Java 发表评论

      学习Servlet真心有些累啊,学习了这么久还是刚刚入门。但现在的学习热情还是很高。加油!

      在Servlet【1】的博客中已经写到如何使用实现Servlet接口的方法来写Servlet程序,并写在web.xml文件中进行配置,成功运行,那么现在就说说Servlet的工作原理。同时这也是面试题之一。

      在实现Servlet接口的时候复写了四个方发,可以通过说明对四个方法的使用来简述Servlet的工作流程(生命周期):

如果认真的看这几个函数,会发现这个Servlet Java程序没有主函数,所以这是服务器在帮助我们调用这些方法。

Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet请求后;
(1)当Servlet第一次被调用的时候,会触发init函数,该函数会把Servlet的实例装载到内存,init函数只会被调用一次。
(2)然后去调用Servlet的service函数
(3)当第二次后访问该Servlet就直接调用service函数
(4)当web应用reload、关闭tomcat或者关机,就会调用destroy函数,销毁Servlet。

      同时再来说说继承HttpServlet的方法来开发Servlet(在软件公司90%都是通过该方法开发),在HttpServlet中设计者对post提交和get提交分别处理。然后就必须说说这两种提交的区别了。

get和post提交的区别:
1.从安全性看get<post,get 提交的数据汇在浏览器的地址栏显示
2.从提交的内容大小看get<post,get不能大于2K,而post提交理论上不受限制,但不要大于64K。
3.从请求响应速度看,get>post,get要求服务器立即处理请求,而post请求可能形成一个队列。

下面是对象的一个小程序,可以先看一下。

public class servlet1 extends HttpServlet {

	int ticket=2;
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.getWriter().println("linweieran,"+new java.util.Date().toString());
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//一般开发人员,习惯把doGet()doPost()合二为一。
		this.doGet(request, response);
		
	}

}

在本文最前说到了工作机制,当Servlet被第一次访问后,就被加载至内存,以后该实例对各个请求服务,即在使用中是单例的。说到单例就会想到当多个用户访问一个变量,会出现线程安全问题。所以编写代码的时候有一个原则

(1)如果一个变量需要多个用户共享,则应在访问该变量的时候加同步机制。
synchronized(对象){
//同步代码
}
(2)如果一个变量不需要共享,则直接在doGet()或者doPost()中定义即可。

下面是一个买票的小程序,为了模拟访问买票网站时的时延情况专门加了睡眠10秒钟,为了同步ticket使用synchronized方法。

public class servlet1 extends HttpServlet {

	int ticket=2;
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.getWriter().println("lijingbo,"+new java.util.Date().toString());
		
		//简单的解决办法
		synchronized(this){
			if(ticket>0){
				System.out.println("你买到票");
				
				//休眠
				try {
					Thread.sleep(10*1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				ticket--;
			}else{
				System.out.println("你咩有买到票");
			}
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//一般开发人员,习惯把doGet()doPost()合二为一。
		this.doGet(request, response);
		
	}

}

     运行结果表明这样子可以保证只用两个人可以买到票。



发表评论

邮箱地址不会被公开。 必填项已用*标注

昵称 *