学习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);
}
}
运行结果表明这样子可以保证只用两个人可以买到票。