补充 精通JSP开发应用 (Eclipse 平台) 第六章 基础技术:Servlet

6.1 Servlet简介:

                   Servlet 是用java 编写的运行在服务器端上的小程序。servlet 本身不能直接独立运行,只能运行于支持servlet的服务器上。servlet用于接收来自客户的请求,并将处理结

                   果以动态网页的形式返回到客户端浏览器。jsp文件的执行,首先必须由java虚拟机编译转换为servlet文件才能执行,可以说jsp是servlet技术的延伸和扩展。               

                   Servlet是使用Java Servlet应用程序设计接口(API)及相关类和方法的Java程序。除Java Servlet API,Servlet还可以使用以扩展和添加API的Java类软件包。Java语

                   言能够实现的功能,Servlet基本上都能实现(除了图形界面外)。Servlet主要用于处理客户端传来的HTTP请求,并返回一个响应。通常所说的Servlet就是指

                   HttpServlet,用于处理HTTP请求,能够处理的请求有:doGet、doPost、service等。在

                    开发Servlet时,可以直接继承javax.servlet.http.HttpServlet。

                    Servlet需要在web.xml中进行描述,在描述时,主要是执行Servlet的名字、Servlet类、初始参数、安全配置、URL映射、启动的优先权等。Servlet不仅可以生成HTML脚

                   本输出,也可以生成二进制表单进行输出。

6.2 Servlet与Jsp区别

                   1.编程方式不同

                                     servlet是服务器端的程序

                                     Jsp是servlet的延伸和扩展,jsp实现了页面表现和商业逻辑的分离,比较容易上手。

                   2.运行方式不同

                                     servlet必须在编译后才能运行,jsp必须转换为servlet,所以jsp的运行速度比servlet相对慢一些。

                   3.应用范围不同

                                      如果页面的显示逻辑比较多,就是Jsp而业务逻辑多些就用servlet

