一、Servlet简介

Servlet是sun公司提供一门用于开发动态web资源的技术。

sun公司在其API中提供了一个servlet接口,用户若想开发一个动态web资源(即开发一个java程序向浏览器输出数据),需要完成以下步骤即可:

1、编写一个java类,实现servlet接口

2、把研发好的java类部署到web服务器(配置路径)

所以servlet本身是一个java类,这种java类可以提供web形式的访问,通过Java的API动态的向客户输出内容。

Servlet是JavaWeb的三大组件(filter,Servlet,listener)之一,客户端发出请求,这些请求都交由servlet来处理,接受请求数据(传过来的参数值)、

处理请求、发回响应。每个servlet都必须实现javax.servle.Servlet接口。

二、Servlet运行过程

servlet程序是由web服务器调用,web服务器受到客户端的请求后:

  1. web服务器首先检查是否已经装载了servlet的实例对象,如果是直接执行第四步,否则执行第二步
  2. 装载并创建一个servlet的实例对象
  3. 调用servlet实例对象的哦init()方法进行初始化
  4. 创建一个用于封装HTTP请求消息的httpservletRequest对象和一个代表HTTP响应信息的httpservletResponse对象,然后调用service()方法,请求和响应对象作为参数
  5. web应用程序被停止或者重新启动之前,servlet引擎将卸载servlet,并在卸载之前调用servlet的destory()方法进行销毁

三、实现一个Servlet

3.1实现javax.Servlet.Servlet接口

  1. package com.briup.web.servlet;
  2.  
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5. import java.nio.charset.Charset;
  6.  
  7. import javax.servlet.Servlet;
  8. import javax.servlet.ServletConfig;
  9. import javax.servlet.ServletException;
  10. import javax.servlet.ServletRequest;
  11. import javax.servlet.ServletResponse;
  12. //向浏览器写会一个页面
  13. public class Test3_Servlet implements Servlet{
  14.  
  15. @Override
  16. public void init(ServletConfig config) throws ServletException {
  17. // TODO Auto-generated method stub
  18.  
  19. }
  20. @Override
  21. public ServletConfig getServletConfig() {
  22. // TODO Auto-generated method stub
  23. return null;
  24. }
  25. @Override
  26. public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
  27. //向页面写东西第一步设置编码格式与内容格式
  28. res.setContentType("text/html;charset=utf-8");
  29. //向页面写回东西
  30. PrintWriter out = res.getWriter();
  31. out.println("<html>");
  32. out.println("<head>");
  33. out.println("<title>test</title>");
  34. out.println("</head>");
  35. out.println("<body>");
  36. out.println("<h1>helloworld</h1>");
  37. out.println("</body>");
  38. out.println("</html>");
  39. //将缓冲带输出干净
  40. out.flush();
  41. }
  42. @Override
  43. public String getServletInfo() {
  44. // TODO Auto-generated method stub
  45. return null;
  46. }
  47. @Override
  48. public void destroy() {
  49. // TODO Auto-generated method stub
  50.  
  51. }
  52. }

  在servlet接口中共有五个方法,void init()方法是用来初始化servlet对象时调用的;ServletConfig getServletConfig()方法返回一个servletConfig对象,

以后会介绍这个对象的用途;void service()方法是在访问servlet对象的时候被调用;String getServletInfo()返回servlet的相关信息,比如作者、版权、版本等;

void destory()在销毁servlet的时候被调用。

