提示:以下是本篇文章正文内容,下面案例可供参考
一、servlet是什么?
Servlet是在服务器端运行的Java程序,可以接收客户端请求并通过服务器做出响应,并且Servlet可以**动态**生成HTML内容对客户端进行响应。
二、servlet的生命周期简述
servlet的生命周期大致可以分为四个阶段,
- 实例化:Servlet容器创建Servlet的实例
- 初始化:该容器调用init(ServletConfig)方法
- 服务:如果请求Servlet,则容器调用service()方法
- 销毁:销毁实力之前调用destroy()方法
1.servlet实例化阶段
在服务器启动时(web.xml中配置的load-on-startup =1,默认为0)或者第一次请求改servlet时,其实在服务器运行之处便会加载类也就会实例化servlet对象,这个可以在监视其中对其进行监测
@WebListener
public class demolistener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("我被销毁了");
}
public void contextInitialized(ServletContextEvent sce) {
System.out.println("我被创建了");
}
}
初始化阶段,开始执行doGet()中的方法
@WebServlet("/demo.do")
public class cc2 extends HttpServlet {
private static final long serialVersionUID = 1L;
public void init(ServletConfig config) throws ServletException {
System.out.println("SerVlet初始化了");
}
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
System.out.println("开启服务时调用");
}
/**
* @see Servlet#destroy()
*/
public void destroy() {
System.out.println("SerVlet被销毁了");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = request.getServletContext();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
当我们启动项目时,servlet被加载实例化,,当我们访问demo.do时,init()方法被调用,service()服务方法启动。
当我们关闭或者重启时可以通过监测器看到servlet容器被销毁了,至此servlet生命周期结束。
三、Servlet是否为线程安全
1.什么是线程安全?
线程安全是编程中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。
首先,我们要有一个概念,在前面的介绍中我就介绍了Servlet 的描述,作为客户端和服务器端的交互者,一个服务器往往对应着多个客户端,网络的共享性,也说明,servlet一定是线程不安全的。同时,servlet本来就是一个多线程,当第一次请求后,服务器在重启或者关闭之前都不会再次创建servlet,因此,客户端共享一个servlet,当某一时刻多个线程对servlet同时发出请求,会出现访问数据不一致的情况,这样的情况就导致了一系列的线程安全问题。
2. 如何开发线程安全的Servlet
1.变量的线程安全
** 多线程并不会共享局部变量,这样在我们使用servlet的过程中合理的使用局部变量可以有效的避免线程安全问题,**
2.同步块的锁机制(synchronized)
**在javaSE中我们就已经知道了面对线程安全问题,我们开发出了大量的锁来对线程执行次序进行规划,那么,在servlet中我们依旧可以使用同步块来应对线程安全问题,但是在使用时我们应该尽量的缩小同步块控制的范围,尽量不要再service中使用synchronized,因为在使用了同步块后,我们的程序有可能面临大量的阻塞队列,这样会极大的影响程序的执行效率**。
3.只要Servlet实现SingleThreadModel接口,
public class demoSerVlet extends HttpServlet implements SingleThreadModel {
}
** 使用这个接口,这个接口会在每次请求的时候创建一个servlet实例,此接口并没有方法,和Serializable一样属于标识接口,但是此接口的使用中,可以看出,他会创建过多的servlet实例,一个servletContext在多线程访问时,每个servlet最多只能支持20个线程并发访问,可能会同时挂起20多个线程**
当然,这三种方法并不能解决所有的线程问题,并且都含有一定的缺点,再平常编程过程中需要及时的判断合适的使用场景。合理使用。
总结
**Servlet****是在服务器上运行的小程序(Servlet=Service + Applet)。Servlet其实是一个用Java语言定义的接口,但一般情况下说的Servlet是指直接或间接实现了这个Servlet接口的类。服务器上需要一些程序。而与传统的 CGI相比JavaServlet效率更高,Servlet带给我们最大的作用就是能够处理浏览器带来HTTP请求,并返回一个响应给浏览器,从而实现浏览器和服务器的交互。了解servlet的生命周期和线程安全问题,也是学习servlet的一部分。**
本文转载自: https://blog.csdn.net/m0_65004039/article/details/127015990
版权归原作者 来日方长。。。。long 所有, 如有侵权,请联系我们删除。
版权归原作者 来日方长。。。。long 所有, 如有侵权,请联系我们删除。