Servlet 规范与工作原理的简单理解

  • Servlet与Servlet容器

    • 容器就是可以接收请求,并将请求转发到servlet提供的对外服务的方法,比如tomcat 服务器 接受request请求,再调用Servlet的doGet、doPost等方法。

    Servlet
    Servlet是受容器管理的web组件,它能动态地生成内容。Servlet是一段小程序,被编译成平台无关、架构中立的的字节码之后,可以被 Web服务器器动态地加载和运行。Servlet通过容器实现的请求-相应(request-response)方式与Web浏览器进行交互,这种请求- 相应模式是基于超文本传输协议(HTTP)的。
    Servlet容器
    Servlet容器和Web服务器或者应用服务器一起提供网络服务,能解析MIME编码的请求,能生成MIME编码格式的相应。容器还负责容纳servlet,并对其生命周期进行管理。
    Servlet容器可以内置在Web服务器中,也可以通过web服务器的扩展API作为附加组件安装。Servlet容器同样可以作为具体Web服务功能的应用服务器的内置模块或者附加组件。
    所有的Servlet容器必须支持HTTP协议,并可以支持其他基于请求-相应模式的协议,例如HTTPS。Servlet容器至少需要支持HTTP 1.0版本,并强烈建议同时支持HTTP 1.1版本。

  • Servlet是否单例及线程安全问题

    • servlet作为一个Java类,没有私有构造方法,所以不是单例的类

      Servlet采用多线程来处理多个请求同时访问。servlet依赖于一个线程池来服务请求。线程池实际上是一系列的工作者线程集合。Servlet使用一个调度线程来管理工作者线程。
      当容器收到一个Servlet请求,调度线程从线程池中选出一个工作者线程,将请求传递给该工作者线程,然后由该线程来执行Servlet的service方法。当这个线程正在执行的时候,容器收到另外一个请求,调度线程同样从线程池中选出另一个工作者线程来服务新的请求,容器并不关心这个请求是否访问的是同一个Servlet.当容器同时收到对同一个Servlet的多个请求的时候,那么这个Servlet的service()方法将在多线程中并发执行。
      Servlet容器默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销,提升了对请求的响应时间,对于Tomcat可以在server.xml中通过元素设置线程池中线程的数目。
      就实现来说:
      调度者线程类所担负的责任如其名字,该类的责任是调度线程,只需要利用自己的属性完成自己的责任。所以该类是承担了责任的,并且该类的责任又集中到唯一的单体对象中。而其他对象又依赖于该特定对象所承担的责任,我们就需要得到该特定对象。那该类就是一个单例模式的实现了。
      注意
      服务器可以使用多个实例来处理请求,代替单个实例的请求排队带来的效益问题。服务器创建一个Servlet类的多个Servlet实例组成的实例池,对于每个请求分配Servlet实例进行响应处理,之后放回到实例池中等待下此请求。这样就造成并发访问的问题。
      此时,局部变量(字段)也是安全的,但对于全局变量和共享数据是不安全的,需要进行同步处理。而对于这样多实例的情况SingleThreadModel接口并不能解决并发访问问题。 SingleThreadModel接口在servlet规范中已经被废弃了。

      • 线程安全问题

        1、实现 SingleThreadModel 接口
          该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题。这种方法只要将前面的Concurrent Test类的类头定义更改为:

        Public class ConcurrentServletTest extends HttpServlet implements SingleThreadModel { 
                ······
        }     

        2、同步对共享数据的操作
          使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段,在本论文中的Servlet可以通过同步块操作来保证线程的安全。同步后的代码如下:

        Public class ConcurrentTest extends HttpServlet {
                Username = request.getParameter ("username"); 
                Synchronized (this){ 
                    Output = response.getWriter (); 
                    Try { 
                        Thread. Sleep (5000); 
                    } Catch (Interrupted Exception e){} 
                        output.println("用户名:"+Username+"<BR>"); 
                } 
            } 
        } 

        3、避免使用实例变量
          本实例中的线程安全问题是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。
          修正上面的Servlet代码,将实例变量改为局部变量实现同样的功能,代码如下:

        Public class ConcurrentTest extends HttpServlet {
                public void service (HttpServletRequest request, HttpServletResponse 
        Response) throws ServletException, IOException { 
                PrintWriter output; 
                String username; 
                Response.setContentType ("text/html; charset=gb2312"); 
            } 
        } 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Servlet3.1规范(最终版) JavaTM Servlet 规范 版本 3.1(最终版) Shing Wai Chan Rajiv Mordani [作者] 穆茂强 张开涛 [译者] 2012年6月翻译 2013年7月修订 目录 前言 ............................... 3 其他资料 ............................................................................................................................................................ 3 谁应该读此规范 ................................................................................................................................................ 3 API规范 ............................................................................................................................................................3 其他的 Java 平台规范 ....................................................................................................................................... 3 其他重要参考资料 ............................................................................................................................................ 4 提供反馈 ............................................................................................................................................................ 4 专家组成员 ........................................................................................................................................................ 5 答谢 .................................................................................................................................................................... 5 目录 ............................... 6 概览 .............................. 13 1.1 1.2 1.3 1.4 1.5 1.6 什么是 Servlet? .................................................................................................................................. 13 什么是Servlet容器?...............................................................................................................................13 例子...........................................................................................................................................................13 Serv

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值