Servlet原理

    Servlet规范定义了HttpServlet,HttpRequest,HttpResponse,HttpCookie,HttpSession,RequestDispatcher,看到了这么多定义,就该知道这一切都是为了Java实现开发Web的能力,最新的Servlet规范支持在启动时编程式添加Servlet,FIlter。Servlet规范本身是为了让各个Servlet容器厂商能够兼容应用。

    Servlet规范不光是文档说明,同时也包含少数的类和多数接口代码,每个Servlet容器厂家要实现接口中的方法。不光是Servlet规范是这种方法,JDBC规范也是这种形式,都是针对于接口编程。Servlet已经被Sun设计出来了,只不过需要各个Servlet容器来实现具体的功能。

    Servlet本身就是一个Java类,只不过继承了HttpServlet,实现了自己的init,service,destroy的方法而已。

    Servlet还是由Tomcat派生的系统类加载器类加载器加载到永久区(永久区在JDK8中已经不存在,被元数据区所替代,元数据区顾名思义就是类定义文件所存在的区域)

    Servlet被加载到永久区(元数据区)之后,便会被执行init,这样Servlet的初始化就完成了,接着请求过来的时候Servlet的service方法将被多次调用。

    绝大多数情况下,每个Servlet只会实例化一个对象出来,供容器调用,所以自定义的Servlet中不要使用成员变量保存和请求相关的状态,因为多线程处理多个请求,所以保存状态会被其他线程覆盖。除非使用ThreadLocal,使得每个线程保存的数据是私有的,不会被其他线程所读写到。但这也不能保证一个请求的数据就是安全的。

    如果一定要使用成员变量保存请求的状态,

    1.可以通过实现SingleThreadModel接口,这样就能保证每个请求创建一个Servlet,但是建议不要这样做,这样会导致Servlet容器频繁的创建Servlet对象。

    2.另外也可以把状态保存在HttpServletRequest中,因为每个请求都会对应一个Request,所以保存在这个位置算是最好的状态保存方式了。

    SpringMVC就是基于Servlet所开发的,所以SpringMVC开发的代码基本上可以移植到各个Servlet容器,而与之对应的有Play框架,Play框架完全放弃了Servlet, 底层使用netty来实现网络侦听,接收请求,解析Http协议,然后封装了请求派送给Handler中处理。完全实现了自己的一套Http请求处理方式。

    

    

    

你可能感兴趣的:(java,spring,servlet)