3.2继承javax.servlet.GenericServlet类

  1. package com.briup.web.servlet;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6.  
  7. import javax.servlet.GenericServlet;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.ServletOutputStream;
  10. import javax.servlet.ServletRequest;
  11. import javax.servlet.ServletResponse;
  12. import javax.servlet.annotation.WebServlet;
  13. //实现servlet的第二种方式继承GenericServlet类,然后实现在网页上展示图片的功能
  14. //该类中只有一种抽象方法只需要实现这个抽象方法就可以了
  15. //用字节流用页面输出一张图片
  16. @WebServlet("/young")
  17. public class Test_Servlet extends GenericServlet{
  18.  
  19. @Override
  20. public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
  21. // TODO Auto-generated method stub
  22. InputStream in=Test_Servlet.class.getClassLoader().getResourceAsStream("1.jpg");
  23. //类加载器把类变成流
  24. int len = in.available();//流无间断的输出的长度
  25. byte [] bug=new byte[len];
  26. in.read(bug);//读取这个流
  27. res.setContentType("image/jpeg");//设置响应的格式
  28. ServletOutputStream out=res.getOutputStream();//用res向页面输出
  29. out.write(bug);
  30. out.flush();
  31. if(in!=null) in.close();
  32. }
  33.  
  34. }

  抽象类genericServlet里面只有一个抽象方法service,它实现了servlet接口的其余四个抽象方法,所以我们需要重写这个方法就行了。

3.3继承javax.servlet.HttpServlet类

  1. package com.briup.web.servlet;
  2.  
  3. import java.io.IOException;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9.  
  10. /**
  11. * Servlet implementation class Test2_Servlet
  12. */
  13. @WebServlet("/Test2_Servlet")//实现servlet的第三种方式,继承httpservlet
  14. //这个httpservlet类中没有任何的抽象方法,但是可以重写两个写好的方法
  15. //向页面输出一句话
  16. public class Test2_Servlet extends HttpServlet {
  17. private static final long serialVersionUID = 1L;
  18.  
  19. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  20. response.getWriter().println("test2");
  21. String path = request.getServletPath();
  22. System.out.println(path);
  23. }
  24.  
  25. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  26. // TODO Auto-generated method stub
  27. doGet(request, response);
  28. }
  29.  
  30. }

  httpservlet是一个抽象类,但是没有任何的抽象方法。httpservlet中定义了许多的doXXXX()方法,每一种方法都对应了浏览器发送请求的方法,

一般常用浏览器发送请求的方法为get和post方式的,所以我们基本上都是重写这两个方法,下面是httpservlet类中的一些源代码,还有一些doxxxx()方法没有列出。

  1. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  2. throws ServletException, IOException
  3. {
  4. String protocol = req.getProtocol();
  5. String msg = lStrings.getString("http.method_get_not_supported");
  6. if (protocol.endsWith("1.1")) {
  7. resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
  8. } else {
  9. resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
  10. }
  11. }
  12. protected void doHead(HttpServletRequest req, HttpServletResponse resp)
  13. throws ServletException, IOException {
  14.  
  15. if (DispatcherType.INCLUDE.equals(req.getDispatcherType())) {
  16. doGet(req, resp);
  17. } else {
  18. NoBodyResponse response = new NoBodyResponse(resp);
  19. doGet(req, response);
  20. response.setContentLength();
  21. }
  22. }
  23. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  24. throws ServletException, IOException {
  25.  
  26. String protocol = req.getProtocol();
  27. String msg = lStrings.getString("http.method_post_not_supported");
  28. if (protocol.endsWith("1.1")) {
  29. resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
  30. } else {
  31. resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
  32. }
  33. }
  34. protected void doPut(HttpServletRequest req, HttpServletResponse resp)
  35. throws ServletException, IOException {
  36.  
  37. String protocol = req.getProtocol();
  38. String msg = lStrings.getString("http.method_put_not_supported");
  39. if (protocol.endsWith("1.1")) {
  40. resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
  41. } else {
  42. resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
  43. }
  44. }

  

四、servlet的生命周期

4.1生命周期相关方法和特点

void init():servlet对象创建之后马上执行的初始化方法,只执行一次;

void service():每次请求都是调用这个方法,它会被调用很多次;

void destory():在servlet被销毁之前调用,负责释放servlet对象占用资源的方法。

特点:线程不安全的,所以效率较高;servlet类由自己编写,但对象由服务器来创建,并有服务器来调用相关的方法。

4.2生命周期

1.servlet是单例,所以servlet在运行期间只会运行创建一个servlet

2.默认情况下,servlet对象在用户第一次访问的时候,由Tomcat服务器来创建

3.servlet对象创建成功后,Tomcat服务器会通过层层调用,无参的init方法对创建好的servlet对象进行初始化

