一、什么是Servlet

    Servlet是一种小型的Java程序,它扩展了Web服务器的功能。作为一种服务器端的应用,他是运行在Servlet容器当中,例如Tomcat就是一种流行的Servlet容器。Servlet提供的功能大多与JSP类似,不过实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码,而servlets全部由Java写成并且生成HTML。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式。

  二、Servlet类

    在eclipse里面新建一个Servlet类,在代码区域可以看出它是继承HttpServlet类,继续通过F3键追踪HttpServlet类,发现HttpServlet继承GenericServlet类,继续深入发现GenericServlet是继承实现接口Servlet、ServletConfig、Serializable接口,看下面类图:

  

  附类定义如下:

  1. public abstract class HttpServlet extends GenericServlet
  2.  
  3. public abstract class GenericServlet
  4. implements Servlet, ServletConfig, java.io.Serializable

  三、Servlet容器响应客户请求的过程

    具体的请求过程如下,不过这里需要注意的是如果Servlet实例已经创建那么会直接从D步骤开始执行,否则从B步骤开始执行请求流程。

    A、Servlet引擎检查是否已经装载并创建了该Servlet的实例对象

    B、装载并创建该Servlet的一个实例对象;调用该Servlet的构造器

    C、调用Servlet实例对象的init方法

    D、创建一个用于封装请求的ServletRequest对象和一个代表响应消息的ServletResponse对象,然后调用Servlet的Service方法并将请求和响应对象作为参数传递进去

    E、Web应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destory方法

    其核心步骤无非就是接口Servlet里面的init(ServletConfig config),void service(ServletRequest req, ServletResponse res),destroy()三个方法。

  

  四、Servlet的注册与运行以及映射

    Servlet程序必须在web.xml文件中进行注册和映射其访问路径,只有这样才可以被Servlet引擎加载和被外界访问。一个<Servlet>元素用于注册一个Servlet,主要包含两个子元素,分别是<servlet-name>和<servlet-class>,表示是

