• java web开发(二)、Servlet技术


          Servlet简单的说,就是服务器端的程序。Servlet介于客户请求和服务器响应之间,用于处理客户请求和服务器响应,例如可以生成动态的生成Web响应页面。

    一、Servlet最关键的四个部分:

          1)请求对象:ServletRequest和HttpServletRequest,Servlet从该对象中获取客户端的请求信息;

          2)响应对象:ServletResponse和HttpServletesponse,Servlet通过该对象生成响应结果;

          3)Servlet配置对象:ServletConfig,Servlet通过该对象回去初始化参数信息和ServletContext对象;

          4)Servlet上下文对象:ServletContext,Servlet通过该对象访问容器(Tomcat)为当前web应用提供的各种功能。

    二、Servlet接口图

         1)Servlet API的核心接口是javax.servlet.Servlet接口,所有的Servlet类都必须实现这一接口。

         2)javax.servlet.GenericServlet 抽象类实现了Servlet 接口,而javax.servlet.http.HttpServlet 抽象类是 GenericServlet 类的子类。当用户开发自己的Servlet类时,可以选择扩展GenericServlet类或者HttpServlet类。

         3)GenericServlet类和HttpServlet类主要有三个函数:

                A: init():Servlet初始化函数;

                B: service():Servlet服务函数,这里编写Servlet的功能;service方法有两个参数:ServletRequest和ServletResponse。Servlet容器将客户的请求信息封装在ServletRequest对象中,传给service方法;service方法将响应客户的结果通过ServletResponse传给客户。

               ServletRequest接口:ServletRequest接口封装了客户请求信息,如客户请求方式、参数名和参数值、客户端正在使用的协议,以及发出客户请求的远程主机信息等。ServletRequest接口还为Servlet提供了直接以二进制数方式读取客户请求数据流的ServletInputStream。ServletRequest的子类可以为Servlet提供更多的与特定协议相关的数据。

             ServletResponse接口:ServletResponse接口为Servlet提供了返回响应结果的方法。它允许Servlet设置返回数据的长度和MIME类型,并且提供了输出流ServletOutputStream。ServletResponse子类可以提供更多和特定协议相关的方法。

            特别需要指出的是Servlet是以多线程的方式工作的,Servlet可以同时处理多个请求。作为开发人员,需要注意Servlet成员变量的线程安全,在doGet()、doPost()中的局部域变量是线程安全的,而Servlet的成员变量则有线程安全的隐患。所以除非你有意需要应用这种特性,在一般情况下,不宜将一些可改写的变量定义成Servlet的成员变量,否则一定要采取线程同步的措施确保线程安全。

              C:  destroy():Servlet销毁函数。

         4)GenericServlet类和HttpServlet类都实现了ServletConfig接口,因此可以通过getInitialParameter()和getServletContext()来获取初始参数和上下文对象。

         

    三、ServletContext对象

          ServletContext定义了一系列方法用于与相应的servlet容器通信,每一个ServletContext对应着一个web应用, 

          Servlet容器在启动时会加载Web应用,并为每个Web应用创建惟一的ServletContext对象。可以把ServletContext看成是一个Web应用的服务器端组件的共享内存。

    在ServletContext中设置的属性,在Web应用运行期间一直存在,当Web应用被关闭时,Servlet容器会销毁ServletContext对象,存储在ServletContext对象中的属性自然也不复存在。不同应用的ServletContext各自独立。

           ServletContex主要的功能如下:

        1)设置属性,可以通过编程的方式绑定,也可以作为web应用的全局变量被所有Servlet和JSPs访问

               setAttribute(string Name。 Object object),getAttribute(string Name),getAttributeNames(),removeAttribute(string Name)

          2)获取web应用资源

               获取在web.xml中配置的初始化参数:getInitparameter(string Name)

               向其他web组件转发请求的RequestDispather对象:getRequestDispather(string path)

          3)访问Servlet容器中的其他Web应用

                getContext(string url),根据url返回当前servlet容器中其他web应用的ServletContext对象

          4)访问服务器端的文件系统资源

                根据服务器端的虚拟路径返回真实路径:getRealPath(string path)

                返回一个映射到指定路径的url:getResource(string path)

                返回一个读取服务器端文件的流:getResourceAsStream(string path)

                返回参数指定的文件的MIme类型:getMimeType(string file)

          5)访问Servlet容器的相关信息

               容器的名字和版本:getServletInfo()

               容器支持的主版本和次版本号:getMajorVersion()和 getMinorVersion()         

         6)输出日志

               向servlet的日志文件写日志:log(string msg)

               向servlet的错误日志文件写错误日志信息:log(string msg,Throwable throwalbe) 

    四、Servlet示例

    新建工程:ServletSample。

    新建包:ServletSampleGroup

    新建Class:

    Package: ServletSampleGroup

    Name: HelloServlet

    Superclass: javax.servlet.http.HttpServlet

    Finish

    HelloServlet代码如下:

    package ServletSampleGroup;   
      
    import java.io.IOException;   
    import java.io.PrintWriter;   
      
    import javax.servlet.ServletException;   
    import javax.servlet.http.HttpServlet;   
    import javax.servlet.http.HttpServletRequest;   
    import javax.servlet.http.HttpServletResponse; 

    public class HelloServlet extends HttpServlet {
     
    public void doGet(HttpServletRequest request,HttpServletResponse response)
     
    throws IOException, ServletException {
      
      response.setContentType(
    "text/html");
      PrintWriter writer 
    = response.getWriter();
      writer.println(
    "Hello World!!"+context.getInitPatameter("weather"));
     }
    }

    web.xml文件中对HelloServlet类做了如下配置

    <web-app>
      <context-param>                               //初始化参数
        <param-name>weather</param-name>
        <param-value>Today is a nice day.</param-value>
      </context-param>

      <servlet>                                    //Servlet配置,指定HelloServlet对应的类
       
    <servlet-name> HelloServlet </servlet-name>      
        
    <servlet-class>ServletSampleGroup.HelloServlet</servlet-class>      
      
    </servlet> 
      
    <servlet-mapping>                            //Servlet配置,指定访问HelloServlet的网页后缀
       
    <servlet-name> HelloServlet</servlet-name>
       
    <url-pattern> /HelloServlet</url-pattern>
     
    </servlet-mapping> 
    </web-app>

    启动Tomcat。

    打开浏览器,地址栏内输入:

    http://localhost:8080/ServletSample/HelloServlet

    屏幕输出: Hello World!!Today is a nice day.

    五、Servlet的生命周期

         Servlet的生命周期开始于被装载到Servlet容器中,结束于被终止或重新装入时。Servlet的生命周期可以分为3个阶段:初始化阶段、响应客户请求阶段和终止阶段。在javax.servlet.Servlet接口中定义了3个方法init()、service()和destroy(),它们将分别在Servlet的不同阶段被调用:

    1)初始化阶段

        在下列情形下Servlet容器自动装载Servlet:

           Servlet容器启动时自动装载某些Servlet

          在Servlet容器启动后,客户首次向Servlet发出请求

          Servlet的类文件被更新后,重新装载Servlet

          Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期中,init方法只会被调用一次。init方法有两种重载形式:

                  public void init(ServletConfig config) throws ServletException;

                  public void init() throws ServletException;

          在Servlet的初始化阶段,Servlet容器会为Servlet创建一个ServletConfig对象,用来存放Servlet的初始化配置信息,如Servlet的初始参数。如果Servlet类覆盖了第一种带参数的init方法,应该先调用super.init(config)方法确保参数config引用ServletConfig对象;如果覆盖的是第二种不带参数的init方法,可以不调用super.init()方法,如果要在init方法中访问ServletConfig对象,可以调用Servlet类的getServletConfig()方法。

    2)响应客户请求阶段

         对于到达Servlet容器的客户请求,Servlet容器创建特定于这个请求的ServletRequest对象和ServletResponse对象,然后调用Servlet的service方法。service方法从ServletRequest对象获得客户请求信息并处理该请求,通过ServletResponse对象向客户返回响应结果。

    3)终止阶段

         当Web应用被终止,或Servlet容器终止运行,或Servlet容器重新装载Servlet的新实例时,Servlet容器会先调用Servlet的destroy方法。在destroy方法中,可以释放Servlet所占用的资源。

    六、HTTP与HttpServlet

          HTTP是一种基于请求/响应模式的协议。客户端发送一个请求,服务器返回对该请求的响应。HTTP使用可靠的TCP连接,默认端口是80

          在HTTP中,客户端/服务器之间的会话总是由客户端通过建立连接和发送HTTP请求的方式初始化,服务器不会主动联系客户端或要求与客户端建立连接。在会话开始后,浏览器或服务器都可以随时中断连接,例如,在浏览网页时可以随时点击“停止”按钮中断当前的文件下载过程,关闭与Web服务器的HTTP连接。

    6.1 HTTP请求

    HTTP请求由3个部分构成,分别是:请求方法、URI、协议/版本,请求头,请求正文

    例如:

    GET /sample.jsp HTTP/1.1

    Accept:image/gif.image,image/jpeg.*.*

    Accept-Lauguage:zh-cn

    Connection:Keep-Alive

    Host:localhost

    User-Agent:Mozilla/4.0

    Accept-Encoding:gzip,deflate

    username=weiqin&password=1234

    1)请求方法、URI、协议/版本

    GET /sample.jsp HTTP/1.1

    根据HTTP标准,HTTP请求可以使用多种请求方法。例如,HTTP 1.1支持7种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TRACE。

    URI完整的指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“/”开头。

    协议版本声明了通信过程中使用的HTTP的版本。

    2)请求头

    请求头包含许多有关客户端环境和请求正文的有用信息。

    3)请求正文

    请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来是请求的正文。请求正文中可以包含客户提交的查询字符串信息。

    6.2 HTTP响应

         与HTTP请求类似,HTTP响应也由3个部分构成,分别是:协议、状态代码、描述,响应头,响应正文。

    例如:

    HTTP/1.1 200 OK

    Server:ApacheTomcat/5.0

    Date:Mon,6 Oct 2003 13:13:13 GMT

    Content-Type:text/html

    Last-Modified: Mon,6 Oct 2003 13:03:13 GMT

    Content-Length:112

    <html>

    <head>

    <title>HTTP响应示例</title>

    </head>

    <body>

    Hello HTTP!

    </body>

    </html>

    1)协议、状态代码、描述

    HTTP响应的第一行类似于HTTP请求的第一行,它表示通信所使用的协议是HTTP 1.1,服务器已经成功地处理了客户端发出的请求。

    2)响应头

    响应头也和请求头一样包含许多有用的信息,例如服务器类型、日期时间、内容类型和长度等。

    3)响应正文

    响应正文就是服务器返回的HTML页面,响应头和正文之间也必须用空行分隔。

    6.3 HttpServlet的功能

         在了解了具体的HTTP协议规范后,可以更好地理解HttpServlet的作用。它能够根据客户发出的HTTP请求,生成相应的HTTP响应结果。HttpServlet首先必须读取HTTP请求的内容。Servlet容器负责创建HttpServletRequest对象,并把HTTP请求信息封装到HttpServletRequest对象中,这大大简化了HttpServlet解析请求数据的工作量。如果没有HttpServletRequest,HttpServlet只能直接处理Web客户发出的原始的字符串数据,有了HttpServletRequest后,只要调用HttpServletRequest的相关方法,就可以方便地读取HTTP请求中任何一部分信息。

    HttpServletRequest中读取HTTP请求信息的常用方法:

           getCookies():返回HTTP请求的Cookies

           getRequestURI():返回HTTP请求URI

           getQueryString():返回HTTP请求数据中的查询字符串

           getMethod():返回HTTP请求方法

          Servlet容器还向HttpServlet提供了HttpServletResponse对象,HttpServlet可以通过它来生成HTTP响应的每一部分内容。

    HttpServletResponse提供的生成响应数据Header的方法:

           addCookie(Coolie cookie):向HTTP响应中加入Cookie

           setHeader(String name,String value):设置HTTP响应的Header。

    6.4 Servlet容器响应Web客户请求的步骤:

    (1)Web客户向Servlet容器发出HTTP请求;

    (2)Servlet容器解析Web客户的HTTP请求;

    (3)Servlet容器创建一个HttpServletRequest对象,在这个对象中封装了HTTP请求信息;

    (4)Servlet容器创建一个HttpServletResponse对象;

    (5)Servlet容器调用HttpServlet的service方法,把HttpServletRequest和HttpServletResponse对象作为service方法的参数传给HttpServlet对象;

    (6)HttpServlet调用HttpServletRequest的有关方法,获取HTTP请求信息

    (7)HttpServlet调用HttpServletResponse的有关方法,生成响应数据

    (8)Servlet容器把HttpServlet的响应结果传给Web客户

    七、创建HttpServlet的步骤

    创建用户自己的HttpServlet类,通常涉及下列4个步骤:

    (1)、扩展HttpServlet抽象类

    (2)、覆盖HttpServlet的部分方法,如覆盖doGet或doPost方法

    (3)、获取HTTP请求信息,例如通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串。无论是HTML表单数据还是URL上的查询字符串,在HttpServletRequest对象中都以参数名/参数值的形式存放。

    (4)、生成HTTP响应结果。通过HttpServletResponse对象可以生成响应结果。HttpServletResponse对象有一个getWriter()方法,该方法返回一个PrintWriter对象。使用PrinterWriter的print()或println()方法可以向客户端发送字符串数据流。

    八、Servlet的特性及适用场合

       虽然Servlet也可以用于生成动态网页,但这个功能已经逐渐让位给新锐JSP了,不过Servlet并没有因为江山代有才人而成为Java历史博物馆的古董,它依然身怀绝技笑傲江湖:

      ·自动启动

      一般情况下,JSP只有在客户端第一次调用后,方才进行编译并初始化,而Servlet则可以通过web.xml的<load-on-startup>配置,使其在Web容器启动时自动初始化。可使用Servlet这个特性完成Web应用程序的初始化工作:如下载字典表、控制表、初始化配置信息等,启动某个后台进程等。

      ·路径匹配映射

      Servlet可以通过web.xml 中<servlet-mapping>用通配符配置URI映射,对多个匹配的URI进行响应,而JSP只能通过一个具体的URI调用。这个特性可以使你在请求进入某个具体的页面前截获并处理它,许多Web应用框架,如Struts、Spring都利用了Servlet的这个特性,在此基础上创建构架。

      ·Servlet过滤器

      Servlet过滤器继承于javax.servlet.Servlet并实现javax.servlet.Filter的类,在请求到达服务程序前和响应发往客户端前进行加工处理。如果有大量的页面都需要进行相同的处理,则可以使用一个Servlet过滤器对此一并处理。如你可以用Servlet过滤器进行编码转换、或者为每个页面添加一个统一的标题头等。

      ·Servlet监听器

      J2EE定义了多个Web事件监听器接口,Servlet监听器(ServletContextListener)是继承javax.servlet.Servlet并实现这些事件监听接口的类。如果 Web应用服务器对某个Web容器的事件感兴趣,就可以构造一个实现该事件监听接口的Servlet,以便在该事件发生时做相应的处理。灵活使用 Servlet监听器,可以使一些原来很难实现的操作变得易如反掌。

      此外,如果一个动态网页的页面展现逻辑少,而业务处理逻辑多,如一个计算圆周率并返回结果页面的请求,这时使用Servlet比JSP更适合。所以需要创建一个动态网页,在到底使用Servlet还是JSP的问题上举棋不定时,请这记住下面这句经典的话:Servlet是包含HTML代码的Java程序,而JSP是包含Java代码的HTML网页。


    本文转载自http://blog.csdn.net/nht1980/archive/2009/03/09/3973196.aspx

  • 相关阅读:
    定时任务:crontab: installing new crontab
    报错:Sqoop Failing this attempt. Failing the application.
    数据库优化
    vscode ,保存失败提示:关于Failed to save 'package.json': The content of the file is newer. Please..解决办法
    php -1 month 的问题
    sql 中convert和cast区别
    [SQL case when的两种用法]
    Android编译Lame库(Mp3编解码库)
    AndroidStudio使用Cmake编译armeabi-v7a,arm64-v8a的so库
    图片压缩原理
  • 原文地址:https://www.cnblogs.com/king1302217/p/2006828.html
Copyright © 2020-2023  润新知