4.如果用户要访问这个servlet对象,那么Tomcat服务器会调用servlet对象中的service方法,最后通过层层调用,调用到的是

 我们重写到的doget()和dopost()方法

5.当servlet对象被销毁的时候,Tomcat会调用servlet的destory方法,程序员就可以调用这个方法进行销毁

6.可以通过修改web.xml文件的配置,去改变servlet对象的创建时间,<servlet-on-startup>标签里面设置一个整数值

数值的大小可以决定servlet对象被创建的先后顺序,数值越小越先被创建,默认情况下是0。

图解:

详细说明:

五、Servlet工作原理

首先简单解释一下Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的,通过源代码可见,

service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。

在Servlet接口和GenericServlet中是没有doGet,doPost等等这些方法的,HttpServlet中定义了这些方法,但是都是返回error信息。

所以,我们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些方法。

  每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,

分别是上文提到的init(),service(),destroy()方法。GenericServlet是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。

而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口。所以我们定义Servlet的时候只需要继承HttpServlet即可。

只有一个需要实现的抽象方法service

定义了很多变量和很多方法,我们可以重写一些需要的方法。

Servlet接口和GenericServlet是不特定于任何协议的,而HttpServlet是特定于HTTP协议的类,所以HttpServlet中实现了service()方法,

并将请求ServletRequest,ServletResponse强转为HttpRequest和HttpResponse。

  1. public void service(ServletRequest req, ServletResponse res)
  2. throws ServletException, IOException {
  3.  
  4. HttpServletRequest request;
  5. HttpServletResponse response;
  6.  
  7. try {
  8. request = (HttpServletRequest) req;
  9. response = (HttpServletResponse) res;
  10. } catch (ClassCastException e) {
  11. throw new ServletException("non-HTTP request or response");
  12. }
  13. service(request, response);
  14. }
  15. }

  代码的最后调用了HTTPServlet自己的service(request,response)方法,然后根据请求去调用对应的doXXX方法,因为HttpServlet中的doXXX方法都是返回错误信息,

  1. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  2. throws ServletException, IOException
  3. {
  4. String protocol = req.getProtocol();
  5. String msg = lStrings.getString("http.method_get_not_supported");
  6. if (protocol.endsWith("1.1")) {
  7. resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
  8. } else {
  9. resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
  10. }
  11. }

  所以我们需要在servlet类中重写这些方法。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Servlet响应请求阶段:

  对于用户到达Servlet的请求,Servlet容器会创建特定于这个请求的ServletRequest对象和ServletResponse对象,然后调用Servlet的service方法。

service方法从ServletRequest对象获得客户请求信息,处理该请求,并通过ServletResponse对象向客户返回响应信息。

  对于Tomcat来说,它会将传递过来的参数放在一个Hashtable中,该Hashtable的定义是:

   这是一个String-->String[]的键值映射。

  HashMap线程不安全的,Hashtable线程安全。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Servlet终止阶段:

  当WEB应用被终止,或Servlet容器终止运行,或Servlet容器重新装载Servlet新实例时,Servlet容器会先调用Servlet的destroy()方法

,在destroy()方法中可以释放掉Servlet所占用的资源。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Servlet与JSP的比较:

  有许多相似之处,都可以生成动态网页。

  JSP的优点是擅长于网页制作,生成动态页面比较直观,缺点是不容易跟踪与排错。

  Servlet是纯Java语言,擅长于处理流程和业务逻辑,缺点是生成动态网页不直观。