Servlet的名称与全类名。一个<servlet-mapping>元素用于映射一个已经注册的Servlet对外访问的路径,包含两个子元素,<servlet-name>和<url-pattern>,表示Servlet的名称与web访问的相对路径。具体的模板如下:

  1. <!-- 配置和映射 Servlet -->
  2. <servlet>
  3. <!-- Servlet 注册的名字 -->
  4. <servlet-name>servletname</servlet-name>
  5. <!-- Servlet 的全类名 -->
  6. <servlet-class>com.wucj.defaultpkg.servlet</servlet-class>
  7. </servlet>
  8.  
  9. <servlet-mapping>
  10. <!-- 需要和某一个 servlet 节点的 serlvet-name 子节点的文本节点一致 -->
  11. <servlet-name>servlet</servlet-name>
  12. <!-- 映射具体的访问路径: / 代表当前 WEB 应用的根目录. -->
  13. <url-pattern>/demo.html</url-pattern>
  14. </servlet-mapping>

  这里需要注意的是同一个Servlet可以被映射到多个url上面,就是多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名字。在这里不得不提通配符,只有两种固定格式;A、 *.扩展名;B、/* ,如下:

  1. <servlet-mapping>
  2. <servlet-name>servletname</servlet-name>
  3. <url-pattern>*.html</url-pattern>
  4. </servlet-mapping>
  5.  
  6. <servlet-mapping>
  7. <servlet-name>servletname</servlet-name>
  8. <url-pattern>/action/*</url-pattern>
  9. </servlet-mapping>

  五、ServletConfig 接口

    Servlet引擎将代表Servlet容器的对象ServletContext和servlet的配置参数封装到ServletContext对象中,在初始化Servlet实例对象时传递给该Servlet。接口具体定义如下:

  1. public interface ServletConfig {
  2.  
  3. public String getServletName();
  4.  
  5. public ServletContext getServletContext();
  6.  
  7. public String getInitParameter(String name);
  8.  
  9. public Enumeration<String> getInitParameterNames();
  10.  
  11. }

  具体的作用就是在Servlet程序中可以调用这些方法获取相关信息。Servlet引擎调用Servlet的实例对象init(ServletConfig config)方法会将ServletConfig对象传递给Servlet。Servlet.getServletConfig()方法必须返回init(ServletConfig config)方法传递进来的这个ServletConfig对象的引用。

  六、ServletContext接口

     Servlet引擎为每个web应用程序都创建一个对应的ServletContext对象,ServletContext对象包含在ServletConfig对象中,调用ServletConfig.getServletContext方法可以返回ServletContext对象的引用。同一个web应用程序中所有的Servlet都共享同一个ServletContext对象。  

  1. ServletContext servletContext = servletConfig.getServletContext();

  七、HttpServletRequest 与 HttpServletResponse

   在这里不得不说HttpServlet对象,它是一个 Servlet, 继承自 GenericServle, 针对于 HTTP 协议所定制。ServletResponse: 封装了响应信息, 如果想给用户什么响应, 具体可以使用该接口的方法实现。在 service() 方法中直接把 ServletReuqest 和 ServletResponse 转为 HttpServletRequest 和 HttpServletResponse。并调用了重载的 service(HttpServletRequest, HttpServletResponse),源代码是:

  1. @Override
  2. public void service(ServletRequest req, ServletResponse res)
  3. throws ServletException, IOException {
  4.  
  5. HttpServletRequest request;
  6. HttpServletResponse response;
  7.  
  8. try {
  9. request = (HttpServletRequest) req;
  10. response = (HttpServletResponse) res;
  11. } catch (ClassCastException e) {
  12. throw new ServletException("non-HTTP request or response");
  13. }
  14. service(request, response);
  15. }
  16.  
  17. public void service(HttpServletRequest request, HttpServletResponse response)
  18. throws ServletException, IOException {
  19. //1. 获取请求方式.
  20. String method = request.getMethod();
  21.  
  22. //2. 根据请求方式再调用对应的处理方法
  23. if("GET".equalsIgnoreCase(method)){
  24. doGet(request, response);
  25. }else if("POST".equalsIgnoreCase(method)){
  26. doPost(request, response);
  27. }
  28. }

  在对象HttpServletRequest中可以获取丰富的请求信息,例如:

  getMethod:返回HTTP请求消息中的请求方式。

  getQueryString :返回请求行中的参数部分。

   getServletPath方法:Servlet的名称或Servlet所映射的路径。

getRemoteAddr方法返回发出请求的客户机的IP地址。

getRemoteHost方法返回发出请求的客户机的完整主机名。

  getRequestURL方法返回客户端发出请求时的完整URL。

  getHeaders方法 。

  以及获取请求参数的方法:getParameter方法、getParameterValues方法、getParameterNames方法、getParameterMap方法 。

  
  在对象HttpServletResponse中主要有:RequestDispatcher接口、

用forward方法实现请求转发、
请求转发的运行流程、
用sendRedirect方法实现请求重定向、
请求重定向的运行流程 。
 
   RequestDispatcher实例对象是由Servlet引擎创建的,它用于包装一个要被其他资源调用的资源(例如,Servlet、HTML文件、JSP文件等),并可以通过其中的方法将客户端的请求转发给所包装的资源。RequestDispatcher接口中定义了两个方法:forward方法和include方法。

forward和include方法接收的两个参数必须是传递给当前Servlet的service方法的那两个ServletRequest和ServletResponse对象,或者是对它们进行了包装的ServletRequestWrapper 或ServletResponseWrapper对象。

  sendRedirect 方法不仅可以重定向到当前应用程序中的其他资源,它还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。 如果传递给sendRedirect 方法的相对URL以“/”开头,则是相对于整个WEB站点的根目录,而不是相对于当前WEB应用程序的根目录。
  RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。

  如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
  调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
  HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
  RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。 
  
   八、那么该怎样用一句话来形容Servlet了?
    待续...
  

java web servlet的更多相关文章

  1. Java Web Servlet知识点讲解(一)

    一.Web应用架构 如图所示: HTTP协议:一个简单的请求一响应协议,通常运行在TCP之上,它指定了客户端可能发送给服务器什么样的信息以及得到什么样的响应. JDBC:Java语言中用来规范客户端程 ...

  2. Java Web -- Servlet(1) 必备知识

    学习Java WEB开发必备的基本概念: 1.WEB 本意是蜘蛛网和网的意思.在网页设计中我们称为网页的意思. 现广泛译作网络.互联网等技术领域.表现为三种形式,即超文本(hypertext).超媒体 ...

  3. 天坑 之 java web servlet+jsp项目 配置后 404 (MyEclipse转eclipse)

    最近搞一个自己的博客系统玩,用了servlet+jsp,结果发现了两个大问题: 1.无法 Export 出 WAR文件: 2.生成WAR,放置到TOMCAT的 webapps目录后,http://lo ...

  4. Java Web -- Servlet(5) 开发Servlet的三种方法、配置Servlet具体解释、Servlet的生命周期(2)

    三.Servlet的生命周期 一个Java servlet具有一个生命周期,这个生命周期定义了一个Servlet怎样被加载并被初始化,怎样接收请求并作出对请求的响应,怎样被从服务中清除.Servlet ...

  5. java web Servlet开发(二)

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...

  6. java web Servlet开发(一)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  7. [Java.Web] Servlet 的一些细节

    本文来自 传智播客视频PPT 1. 由于客户端是通过 URL 地址访问 web 服务器中的资源,所以 Servlet 程序若想被外界访问,必须把 servlet 程序映射到一个 URL 地址上,这个工 ...

  8. java Web servlet简介及其生命周期

    Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容. 我们可 ...

  9. 深入理解Java Web——Servlet

    1.概述 狭义上看,是java的一个接口. 广义上看,任何直接或间接实现了Servlet接口的类. 2.核心对象 下面就是Servlet接口的内容: public abstract interface ...

随机推荐

  1. 【转】定时器、sigevent结构体详解

    原文网址:http://blog.163.com/zheng_he_xiang/blog/static/18650532620116311020390/ 最强大的定时器接口来自POSIX时钟系列,其创 ...

  2. Python easy_install

    系统中有高版本的Python, 直接pip3 install ipcalc安装,都是装到高版本的Python 系统默认的Python是2.7.6,现在想装到默认版本中,可以使用easy_install ...

  3. [Everyday Mathematics]20150118

    设 $X$ 是线性空间, $\phi_1,\cdots,\phi_n,\phi$ 是 $X$ 上的线性泛函, 试证: $$\bex \phi\in \span\sed{\phi_1,\cdots,\p ...

  4. The Bookcase

    题意: 有n本宽w高h的书,向三层书架上放,每层不能为空,求占用的整体的最小面积(总高度*三层中最宽的) 分析: 不太好想,dp[i][j]表示第一层宽度为i第二层为j放的最小高度 dp[i][j]= ...

  5. 在虚拟机中安装windows

    前言: 本来在windows当中安装windows是一件很简单的事,但是在使用光盘进行安装的时候,发现无法进行安装. 思路: 将光盘进行提取成iso文件,一个光盘提取一个iso文件,从而存在两个iso ...

  6. Canvas入门(1):绘制矩形、圆、直线、曲线等基本图形

    来源:http://www.ido321.com/968.html 一.Canvas的基础知识 Canvas是HTML 5中新增的元素,专门用于绘制图形.canvas元素就相当于一块“画布”,一块无色 ...

  7. Java出现No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing

    Java出现No enclosing instance of type E is accessible. Must qualify the allocation with an enclosing   ...

  8. 咏南CS多层插件式开发框架支持最新的DELPHI XE7

    DATASNAP中间件: 中间件已经在好几个实际项目中应用,长时间运行异常稳定,可无人值守: 可编译环境:DELPHI XE5~DELPHI XE7,无需变动代码: 支持传统TCP/IP方式也支持RE ...

  9. delphi 窗口最大化后控件的大小变化怎么设置

    设置按钮的Anchors属性.可以通过此属性设置其边界是否随父类一起变化.默认akleft+aktop即左边界和上边界随窗口变化,也就是说如果窗口位置移动了,按钮将保持其left和top边界与窗口的距 ...

  10. CodeForces 706D Vasiliy's Multiset (字典树查询+贪心)

    题意:最开始的时候有一个集合,集合里面只有一个元素0,现在有q次操作,操作分为3种: + x: 表示向集合中添加一个元素x - x:表示删除集合中值为x的一个元素 ? x:表示查询集合中与x异或的最大 ...