您的位置:首页 > 编程语言 > Java开发

Servlet原理

2016-05-03 00:00 477 查看
摘要: Java本身已经是一个平台了,包含了众多的规范,其中关于Web开发的规范就是Servlet规范,各个Servlet容器厂商按照Servlet规范开发出来容器,这样开发出来的应用就能在各个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请求处理方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  servlet java spring