Servlet技术

Servlet简介
    Java Servlet是与平台无关的服务器端组件,它可以运行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用"请求/响应"的模式
    Servlet可以完成以下功能:
    l         创建并返回基于客户请求的动态HTML页面
    l         创建可嵌入到现有HTML页面中的部分HTML页面(HTML片段)
    l         与其他服务器资源(如数据库或基于Java的应用程序)进行通信
    l         接收多个客户机的输入,并将结果广播到多个客户机上,如Servlet可以实现支持多个参与者的游戏服务器
    l         根据客户请求采用特定的MIME(Multipurpose Internet Mail Extensions)类型对数据过滤,如进行图像格式转换

Servlet API
    Servlet的框架是由两个Java包组成的:javax.servletjavax.servlet.http,前者定义了所有的Servlet类都必须实现或扩展的通用接口和类,后者定义了采用HTTP协议通信的HttpServlet类
    Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口,其中定义了5个方法,3个代表Servlet的生命周期:
    l         init方法,负责初始化Servlet对象
    l         service方法,负责响应客户的请求
    l         destroy方法,当Servlet对象退出生命周期时,负责释放占用的资源
    用户开发自己的Servlet类时,必须扩展以下两个类中的一个:
    扩展GenericServlet类:如果扩展这个,必须实现service方法,service方法有两个参数,ServletRequestServletResponse。Servlet容器将客户的请求信息封装在ServletRequest对象中,传给service方法;service方法将响应客户的结果通过ServletResponse对象传给客户
    扩展HttpServlet类:这个不需要实现service方法,在此方法中,首先从HttpServletRequest对象中获取HTTP请求方式的信息,然后再根据请求方式调用相应的方法,如请求方式为GET,则调用doGet(),如为POST,调用doPost()。两个参数HttpServletRequestHttpServletResponse
    ServletRequest接口:封装了客户的请求信息,包括请求方式、参数名和参数值、客户端使用的协议,以及发出客户请求的远程主机信息等,方法如下:
         getAttribute         根据参数给定的属性名返回属性值
         getContentType       返回客户请求数据MIME类型
         getInputStream       返回以二进制方式直接读取客户请求数据的输入流
         getParameter         根据给定的参数名返回参数值
         getRemoteAddr        返回远程客户主机的IP地址
         getRemoteHost        返回远程客户主机名
         getRemotePort        返回远程客户主机的端口
         setAttribute         在ServletRequest中设置属性(包括属性名和属性值)
    ServletResponse接口:为Servlet提供了返回响应结果的方法,它允许Servlet设置返回数据的长度和MIME类型,方法如下:
         getOutputStream      返回可以向客户端发送二进制数据的输出流对象ServletOutputStream
         getWriter            返回可以向客户端发送字符数据的PrintWriter对象
         getCharacterEncoding 返回Servlet发送的响应数据的字符编码
         getContentType       返回Servlet发送的响应数据的MIME类型
         setCharacterEncoding 设置Servlet发送的响应数据的字符编码
         setContentType       设置Servlet发送的响应数据的MIME类型

Servlet的生命周期
    Servlet的生命周期开始于被装载到Servlet容器中,结束于被终止或重新装入时.分三个阶段:初始化阶段,响应客户请求阶段终止阶段.在javax.servlet.Servlet接口中定义了3个方法init(),service(),destroy(),它们将分别在Servlet的不同阶段被调用.
    初始化阶段:Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化,在Servlet整个生命周期中,init方法只会被调用一次,它有两种重载形式:
              public void init(ServletConfig config) throws ServletException;
              public void init() throws ServletException;
    在Servlet的初始化阶段,Servlet容器会为Servlet创建一个ServletConfig对象,用于存放Servlet的初始化配置信息,如Servlet的初始参数,如果使用第二种,那么要在init方法中访问ServletConfig对象,可以调用Servlet类的getServletConfig()方法
    响应客户请求阶段:对于到达Servlet容器的客户请求,Servlet容器创建特定于这个请求的ServletRequest对象和ServletResponse对象,然后调用Servlet的service方法.service方法从ServletRequest对象获得客户请求信息并处理该请求,通过ServletResponse对象向客户返回响应结果.
    终止阶段:当Web应用被终止,或Servlet容器终止运行,或Servlet容器重新装载Servlet的新实例时,Servlet容器会先调用Servlet的destroy方法,在此方法中,可以释放Servlet所占用的资源.

