1.servlet的来源
早期的web应用主要用于浏览新闻等静态页面,用户通过HTTP协议请求服务器上的静态页面,服务器上的web服务器软件接收到请求后,读取URI标示的资源,再加上消息报头发送给客户端浏览器,浏览器负责解析HTML,将结果呈现出来。
然而随着时间发展,用户已经不满足于仅浏览静态页面。用户需要一些交互操作,获取一些动态结果。如果基于HTTP协议实现服务器端软件增强功能太过复杂,所以需要一些扩展机制来实现用户想要的功能。早期使用的web服务器扩展机制是CGI(Common Gateway Interface,公共网关接口)。使用这种方法,用户单击某个链接或输入网址来访问CGI程序,web服务器收到请求后,运行该CGI程序 ,对用户请求进行处理,紧接着将处理结果并产生一个响应,该响应被返回给web服务器,web服务器对响应进行包装,以HTTP响应的方式返回给浏览器。
CGI程序在一定 程度上解决了用户需求。不过还存在一些不足之处,如CGI程序编写困难,响应时间较长,以进程方式运行导致性能受限。于是1997年,sun公司推出了servlet技术,作为java阵营的CGI解决方案。
2.servlet容器
Servlet 的本质是一个帮助程序,基于java技术的web组件,运行在服务器端,它由servlet容器所管理,用于生成动态的内容。Servlet是平台独立的java类,编写一个servlet,实际上就是按照servlet规范写一个java类。Servlet 被编译为平台独立的字节码,可以被动态地加载支持java技术的web服务器中运行。
Servlet没有main方法,不能独立运行,它必须被部署到servlet容器中,由容器来实例化和调用servlet的方法(如doGet()和doPost()),servlet容器在servlet的生命周期内包容和管理servlet。在jsp技术推出后,管理和运行servlet/JSP的容器也称为web容器。
有了servlet之后,用户通过单击某个链接或者直接在浏览器的地址栏中输入URL来访问servlet,web服务器接收到该请求后,并不是将请求直接交给servlet,而是交给servlet容器。Servlet容器实例化servlet,调用servlet的一个特定方法对请求进行处理,并产生一个响应。这个响应由servlet容器返回给web服务器,web服务器包装这个响应,以HTTP响应的形式发送给web浏览器。
2.1 Servlet容器职能
A 、通信支持:利用容器提供的方法,你能轻松的让servlet与web服务器对话,而不用自己建立servetsocket,监听某个端口,创建流等等。容器知道自己与web服务器之间的协议,所以你的servlet不用担心web服务器(如Apache)和你自己的web代码之间的API,只需要考虑如何在servlet中实现业务逻辑(如处理一个订单)。
B、生命周期管理:servlet容器控制着servlet的生与死,它负责加载类、实例化和初始化servlet,调用servlet方法,以及使servlet实例被垃圾回收,有了servlet容器,你不需要太多的考虑资源管理。
C、多线程支持:容器会自动为它所接收的每个servlet请求创建一个新的java线程。针对用户的请求,如果servlet已经运行完相应的http服务方法,这个线程就会结束。这并不是说你不需要考虑线程安全性,其实你还会遇到同步问题,不过这样能使你少做很多工作。
声明方式实现安全:利用sevlet容器,你可以使用xml部署描述文件来配置和修改安全性,而不必将其硬编码写到servlet类代码中。
D、JSP支持:servlet容器负责将jsp代码翻译为真正的java代码。
2.2 容器处理用户请求过程
1)用户点击一个链接,指向一个servlet而不是一个静态页面。
2)web服务器接到这个请求后转发给容器。容器接着创建两个对象:HttpServletRequest和HttpServletResponse。
3)容器根据请求中的URL找到相应的servlet,为这个请求创建一个线程,并把请求对象HtttpServletRequest和响应对象HttpServletResponse传递给这个servlet线程。
4)线程接下来调用service()方法,根据请求的不同,service()方法调用doGet()和doPost()方法。
5)doGet()方法生成动态页面,并把这个页面塞到响应对象里。
6)service()方法结束,随之线程结束,容器把响应对象装换为一个HTTP相应,发送给客户,然后删除请求和响应对象。
3.Servlet的生命周期
注意他的一生都是由容器控制的。servlet一生中只有一个实例出现,但是有多个线程出现。
- 加载类 Servlet .class文件
- 实例化 构造函数运行
- 初始化 容器调用 init() 方法(一生只调一次)
- service方法? servlet一生主要在这里度过
- 销 毁? 销毁实例之前调用 destroy() 方法
- 可回收? 等待垃圾回收等待垃圾回收
init()方法:在servlet实例被创建后调用,可以覆盖此方法做一些初始化的工作,比方说得到一个数据库连接。
service()方法:当客户请求到来时,容器会创建一个新的线程,调用servlet的service()方法。
doGet或者doPost()方法:service方法根据请求的HTTP方法,来调用doGet()或者doPost()方法。我们在开发servlet时肯定要覆盖此方法。每次运行doGet()或者doPost()方法,它都在一个单独的线程中。
4.jsp和servlet的区别和联系:
1.JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类
2.JSP更擅长表现于页面显示,servlet更擅长于逻辑控制.
3.Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.
相同点:
JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。
不同点:
Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。
而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。
5、servlet demo
1、定义DAO层、Entity层
2、定义Service 层
3、定义Servlet 层
如:定义一个数据删除servlet
public class DeleteServlet extends HttpServlet