6.3 Servlet的生命周期

                    1)装入Servlet。这项操作一般是动态执行的。有些服务器提供了相应的管理功能,可以在启动的时候就装载Servlet并能够初始化特定的Servlet。

                  (2)创建一个Servlet实例。

                  (3)调用Servlet的init(ServletConfig config)方法。在处理任何服务请求之前响应,初始化Servlet。它有两种类型,一种不带任何参数;另一种带有ServletConfig参

                         数。该方法通常用于打开共享资源,在Servlet的生命周期中只被调用一次。

                  (4)服务。如果容器接收到对此Servlet的请求,那么将调用Servlet的service()方法。service()被拆分为doGet()、doPost()、doDelete()、doOptions()、doPut()以

                         doTrace()。对于HTTP的请求方法,每个HTTP的请求都会调用一次service(),这是运行应用程序逻辑的入口点,它接收两个参数:ServletRequest表示客户端请求

                         的信息,ServletResponse表示对客户端的响应。

                  (5)销毁。实例被销毁,通过调用Servlet的destroy()方法来销毁Servlet。在Servlet的生命周期中最多也只被调用一次。用于在Servlet停止服务之前关闭共享资源和清

                         除其他资源。

                       1@LCHPZIRTEM5L$W(RX(K3N

6.4 servlet相关的类与方法

                    开发servlet相关的程序包主要有两个,那javax.servlet和javax.servlet.http。servlet执行javax.servlet接口,可以通过直接执行javax.servlet接口开发servlet,但这

                    通常没有必要,因为大多数servlet是针对Http协议的web服务器,这样开发javax.servlet的办法是使用javax.servlet.http.httpservlet类。对于基于HTTP协议的web开

                    发,只需要使用jaavx.servlet.http包中的类开发即可。

                   当客户端请求servlet时,服务器端将接收两个类的对象,一个是servletRequest,描述客户端对服务器的请求,另一个是servletResponse,描述服务器端对客户端的响应。

                  1.doGet()

                             用来处理HTTP的Get请求。

                  2.doPost()

                             用来处理HTTP的POST请求。

                                                          doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException { }

                  3.init()

                             用来完成页面的一些初始化工作,如设置变量值和连接数据库等。

                                                        protected void init(ServletConfig config) throws ServletException;

                  4.service()

                             用来处理各个客户端的请求。该方法默认抛出ServletException和IOException异常。service()方法的格式为:

                                                      protected void service(HttpServletRequest Request,HttpServletResponse Response) throws ServletException,IOException;

                 5.destroy()

                             destory()继承自HttpServlet类。destroy()方法的格式为:

                                                      public void destroy()

                 6.doPut()

                            doPut()方法用来处理HTTP的PUT请求。

                                                     protected void doPut(HttpServletRequest Request,HttpServletReponse Response) throws ServletException,IOEception;

                 7.doDelete()

                           doDelete()方法用来处理http的DELTEE请求。

                                                      protected void doDelete(HttpServletRequest Request,HttpServletReponse Response) throws ServletException,IOEception;

                 8.doHead()

                        doHead()方法用来处理HTTP的READ请求。

                                                       protected void doHead(HttpServletRequest Request,HttpServletReponse Response) throws ServletException,IOEception;

              9.doOptions()

                        doOptions()方法用来处理HTTP的PUT请求。

                                                       protected void doOptions(HttpServletRequest Request,HttpServletReponse Response) throws ServletException,IOEception;

             10.doTrace()

                        doOptions()方法用来处理HTTP的PUT请求。

                                                       protected void doOptions(HttpServletRequest Request,HttpServletReponse Response) throws ServletException,IOEception;

                                                {U471P5CPLE[(%WJF9D$L[L

                javax.servlet.ServletConfig接口的主要方法:用来存Servlet启动配置值与初始化参数。Servlet接口的getServletConfig ()方法可用来得到关于servlet配置值的信息

                                    方 法 原 型                                                                   含 义

                                     public String getInitParameter(String arg0)                        根据初始化变量名称返回其字符串值

                                    public Enumeration getInitParameterNames()                      返回所有初始化变量的枚举Enumeration对象,可以用来查询

                                     public ServletContext getServletContext()                         返回ServletContext对象,Java的getXxx()方法大多返回原对象,而不是对象拷贝

                                     public String getServletName()                                        返回当前Servlet的名称,该名称在web.xml里指定

                 javax.servlet.http.HttpServletRequest接口的主要方法

                                    HttpServletRequest接口存放在javax.servlet.http包内,该接口的主要方法如表4所示。

                                   方 法 原 型                                                                    含 义

                                   public String getAuthType()                                             返回Servlet使用的安全机制名称

                                   public String getContextPath()                         返回请求URI的Context部分,实际是URI中指定Web程序的部分,例如

                                                                                                     URI“http://localhost:8080/mingrisoft/index.jsp”,这一方法返回的是“mingrisoft”

                                   public Cookie[] getCookies()                            返回客户发过来的Cookie对象

                                   public long getDateHeader(String arg0)              返回客户请求中的时间属性

                                   public String getHeader(String arg0)                  根据名称返回客户请求中对应的头信息

                                   public Enumeration getHeaderNames()               返回客户请求中所有的头信息名称

                                   public Enumeration getHeaders(String arg0)        返回客户请求中特定头信息的值

                                   public int getIntHeader(String arg0)                   以int格式根据名称返回客户请求中对应的头信息(header),如果不能转换成int格式,生成一个

                                                                                                     NumberFormatException异常

                                   public String getMethod()                                返回客户请求的方法名称,例如:GET、POST或PUT

                                   public String getPathInfo()                               返回客户请求URL的路径信息

                                   public String getPathTranslated()                      返回URL中在Servlet名称之后、检索字符串之前的路径信息

                                   public String getQueryString()                           返回URL中检索的字符串

                                   public String getRemoteUser()                           返回用户名称,主要应用在servlet安全机制中检查用户是否已经登录

                                   public String getRequestURI()                            返回客户请求使用的URI路径,是URI中的host名称和端口号之后的部分,例如URL为

                                                                                                     “http://localhost:8080/mingrisoft/index.jsp”,这一方法返回的是“/index.jsp”

                                   public StringBuffer getRequestURL()                   返回客户Web请求的URL路径

                                   public String getServletPath()                           返回URL中对应servlet名称的部分

                                   public HttpSession getSession()                        返回当前会话期间对象

                                   public Principal getUserPrincipal()                       返回java.security.Principal对象,包括当前登录用户名称

                                   public boolean isRequestedSessionIdFromCookie()                    当前session ID是否来自一个cookie

                                   public boolean isRequestedSessionIdFromURL()                        当前session ID是否来自URL的一部分

                                   public boolean isRequestedSessionIdValid()                             当前用户期间是否有效

                                   public boolean isUserInRole(String arg0)                                 已经登录的用户是否属于特定角色

                         补充:    《用jsp开发web应用 陈明》

                                     httpservletRequest的引用request的常用方法如下:

                                     1.request.getParameter(“param”);获取客户端请求数据,param为表单元素(如text、password、select)各称,返回string 类型值

                                     2.request.setCharaterEncoding(“GBK”);将输入内容转换成中文;

                                     3.request.setAttribute(“attribute”,value);在request作用域内存储数据。

           HttpServletResponse接口

                                 HttpServletResponse接口存放在javax.servlet.http包内,它代表了对客户端的HTTP响应。HttpServletResponse接口给出了相应客户端的Servlet()方法。它允许Serlvet设置

                                 内容长度和回应的MIME类型,并且提供输

                                出流ServletOutputStream。

                                                     方 法 原 型                                                                    含 义

                                 public void addCookie(Cookie arg0)                                      在响应中加入cookic对象

                                 public void addDateHeader(String arg0, long arg1)                  加入对应名称的日期头信息

                                 public void addHeader(String arg0, String arg1)                      加入对应名称的字符串头信息

                                 public void addIntHeader(String arg0, int arg1)                       加入对应名称的int属性

                                 public boolean containsHeader(String arg0)                            对应名称的头信息是否已经被设置

                                 public String encodeRedirectURL(String arg0)                         对特定的URL进行加密,在sendRedirect()方法中使用

                                 public String encodeURL(String arg0)                                    对特定的URL进行加密,如果浏览器不支持cookie,同时加入session ID

                                 public void sendError(int arg0) throws IOException                  使用特定的错误代码向客户传递出错响应

                                 public void sendError(int arg0, String arg1) throws IOException   使用特定的错误代码向客户传递出错响应,同时清空缓冲器

                                 public void sendRedirect(String arg0) throws IOException          传递临时相应,相应的地址根据location指定

                                 public void setHeader(String arg0, String arg1)                        设置指定名称的头信息

                                 public void setIntHeader(String arg0, int arg1)                         设置指定名称头信息,其值为int数据

                                 public void setStatus(int arg0)                                              设置响应的状态编码

        补充:    《用jsp开发web应用 陈明》

                                 1)response.setContentType(“text/html;charset=GBK”)              设置输出为中文,解决中文乱码问题

                                 2)response.sendRedirect(“URL”);                                           让浏览器重定向到指定资源。URL可为Servlet,jsp,html文件路径

                               

         GenericServlet

                                GenericServlet类存放在javax.servlet.包中,它提供了对Servlet接口的基本实现。GenericServlet类是一个抽象类,它的service()方法是一个抽象方法。该类的主要方法。

                                                      方 法 原 型                                                     含 义

                                public void destroy()                                                           Servlet容器使用这个方法结束Servlet服务

                                public String getInitParameter(String arg0)                              根据变量名称查找并返回初始变量值

                                public Enumeration getInitParameterNames()                            返回初始变量的枚举对象

                                public ServletConfig getServletConfig()                                   返回ServletConfig对象

                                public ServletContext getServletContext()                              返回ServletContext对象

                                public String getServletInfo()                                               返回关于Servlet的信息,如作者、版本、版权等

                                public String getServletName()                                             返回Servlet的名称

                                public void init() throws ServletException                                代替super.init(config)的方法

                                public void init(ServletConfig arg0) throws Servlet-Exception          Servlet容器使用这个指示Servlet已经被初始化为服务状态

                               public void log(String arg0, Throwable arg1)                             这个方法用来向Web容器的log目录输出运行记录,一般文件名称为Web程序的servlet名称

                               public void log(String arg0)                                                   这个方法用来向Web容器的log目录输出运行纪录和弹出的运行错误信息

                               public void service(ServletRequest arg0, ServletRe-sponse arg1)  由Servlet容器调用,使Servlet对请求进行响                                                                     

                               throws ServletException, IOException   

补充:    《用jsp开发web应用 陈明》

ServletContext接口   

                        定义一个servletContext对象,通过该对象,servlet引擎向servlet提供环境信息。整个web应用只有一个servletcontext对象,而且web应用中所有部分都能访问它,每个

                        servlet有一个servletConfig 对象

1)Object getAttribute(String name)

2)Enumeration getAttributeNames()

3)void setAttribute(String name, Object object)

4)void removeAttribute(String name)