JavaWeb(一)-Servlet知识的更多相关文章

  1. JavaWeb入门——背景知识

    JavaWeb入门——背景知识 摘要:本文主要介绍了Web服务器的相关知识. 概念 什么是JavaWeb JavaWeb,是用Java技术来解决相关Web互联网领域的技术的总称.Web包括:Web服务 ...

  2. 关于JavaWeb中Servlet的总结

    Servlet知识结构图 Servlet是JavaWeb服务器端的程序,一般一个Servlet处理一种特定的请求.Servlet编写好后,需要指定其所处理的请求的请求路径,也可以认为Servlet是一 ...

  3. javaWeb - 1 — servlet — 更新完毕

    1.先来聊一些javaWeb相关的知识 简单了解一下:web的发展史 1).web就是网页的意思嘛 2).web的分类 (1).静态web 使用HTML.CSS技术,主要包括图片和文本 优点:简单,只 ...

  4. JavaWeb学习——Servlet相关的接口和类

    JavaWeb学习——Servlet相关的接口和类 摘要:本文主要学习了Servlet相关的接口和类. Servlet的接口和类 三种方式 实现Servlet有三种方式: 实现javax.servle ...

  5. JavaWeb之Servlet入门(二)

    1. 准备 在JavaWeb之Servlet入门(一)中,我们完成了第一个Servlet程序,完成了从URL到后台控制器的中转过程,接下来我们延续JavaWeb之Servlet入门(一)学习下如何传参 ...

  6. 浅谈JavaWEB入门必备知识之Servlet入门案例详解

    工欲善其事.必先利其器,想要成为JavaWEB高手那么你不知道servlet是一个什么玩意的话,那就肯定没法玩下去,那么servlet究竟是个什么玩意?下面,仅此个人观点并通过一个小小的案例来为大家详 ...

  7. Javaweb:Servlet

    servlet简介 Servlet(Server Applet)是 Java Servlet 的简称,是使用 Java 语言编写的运行在服务器端的程序.具有独立于平台和协议的特性,主要功能在于交互式地 ...

  8. JavaWeb之Servlet、拦截器、监听器及编程思想

    本文包含的内容有: Servlet的理解 自定义Servlet.监听器和过滤器 三者的一点点编程设计思想 后续的学习 JavaWeb是Web开发的重要基础,对Servlet.监听器和过滤器等知识的掌握 ...

  9. Servlet知识

    1.Servlet概述 2.编写Servlet的开发步骤a.建立标准的JavaWeb应用目录FirstAppWEB-INFclasseslibweb.xmlb.编写一个类,实现javax.servle ...

随机推荐

  1. MTK6261之Catcher工具的Database Path

    在Catcher使用使用的时候我们常用要选择Database Path 设置数据库的路径,编译自动生成的文件: 设置路径选项: (一般是在对应工程文件的路径 \tst\database_classb) ...

  2. Java好的的工具类:JsonUtils

    package com.nxhfzx.gdshopping.utils; import java.util.List; import com.fasterxml.jackson.core.JsonPr ...

  3. 微信小程序商城开源项目,Weixin-App-Shop 1.0 版本正式发布!!!

    微信小程序商城开源项目,Weixin-App-Shop 1.0 版本正式发布 Weixin-App-Shop 是捷微团队开发的微信小程序商城开源项目,涵盖了微信商城的全部功能,能够快速发布简单易用的小 ...

  4. Golang源码探索(二) 协程的实现原理(转)

    Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱,虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底 ...

  5. Golang源码探索(三) GC的实现原理(转)

    Golang从1.5开始引入了三色GC, 经过多次改进, 当前的1.9版本的GC停顿时间已经可以做到极短.停顿时间的减少意味着"最大响应时间"的缩短, 这也让go更适合编写网络服务 ...

  6. [GNU] 喝一杯咖啡, 写一写 Makefile

    Makefile 是 Linux 下组织程序的一个工具,它的命令是 make. (首字母M/m都可以) [Makefile] Makefile 编写的主旋律: target: [dependency] ...

  7. python+requests库,接口自动化

    1.requests库的使用 requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说明的: “ ...

  8. ADDED、ADDED_TO_STAGE、REMOVED、REMOVED_FROM_STAGE这几个事件的区别

    var _container:Sprite = new Sprite(); _container.addEventListener(Event.ADDED,onAdded); _container.a ...

  9. 并发编程 process 模块的方法及运用 僵尸与孤儿

    进程创建的两种方法 Process() 继承Process 重写run方法,传参数的时候要写init,但是注意要在init方法中运行父类的init方法 Windows下写代码开启子进程时,必须写上if ...

  10. php 配置xdebug

    https://blog.csdn.net/Alan8865/article/details/81331252