HTTP与HttpServlet
    Web服务器和浏览器是通过HTTP在Internet上发送和接收消息,HTTP是一种基于请求/响应模式的协议.在HTTP中,客户端/服务器之间的会话总是由客户端通过建立连接和发送HTTP请求的方式初始化,服务器不会主动联系客户端或要求与客户端建立连接.
    HTTP请求构成:请求方法URI协议/版本、请求头(Request Header)、请求正文
    HTTP响应构成:协议 状态代码 描述、响应头(Response Header)、响应正文(HTML页面)
    Servelet容器响应Web客户请求流程:
        Web客户向Servlet容器发出HTTP请求
        Servlet容器解析Web客户的HTTP请求
        Servlet容器创建一个HttpRequest对象,在这个对象中封装了HTTP请求信息
        Servlet容器创建一个HttpResponse对象
        Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet
        HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息
        HttpServlet调用HttpResponse的有关方法,生成响应数据
        Servlet容器把HttpServlet的响应结果传给Web客户

创建HttpServlet的步骤
    1.扩展HttpServlet抽象类
    2.覆盖HttpServlet的部分方法,比如覆盖doGet()或doPost()方法
    3.获取HTTP请求信息,如通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串,无论是HTML表单数据还是URL上的查询字符串,在HttpServletRequest对象中都以参数名/参数值的形式存放,通过以下方法检索参数信息:
        getParameterNames()       返回一个Enumeration对象,它包含了所有的参数名信息
        getParameter(String name) 返回参数名name对应的参数值
        getParameterValues()      返回一个Enumeration对象,它包含了所有的参数值信息
    4.生成HTTP响应结果,通过HttpServletResponse对象可以生成,getWriter()方法返回一个PrintWriter对象,使用PrintWriterprint()println()方法可以向客户端发送字符串数据流

  1. package mypack;
  2. import javax.servlet.*;
  3. import javax.servlet.http.*;
  4. import java.io.*;
  5.  
  6. public class HelloServlet extends HttpServlet //第一步:扩展 HttpServlet 抽象类
  7. {
  8.     //第二步:覆盖doGet()方法
  9.     public void doGet(HttpServletRequest request,
        HttpServletResponse response) throws IOException ,ServletException
  10.     {
  11.         //第三步:获取HTTP 请求中的参数信息
  12.         String clientName=request.getParameter("clientName");
  13.         if(clientName!=null) //解决汉化问题,做转码工作
  14.             clientName=new String(clientName.getBytes("ISO-8859-1"),"GB2312");
  15.         else
  16.             clientName="我的朋友";
  17.  
  18.         //第四步:生成 HTTP 响应结果
  19.         PrintWriter out;
  20.         String title="HelloServlet";
  21.         String heading1="This is output from HelloServlet by doGet:";
  22.         // set content type.
  23.         response.setContentType("text/html;charset=GB2312");
  24.         // write html page.
  25.         out = response.getWriter();
  26.         out.print("<HTML><HEAD><TITLE>"+title+"</TITLE>");
  27.         out.print("</HEAD><BODY>");
  28.         out.print(heading1);
  29.         out.println("<h1><P> "+clientName+" : 您好</h1>");
  30.         out.print("</BODY></HTML>");
  31.         //close out.
  32.         out.close();
  33.     }
  34. }

ServletContext和Web应用的关系
    Servlet容器在启动时会加载Web应用,并为每个Web应用创建唯一的ServletContext对象。可以把ServletContext看成是一个Web应用的服务器端组件的共享内存,在ServletContext中可以存放共享数据,它提供了4个读取或设置共享数据的方法:
        setAttribute(String name,Object object)把一个对象和一个属性名绑定,对象存储在ServletContext中
        getAttribute(String name)       根据给定的属性名返回所绑定的对象
        removeAttribute(String name)    根据给定的属性名从ServletContext中删除相应的属性
        getAttributeNames()             返回一个Enumeration,它包含了存储在ServletContext中的所有属性名

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值