5)String getRealPath(String path)

返回一个与虚拟路径相对应的真实路径。

6)RequestDispatcher getRequestDispatcher(String path)

  返回一个特定URL的RequestDispatcher对象,否则返回一个空值。

7) ServletContext getContext(String uripath)

6.6 Servlet的应用特性

                               Servlet依然具有JSP所不具备的功能和特性,主要体面在以下几个方面

                              1.自动启动。

                                           JSP只有在客户端调用后,才能进行编译和初始化,而Servlet可以通过web.xml文件的项进行配置,使其在web容器启动时自动初始化。

                              2.路径匹配影射

                                            Servlet可以通过web.xml文件中的项配置路径匹配影射,对于多个匹配URL进行响应,而jsp只能通过一个具体的URL调用。

                              3.Servlet过滤器

                                           servlet过滤器继承自jaavx.servlet.http并实现javax.servlet.filter类,在请求到达服务器前和响应发往客户端前进行处理。

                                          Servlet过滤是Servlet API的集成部件。Servlet过滤提供了一种称为过滤器的新对象类型,它可以转换请求或修改回应。可以将过滤器连接在一起,以便过滤器组可以对指定

                                          源或资源组的输入和输出执行操作。过滤器通常包括记录过滤器、图像转换过滤器、加密过滤器和多用途Internet邮件扩展(MIME)类型过滤器。

                                          过滤器的使用使开发者可以直接处理请求和响应过程。过滤可以在资源被获取前对其操作(或者在动态输出中被启动),也可在获取资源后,或被执行后立即启动。甚至在资源

                                          请求处理的同时也可以使用过滤器。

                                         过滤器是一个简单的类,它可以实现javax.servlet.Filter接口。

                                                     javax.servlet.Filter接口的实现方法

                                           javax.servlet.Filter接口必须实现以下3种方法。

                                           (1)doFilter(ServletRequest,ServletResponse,FilterChain)

                                               过滤器的主要方法,过滤器所需要完成的整个工作都基本上由该方法来完成。每当应用程序请求被处理时,编译器都将调用该方法。

                                           (2)init(FilterConfig)

                                             编译在doFilter()方法被调用前,负责设置FilterConfig对象。FilterConfig对象将为过滤器提供初始化参数,并允许访问与之相关的ServletContext。

                                            (3)destroy()

                                               当服务器不需要使用过滤器时,编译器将调用destroy()方法。任何可以实现该接口功能的类都可以被看成是过滤器,也可以被归为Web应用程序组件。

                                                   FilterConfig()接口

                                                      FilterConfig()用来建立过滤器的初始化参数、文本名称或应用程序运行下的ServletContext。

                                           FilterConfig()接口声明了4种方法。

                                           (1)getFilterName():获取过滤器的文本名称。

                                           (2)getInitParameter(String paramName):获取指定初始化参数的字符串值。

                                           (3)getInitParameterNames():获取由初始化参数名称组成的java.util.Enumeration。

                                           (4)getServletContext():获取运行该过滤器的ServletContext。

                                                   过滤器的配置

                                              配置Filter有两个任务,首先声明Filter,然后是使用Filter。在声明Filter时,需要指定Filter的名字、Filter的实现类,如果有参数,那么要配置它的参数。在使用Filter

                                              时,主要是做一些URL的映射,只有和Filter映射匹配时请求才会被处理。

                                4. Servlet监听器

                                              监听器的作用是监听Web容器的有效期事件,因此它是由容器管理的。利用Listener接口监听在Container中的某个执行程序,并且根据其应用程序的需求做出适当的响

                                              应。下面列出了Servlet 2.4和JSP 2.0中的8个Listener接口和6个Event类。

                                                                   Listener接口与Event类

                                               Listener                                              Event

                                            ServletContextListener                           ServletContextEvent

                                            ServletContextAttributeListener               ServletContextAttributeEvent

                                            HttpSessionListener                               HttpSessionEvent

                                            HttpSessionActivationListener                  HttpSessionEvent

                                            HttpSessionAttributeListener                    HttpSessionBindingEvent 

                                            HttpSessionBindingListener                       HttpSessionBindingEvent 

                                            ServletRequestListener                            ServletRequestEvent

                                            ServletRequestAttributeListener                 ServletRequestAttributeEvent

                                           Servlet上下文监听

                                            要实现对Servlet上下文监听(ServletContext)需要实现2个接口,下面分别介绍。

                                            ServletContextListener接口

                                                 ServletContextListener接口实现监听ServletContext的创建和删除。ServletContextListener接口提供了2个方法,它们也被称为“Web应用程序的生命周期方

                                                 法”。下面分别进行介绍。

                                                 ContextInitialized(ServletContextEvent event)方法:通知正在收听的对象,应用程序已经被加载及初始化。

                                                 ContextDestroyed(ServletContextEvent event)方法:通知正在收听的对象,应用程序已经被载出。

                                            ServletAttributeListener接口

                                                  ServletAttributeListener接口实现监听ServletContext属性的增加、删除、修改。ServletAttributeListener接口提供了以下3个方法。

                                                  AttributeAdded(ServletContextAttributeEvent event)方法:若有对象加入Application的范围时,通知正在收听的对象。

                                                  AttributeReplaced(ServletContextAttributeEvent event)方法:若在Application的范围有对象取代另一个对象时,通知正在收听的对象。

                                                  AttributeRemoved(ServletContextAttributeEvent event)方法:若有对象从Application的范围移除时,通知正在收听的对象。

                                         HTTP会话监听

                                           HTTP会话监听(HttpSession)信息,有4个接口可以进行监听。

                                           HttpSessionListener接口

                                           HttpSessionListener接口实现监听Http会话创建、销毁。HttpSessionListener接口提供了以下两个方法。

                                           SessionCreated(HttpSessionEvent event)方法:通知正在收听的对象,Session已经被加载及初始化。

                                           SessionDestroyed(HttpSessionEvent event)方法:通知正在收听的对象,Session已经被载出(HttpSessionEvent类的主要方法:getSession()。可以使用该方法

                                                                  回传一个Session对象)。

                                           HttpSessionActivationListener接口

                                           HttpSessionActivationListener接口实现监听Http会话active、passivate情况。HttpSessionActivationListener接口提供以下3个方法。

                                           AttributeAdded(HttpSessionBindingEvent event)方法:若有对象加入Session的范围时,通知正在收听的对象。

                                           AttributeReplaced(HttpSessionBindingEvent event)方法:若在Session的范围有对象取代另一个对象时,通知正在收听的对象。

                                          AttributeRemoved(HttpSessionBindingEvent event)方法:若有对象从Session的范围移除时,通知正在收听的对象(HttpSessionBindingEvent类主要有3个方法:

                                                                  getName()、getSession()和getValues())。

                                           HttpBindingListener接口

                                           HttpBindingListener接口实现监听Http会话中对象的绑定信息。它是惟一不需要在web.xml中设定的Listener。HttpBindingListener接口提供以下两个方法。

                                                                 ValueBound(HttpSessionBindingEvent event)方法:当有对象加入Session的范围时会被自动调用。

                                                                 ValueUnBound(HttpSessionBindingEvent event)方法:当有对象从Session的范围内移除时会被自动调用。

                                           HttpSessionAttributeListener接口

                                                                HttpSessionAttributeListener接口实现监听Http会话中属性的设置请求。HttpSession-AttributeListener接口提供以下两个方法。

                                                                SessinDidActivate(HttpSessionEvent event)方法:通知正在收听的对象,它的Session已经变为有效状态。

                                                                SessinWillPassivate(HttpSessionEvent event)方法:通知正在收听的对象,它的Session已经变为无效状态。

                                        Servlet请求监听

                                          在Servlet 2.4规范中,新增加了一个技术,就是可以监听客户端的请求。一旦能够在监听程序中获取客户端的请求,就可以对请求进行统一处理。要实现客户端的请求和请求

                                          参数设置的监听需要实现以下2个接口。

                                         1. ServletRequestListener接口

                                            ServletRequestListener接口提供了以下两个方法。

                                            RequestInitalized(ServletRequestEvent event)方法:通知正在收听的对象,ServletRequest已经被加载及初始化。

                                            RequestDestroyed(ServletRequestEvent event)方法:通知正在收听的对象,ServletRequest已经被载出。

                                         2.ServletRequestAttributeListener接口

                                            ServletRequestAttributeListener接口提供了以下3个方法。

                                            AttributeAdded(ServletRequestAttributeEvent event)方法:若有对象加入Request的范围时,通知正在收听的对象。

                                            AttributeReplaced(ServletRequestAttributeEvent event)方法:若在Request的范围内有对象取代另一个对象时,通知正在收听的对象。

                                            AttributeRemoved(ServletRequestAttributeEvent event)方法:若有对象从Request的范围移除时,通知正在收听的对象。

  6.7 Servlet应用实例

              Servlet与表单交互的方法

     1.静态HTML文本

