Servlet学习笔记
一,Servlet在web应用程序中的位置:
二,基本工作流程:
- 客户机将请求发送到服务器;
- 服务器上的Web容器实例化(装入)Servlet;
- Web容器将请求信息发送到Servlet;
- Servlet创建一个响应,并将其返回到Web容器;
- web容器将响应发回客户机;
- 服务器官必或Servlet空闲时间超过一定限度时,调用destory()方法退出。
三,主要功能:
- 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
- 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
- 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
- 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
- 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
就像是一个浏览器(客户端)和服务器的一个小助手,服务器收到客户机的请求后,web容器召唤来Servlet并把请求信息交给它:“小老弟,接下来看你的了!”Servlet这个小助手立马就创建了一个响应然后去找Web容器:“顺利完成任务,这是响应结果!”,“做得很棒,这可是你的专长啊”随后Web容器将响应发回客户机;(客户机与Servlet间没有直接的交互。无论客户机对Servlet的请求还是Servlet对客户端的响应,都是通过Web服务器来实现的,这使得Servlet的可移植性大大提高)
四,与Applet和JSP比较
与Applet比较:
- 相同之处:(1)它们不是独立的应用程序,没有main()方法;
(2)它们不是由用户调用,而是由另外一个应用程序(容器)调用;
(3)它们都有一个生存周期,包含init()和destroy()方法;
- 不同之处:
(1)Applet运行在客户端,具有丰富的图形界面;
(2)Servlet运行在服务器端,没有图形界面;
与JSP比较:
JSP转译后的.java文件与Servlet的处理方式一样;Servlet是JSP技术的基础;
(1)JSP使人们把显示和逻辑分隔成为可能,这意味着显示和逻辑开发可以并行进行;而Servlet并没有将输出HTML代码和逻辑处理分离开
(2)JSP是HTML与Java代码结合的嵌套型语言;而Servlet是纯Java;
所以在设计应用界面时,很难充分利用Web页面开发工具,如果这种工具用于开发Web页面布局,所生成的HTML就必须手工嵌入到Servlet代码中;
五,开发Servlet的三种方法:
1,实现Servlet接口:
//Servlet的生命周期:从Servlet被创建到Servlet被销毁的过程 //一次创建,到处服务 //一个Servlet只会有一个对象,服务所有的请求 /* * 1.实例化(使用构造方法创建对象) * 2.初始化 执行init方法 * 3.服务 执行service方法 * 4.销毁 执行destroy方法 */ public class ServletDemo1 implements Servlet { //public ServletDemo1(){} //生命周期方法:当Servlet第一次被创建对象时执行该方法,该方法在整个生命周期中只执行一次 public void init(ServletConfig arg0) throws ServletException {
//TODO:Add your code here
System.out.println("=======init========="); } //生命周期方法:对客户端响应的方法,该方法会被执行多次,每次请求该servlet都会执行该方法 //这个函数用于处理业务逻辑,程序员应把业务逻辑代码写在这里 //request:用于获得客户端(浏览器)的信息 //response:用于向客户端(浏览器)返回信息 public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { //TODO:Add your code here System.out.println("service it"); PrintWriter pw=response.getWriteer(); pw.println("hellow world"); } //生命周期方法:当Servlet被销毁时执行该方法(释放内存) public void destroy() { System.out.println("******destroy**********"); } //当停止tomcat时也就销毁的servlet。 public ServletConfig getServletConfig() { return null; } //包含关于Servlet的信息,如作者,创建日期,描述等 public String getServletInfo() { return null; } }
生命周期图解:
2,继承GenericServlet
扩展了GenericServlet类的Servlet,最常用于构建网络应用程序,这些应用程序使用定制协议或其他非HTTP协议,如FTP,POP3协议等
1 public class ServletDemo2 extends GenericServlet { 2 3 @Override 4 public void service(ServletRequest arg0, ServletResponse arg1) 5 throws ServletException, IOException { 6 System.out.println("BOOGIE"); 7 8 } 9 }
3,继承HttpServlet
一般不覆盖Service()方法,在这种情况下,默认的service()方法将自动调用另一个方法来响应客户的请求;
扩展了Httpservlet类的servlet,它用于构建web应用程序;Httpservlet类扩展了GenericServleet,因此继承了它所有的功能,主要用于生成处理基于Http的连接要求;
1 public class ServletDemo3 extends HttpServlet { 2 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) 5 throws ServletException, IOException { 6 System.out.println("ISEE"); 7 } 8 9 @Override 10 protected void doPost(HttpServletRequest req, HttpServletResponse resp) 11 throws ServletException, IOException { 12 System.out.println("up"); 13 doGet(req,resp); 14 } 15 16 }
总结:
- 所有的Servlet必需直接或间接的实现javax.servlet.Servlet接口
- 如果编写的Servlet程序与HTTP协议无关,那么必须继承GenericServlet类;若有关,必须继承HttpServlet类;
- 在创建支持HTTP协议的Servlet类的时候,我们必须扩展javax.servlet.HttpServlet类。