<html>
  <head>
  <title>Input Information</title>
 </head>
<body>
<h3>请输入信息</h3>
<form name="ourform" method="GET" action="FormDemo">
姓名:<input type=text name="Name"><br>
性别:<select name="Sex">
   <option value="1" selected>男</option>
   <option value="2">女</option>
</select><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<input type="submit" name="Submit" value="提交">&nbsp;&nbsp;
<input type="reset" name="Submit2" value="重置">
</form>
  </body>
  </html>

                          6.7.1 Servlet获取客户端信息

// FormDeal.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class FormDeal extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException //处理GET请求的方法
{
response.setContentType("text/html");
//先设置Header,在这里只设置ContentType一项
PrintWriter out = response.getWriter();
//得到文本输出Writer
String name = request.getParameter("Name");
//得到表单值Name
String sex = request.getParameter("Sex");
//得到表单值Sex
name = new String(name.getBytes(),"ISO-8859-1");
//转换到正确的编码
//打印得到的表单值
out.println("<html>");
out.println("<head>");
out.println("<meta http-equiv="Content-Type" content="text/html; charset=gb2312">");
out.println("<title>Your Infomation</title>");
out.println("</head>");
out.println("<body>");
out.println("<h3>Data You Posted</h3>");
out.println("<table>");
out.println("<tr>");
out.println(new String(new String("<td>你的姓名:</td>").getBytes(),"ISO-8859-1"));
out.println("<td>"+name+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println(new String(new String("<td>你的性别:</td>").getBytes(),"ISO-8859-1"));
out.print("<td>");
if(sex.equals("1")) out.println(new String(new String("男</td>").getBytes(),"ISO-8859-1"));
else out.println(new String(new String("女</td>").getBytes(),"ISO-8859-1"));
out.println("</tr>");
out.println("</table>");
out.println("</body>");
out.println("</html>");
out.close(); //关闭Writer
}
}
原文地址:https://www.cnblogs.com/elite-2012/p/3155937.html