Servlet总结

Servlet总结

1,什么是Servlet
2,Servlet有什么作用
3,Servlet的生命周期
4,Servlet怎么处理一个请求
5,Servlet与JSP有什么区别
6,Servlet里的cookie技术
7,Servlet里的过滤器
8,Servlet里的监听器


一,什么是Servlet?

Servlet是一个Java编写的程序,此程序是基于Http协议的,在服务器端运行的(如tomcat),

是按照Servlet规范编写的一个Java类。


二,Servlet有什么作用?

主要是处理客户端的请求并将其结果发送到客户端。


三,Servlet的生命周期?

Servlet的生命周期是由Servlet的容器来控制的,它可以分为3个阶段;初始化,运行,销毁。
初始化阶段:

1,Servlet容器加载servlet类,把servlet类的.class文件中的数据读到内存中。

2,然后Servlet容器创建一个ServletConfig对象。ServletConfig对象包含了Servlet的初始化配置信息。

3,Servlet容器创建一个servlet对象。

4,Servlet容器调用servlet对象的init方法进行初始化。

运行阶段:

当servlet容器接收到一个请求时,servlet容器会针对这个请求创建servletRequest和servletResponse对象。

然后调用service方法。并把这两个参数传递给service方法。Service方法通过servletRequest对象获得请求的

信息。并处理该请求。再通过servletResponse对象生成这个请求的响应结果。然后销毁servletRequest和

servletResponse对象。我们不管这个请求是post提交的还是get提交的,最终这个请求都会由service方法来处理。

销毁阶段:

当Web应用被终止时,servlet容器会先调用servlet对象的destrory方法,然后再销毁servlet对象,

同时也会销毁与servlet对象相关联的servletConfig对象。我们可以在destroy方法的实现中,释放

servlet所占用的资源,如关闭数据库连接,关闭文件输入输出流等。

在这里该注意的地方:

在servlet生命周期中,servlet的初始化和和销毁阶段只会发生一次,而service方法执行的次数则取决于servlet被客户

端访问的次数


四,Servlet怎么处理一个请求?

当用户发送一个请求到某个Servlet的时候,Servlet容器会创建一个ServletRequst和ServletResponse对象。

在ServletRequst对象中封装了用户的请求信息,然后Servlet容器把ServletRequst和ServletResponse对象

传给用户所请求的Servlet,Servlet把处理好的结果写在ServletResponse中,然后Servlet容器把响应结果传给用户。


五,Servlet与JSP有什么区别?

1,jsp经编译后就是servlet,也可以说jsp等于servlet。

2,jsp更擅长页面(表现)。servlet更擅长逻辑编辑。 (最核心的区别)。

3,在实际应用中采用Servlet来控制业务流程,而采用JSP来生成动态网页.在struts框架中,

JSP位于MVC设计模式的视图层,而Servlet位于控制层。

 

六,Servlet里的cookie技术?

cookies是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段,是由Netscape公司开发出来的。

cookie技术的好处:

    1,Cookie有效期限未到时,Cookie能使用户在不键入密码和用户名的情况下进入曾经浏览过的一些站点。

    2,Cookie能使站点跟踪特定访问者的访问次数、最后访问时间和访问者进入站点的路径。
创建一个cookie

[java]  view plain copy print ?
  1. //里面的两个参数分别是cookie的名和cookie的值  
  2. response.addCookie(new Cookie("abc","10000000"));  

使用cookie

[java]  view plain copy print ?
  1. Cookie[] cook =request.getCookies();//用一个Cookie数组来接收  
  2. for(int j=0;j<cook.length;j++){//通过循环来打印Cookie  
  3.         cook[j].getName()://取cookie的名    
  4.         cook[j].getValue()://去cookie的值  
  5. }  

七,Servlet里的过滤器?

过滤器的主要作用

1,任何系统或网站都要判断用户是否登录。

2,网络聊天系统或论坛,功能是过滤非法文字

3,统一解决编码

(2)怎么创建一个过滤器:

1,生成一个普通的class类,实现Filter接口(javax.servlet.Filter;)。

2,重写接口里面的三个方法:init,doFilter,destroy。

3,然后在web.xml配置过滤器。


八,Servlet里的监听器?

* 监听器的作用:自动执行一些操作。
* 三种servlet监听器:对request的监听。对session的监听。对application的监听。

* 怎么创建一个session监听器:

1,生成一个普通的class类,如果是对session的监听,则实现HttpSessionListener。

2,然后重写里面的五个方法:

[java]  view plain copy print ?
  1. public void sessionCreated(HttpSessionEvent arg0) {} // 创建  
  2. public void sessionDestroyed(HttpSessionEvent arg0) {} // 销毁  
  3. public void attributeAdded(HttpSessionEvent arg0) {} // 增加  
  4. public void attributeRemoved(HttpSessionEvent arg0) {} // 删除  
  5. public void attributeReplaced(HttpSessionEvent arg0) {} // 替换  


Java Servlet 与 Applet 的比较:

相似之处:

* 它们不是独立的应用程序,没有main()方法。

* 它们不是由用户或程序员调用,而是由另外一个应用程序(容器)调用。

* 它们都有一个生存周期,包含init()和destroy()方法。

不同之处:

* Applet具有很好的图形界面(AWT),与浏览器一起,在客户端运行。

* Servlet 则没有图形界面,运行在服务器端。

Java Servlet 与 CGI(Common Gateway Interface) 的比较:

与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资。

* 高效

在传统的CGI中,每个请求都要启动一个新的进程,如果CGI程序本身的执行时间较短,启动进程所需要的开销很可能反而超过实际执行时间;

而在Servlet中,每个请求由一个轻量级的Java线程处理(而不是重量级的操作系统进程)。

在传统CGI中,如果有N个并发的对同一CGI程序的请求,则该CGI程序的代码在内存中重复装载了N次;

而对于Servlet,处理请求的是N个线程,只需要一份Servlet类代码。在性能优化方面,Servlet也比CGI有着更多的选择。

* 方便

Servlet提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。

* 功能强大

在Servlet中,许多使用传统CGI程序很难完成的任务都可以轻松地完成。例如,Servlet能够直接和Web服务器交互,而普通的CGI程序不能。

Servlet还能够在各个程序之间共享数据,使得数据库连接池之类的功能很容易实现。

* 可移植性好

* 节省投资

Java Servlet 与 JSP(JavaServer Pages) 的比较:

JavaServer Pages(JSP)是一种实现普通静态HTML和动态HTML混合编码的技术,JSP并没有增加任何本质上不能用Servlet实现的功能。

但是,在JSP中编写静态HTML更加方便,不必再用println语句来输出每一行HTML代码。更重要的是,借助内容和外观的分离,页面制作中不同性质的任务可以方便地分开:比如,由页面设计者进行HTML设计,同时留出供Servlet程序员插入动态内容的空间。

Java Servlet API 2.2 简介

Java Servlet API 2.2 的类和接口组成两个Java 包,即:javax.servlet 和 javax.servlet.http(还包括javax.servlet.jsp包,不在本篇文章讨论范围之内)。

javax.servlet 包提供了控制 Servlet 生命周期所必需的 Servlet 接口,是编写 Servlet 时必须要实现的。

javax.servlet.http 包提供了从Servlet 接口派生出的专门用于处理 HTTP 请求的抽象类和一般的工具类。所有的Servlet 对象都要实现Servlet 接口,大多数情况下是作为已经实现了Servlet 接口的javax.servlet.GenericServlet 和 javax.servlet.http.HttpServlet 这两个抽象类的子类来间接实现Servlet 接口。

javax.servlet 包定义的类和接口:

interface RequestDispatcher
//定义一种对象,用于从客户接受请求,并将请求发送到服务器上任何指定的资源,如一个Servlet 、JSP 或 HTML 文件。
interface Servlet
//定义了所有 Servlet 必须实现的方法。
interface ServletConfig
//定义Servlet config 对象,由Servlet 引擎用在 Servlet 初始化时,向 Servlet 传递信息。
interface ServletContext
//定义了一系列方法,以便Servlet与其运行的环境通信。
interface ServletRequest
//定义了用于向Servlet传递客户请求信息的对象。
interface ServletResponse
//定义了一个对象,由Servlet用于向客户发送响应。
interface SingleThreadModel
//用于保证Servlet在任一时刻,只处理一个请求。
class GenericServlet
//继承Servlet接口,定义了一个通用的,与协议无关的Servlet。
class ServletInputStream
//定义了一个输入流,用于由Servlet从中读取客户请求的二进制数据。
class ServletOutputStream
//定义了一个输出流,用于由Servlet向客户发送二进制数据。
class ServletException
//定义了一个当Servlet遇到问题时可以抛出的异常。
class UnavailableException
//定义了一种异常,用于由Servlet指明它永远或暂时不可用。

javax.servlet.http 包定义的类和接口:

interface HttpServletRequest
//继承了ServletRequest 接口,为HTTPServlet 提供请求信息。
interface HttpServletResponse
//继承了ServletResponse 接口,为HTTPServlet 输出响应信息提供支持。
interface HttpSession
//为维护 HTTP 用户的会话状态提供支持。
interface HttpSessionBindingListener
//使得某对象在加入一个会话或从会话中删除时能够得到通知。
interface HttpSessionContext
//由Servlet 2.1 定义,该对象在新版本已不被支持。
class Cookie
//用在Servlet 中使用Cookie 技术
class HttpServlet
//定义了一个抽象类,继承 GenericServlet 抽象类,应被 HTTPServlet 继承。
class HttpSessionBindingEvent
//定义了一种对象,当某一个实现了HttpSessionBindingListener接口的对象被加入会话或从会//话中删除时,会收到该类对象的一个句柄
class HttpUtils
//提供了一系列便于编写HTTPServlet 的方法。

下面主要介绍javax.servlet.http提供的HTTP Servlet应用编程接口。

HTTP Servlet 使用一个 HTML 表格来发送和接收数据。要创建一个 HTTP Servlet,请扩展 HttpServlet 类, 该类是用专门的方法来处理 

HTML 表格的 GenericServlet 的一个子类。当提交信息时,它们还指定服务器应执行哪一个Servlet(或其它的程序)。 HttpServlet 类包含 

init()、destroy()、service() 等方法。其中 init() 和 destroy() 方法是继承的。

(1) init() 方法

在 Servlet 的生命期中,仅执行一次 init() 方法。它是在服务器装入 Servlet 时执行的。 可以配置服务器,以在启动服务器或客户机首次

访问 Servlet 时装入 Servlet。 无论有多少客户机访问 Servlet,都不会重复执行 init() 。

缺省的 init() 方法通常是符合要求的,但也可以用定制 init() 方法来覆盖它,典型的是管理服务器端资源。 例如,可能编写一个定制 init() 

来只用于一次装入 GIF 图像,改进 Servlet 返回 GIF 图像和含有多个客户机请求的性能。另一个示例是初始化数据库连接。缺省的 init() 方法

设置了 Servlet 的初始化参数,并用它的 ServletConfig 对象参数来启动配置, 因此所有覆盖 init() 方法的 Servlet 应调用 super.init() 

以确保仍然执行这些任务。在调用 service() 方法之前,应确保已完成了 init() 方法。

(2) service() 方法

service() 方法是 Servlet 的核心。每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,而且传递给这个方法一个

"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象作为参数。 在 HttpServlet 中已存在 service() 方法。缺省的服务功能是

调用与 HTTP 请求的方法相应的 do 功能。例如, 如果 HTTP 请求方法为 GET,则缺省情况下就调用 doGet() 。Servlet 应该为 Servlet 支持的 

HTTP 方法覆盖 do 功能。因为 HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service() 方法。

只需覆盖相应的 do 方法就可以了。

当一个客户通过HTML 表单发出一个HTTP POST请求时,doPost()方法被调用。与POST请求相关的参数作为一个单独的HTTP 请求从浏览器发送到服务器。

当需要修改服务器端的数据时,应该使用doPost()方法。

当一个客户通过HTML 表单发出一个HTTP GET请求或直接请求一个URL时,doGet()方法被调用。

与GET请求相关的参数添加到URL的后面,并与这个请求一起发送。当不会修改服务器端的数据时,应该使用doGet()方法。

Servlet的响应可以是下列几种类型:

一个输出流,浏览器根据它的内容类型(如text/HTML)进行解释。

一个HTTP错误响应, 重定向到另一个URL、servlet、JSP。

(3) destroy() 方法

destroy() 方法仅执行一次,即在服务器停止且卸装Servlet 时执行该方法。典型的,将 Servlet 作为服务器进程的一部分来关闭。

缺省的 destroy() 方法通常是符合要求的,但也可以覆盖它,典型的是管理服务器端资源。

例如,如果 Servlet 在运行时会累计统计数据,则可以编写一个 destroy() 方法,该方法用于在未装入 Servlet 时将统计数字保存在文件中。

另一个示例是关闭数据库连接。

当服务器卸装 Servlet 时,将在所有 service() 方法调用完成后,或在指定的时间间隔过后调用 destroy() 方法。

一个Servlet 在运行service() 方法时可能会产生其它的线程,因此请确认在调用 destroy() 方法时,这些线程已终止或完成。

(4) GetServletConfig()方法

GetServletConfig()方法返回一个 ServletConfig 对象,该对象用来返回初始化参数和ServletContext。ServletContext 接口提供有关servlet 的环境信息。

(5) GetServletInfo()方法

GetServletInfo()方法是一个可选的方法,它提供有关servlet 的信息,如作者、版本、版权。

当服务器调用sevlet 的Service()、doGet()和doPost()这三个方法时,均需要 "请求"和"响应"对象作为参数。

javax.servlet 软件包中的相关类为ServletResponse和ServletRequest,

javax.servlet.http 软件包中的相关类为HttpServletRequest 和 HttpServletResponse。


开发Servlet的过程 

  1.编写Servlet代码
 

  Java Servlet API是一个标准的Java扩展程序包,包含两个Package∶javax.servlet和javax.servlet.http。

对于想开发基于客户自定义协议的开发者,应该使用javax.servlet包中的类与界面;

对于仅利用HTTP协议与客户端进行交互的开发者,则只需要使用javax.servlet.http包中的类与界面进行开发即可。 

  下面是一个servlet的程序代码(RequestInfoExample.java)∶ 

import java.io.*;
import java.servlet.*;
import javax.servlet.*;
public class RequestInfoExample extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException {
   response.setContentType("text/html");
   PrintWriter out = response.getWriter();
   out.println("<html>");
   out.println("<body>");
   out.println("<head>");
   out.println("<title>Request Information Example</title>");
   out.println("</head>");
   out.println("<body>");
   out.println("<h3>Request Information Example</h3>");
   out.println("Method: " + request.getMethod());
   out.println("Request URI: " + request.getRequestURI());
   out.println("Protocol: " + request.getProtocol());
   out.println("PathInfo: " + request.getPathInfo());
   out.println("Remote Address: " + request.getRemoteAddr());
   out.println("</body>");
   out.println("</html>");
  }
  public void doPost(HttpServletRequest request, HttpServletResponse res)
    throws IOException, ServletException {
   doGet(request, response);
  }
}

该servlet实现如下功能∶当用户通过浏览器访问该servlet时,该servlet向客户端浏览器返回一个HTML页面∶ 

Request Information Example

Method: GET 
Request URI: /examples/servlet/RequestInfoExample 
Protocol: HTTP/1.1 
Path Info: null 
Remote Address: 127.0.0.1 

  有关servlet程序说明∶ 
  * 基于HTTP协议的servlet必须引入javax.servlet和javax.servlet.http包; 

  * HelloServlet 从类HttpServlet派生,HttpServlet是GenericServlet的一个派生类,通过 GenericServlet实现了Servlet界面。

  * HttpServletRequest 获取请求信息(例如IP地址、浏览器类型等)以及HTTP请求类型(例如GET、HEAD、POST、PUT等);

HttpServletResponse 通过调用HttpServletResponse.getOutputStream()客户取得向客户端进行输出的输出流,向客户端发送HTML页面。

  * 编写了doGet方法,对于HTML POST 请求,调用Servlet 的doPost()方法。 

 
HttpServlet 是从GenericServlet 继承而来,它支持HTTP 的post 和 get 等方法。

  编程思路:下面的例子,运行结果是输出简单地返回客户发送给服务器的请求行和头部信息,以及一些可访问的HTTP 信息等。

  SnoopServlet.java 的源代码如下:
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.*;
import javax.servlet.http.*;

public class SnoopServlet extends HttpServlet {

  public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException
  {
   PrintWriter out = response.getWriter();
   response.setContentType("text/plain");

   out.println("Snoop Servlet");
   out.println();
   out.println("Servlet init parameters:");
   Enumeration e = getInitParameterNames();
   while (e.hasMoreElements()) {
    String key = (String)e.nextElement();
    String value = getInitParameter(key);
    out.println(" " + key + " = " + value); 
   }
   out.println();

   out.println("Context init parameters:");
   ServletContext context = getServletContext();
   Enumeration enum = context.getInitParameterNames();
   while (enum.hasMoreElements()) {
    String key = (String)enum.nextElement();
    Object value = context.getInitParameter(key);
    out.println(" " + key + " = " + value);
   }
   out.println();

   out.println("Context attributes:");
   enum = context.getAttributeNames();
   while (enum.hasMoreElements()) {
    String key = (String)enum.nextElement();
    Object value = context.getAttribute(key);
    out.println(" " + key + " = " + value);
   }
   out.println();

   out.println("Request attributes:");
   e = request.getAttributeNames();
   while (e.hasMoreElements()) {
    String key = (String)e.nextElement();
    Object value = request.getAttribute(key);
    out.println(" " + key + " = " + value);
   }
   out.println();
   out.println("Servlet Name: " + getServletName());
   out.println("Protocol: " + request.getProtocol());
   out.println("Scheme: " + request.getScheme());
   out.println("Server Name: " + request.getServerName());
   out.println("Server Port: " + request.getServerPort());
   out.println("Server Info: " + context.getServerInfo());
   out.println("Remote Addr: " + request.getRemoteAddr());
   out.println("Remote Host: " + request.getRemoteHost());
   out.println("Character Encoding: " + request.getCharacterEncoding());
   out.println("Content Length: " + request.getContentLength());
   out.println("Content Type: "+ request.getContentType());
   out.println("Locale: "+ request.getLocale());
   out.println("Default Response Buffer: "+ response.getBufferSize());
   out.println();
   out.println("Parameter names in this request:");
   e = request.getParameterNames();
   while (e.hasMoreElements()) {
    String key = (String)e.nextElement();
    String[] values = request.getParameterValues(key);
    out.print(" " + key + " = ");
    for(int i = 0; i < values.length; i++) {
      out.print(values[i] + " ");
    }
    out.println();
   } 
   out.println();
   out.println("Headers in this request:");
   e = request.getHeaderNames();
   while (e.hasMoreElements()) {
     String key = (String)e.nextElement();
     String value = request.getHeader(key);
     out.println(" " + key + ": " + value);
   }
   out.println(); 
   out.println("Cookies in this request:");
   Cookie[] cookies = request.getCookies();
   if (cookies != null) {
    for (int i = 0; i < cookies.length; i++) {
     Cookie cookie = cookies[i];
     out.println(" " + cookie.getName() + " = "+ cookie.getValue());
    }
   }
   out.println();
   out.println("Request Is Secure: " + request.isSecure());
   out.println("Auth Type: " + request.getAuthType());
   out.println("HTTP Method: " + request.getMethod());
   out.println("Remote User: " + request.getRemoteUser());
   out.println("Request URI: " + request.getRequestURI());
   out.println("Context Path: " + request.getContextPath());
   out.println("Servlet Path: " + request.getServletPath());
   out.println("Path Info: " + request.getPathInfo());
   out.println("Path Trans: " + request.getPathTranslated());
   out.println("Query String: " + request.getQueryString());
   out.println();
   HttpSession session = request.getSession();
   out.println("Requested Session Id: " +
   request.getRequestedSessionId());
   out.println("Current Session Id: " + session.getId());
   out.println("Session Created Time: " + session.getCreationTime());
   out.println("Session Last Accessed Time: " +session.getLastAccessedTime());
   out.println("Session Max Inactive Interval Seconds: " + session.getMaxInactiveInterval());
   out.println();
   out.println("Session values: ");
   Enumeration names = session.getAttributeNames();
   while (names.hasMoreElements()) {
    String name = (String) names.nextElement();
    out.println(" " + name + " = " + session.getAttribute(name));
   }
  }
}

  编程技巧说明:

  程序输出Init Parameters(初始化参数)、Attribute names in this request、Parameter names in this request、Headers in this request、Cookies in this request 和 Session Information等信息。

方法getRequestURI 返回的对象URI 是作为URL 的一部分,是去掉URL 中用于指定机器的那部分;
方法getPathInfo 返回的字符串是客户向Servlet 传送的各种选项,这些选项是跟在Servlet 的URL 之后的;
方法getPathTranslated 返回的字符串是Servlet 的自己的绝对路径名。

  在浏览器中输入地址:http://localhost:8080/examples/servlet/SnoopServlet,会输出结果。
 Cookie 是一小块可以嵌入HTTP 请求和响应中的数据,它在服务器上产生,并作为响应头域的一部分返回用户。浏览器收到包含Cookie 的响应后,会把Cookie 的内容用“关键字/值” 对的形式写入到一个客户端专为存放Cookie 的文本文件中。浏览器会把Cookie 及随后产生的请求发给相同的服务器,服务器可以再次读取Cookie 中存Cookie 可以进行有效期设置,过期的Cookie 不会发送给服务器。

  Servlet API 提供了一个Cookie 类,封装了对Cookie 的一些操作。Servlet 可以创建一个新的Cookie,设置它的关键字、值及有效期等属性,然后把Cookie 设置在HttpServletResponse 对象中发回浏览器,还可以从HttpServletRequest 对象中获取Cookie。

  编程思路:Cookie 在实际的Servlet 编程中是很广泛应用,下面是一个从Servlet 中获取Cookie 信息的例子。

  ShowCookies.java 的源代码如下:
import javax.servlet.*;
import javax.servlet.http.*;

/**
* <p>This is a simple servlet that displays all of the
* Cookies present in the request
*/
public class ShowCookies extends HttpServlet
{
 public void doGet(HttpServletRequest req, HttpServletResponse resp)
 throws ServletException, java.io.IOException
 {
  // Set the content type of the response
  resp.setContentType("text/html;charset=gb2312");

  // Get the PrintWriter to write the response
  java.io.PrintWriter out = resp.getWriter();

  // Get an array containing all of the cookies
  Cookie cookies[] = req.getCookies();


  // Write the page header
  out.println("<html>");
  out.println("<head>");
  out.println("<title>Servlet Cookie Information</title>");
  out.println("</head>");
  out.println("<body>");


  if ((cookies == null) || (cookies.length == 0)) {
   out.println("没有 cookies ");
  }
  else {
   out.println("<center><h1>响应消息中的Cookies 信息 </h1>");
   // Display a table with all of the info
   out.println("<table border>");
   out.println("<tr><th>Name</th><th>Value</th>" + "<th>Comment</th><th>Max Age</th></tr>");
   for (int i = 0; i < cookies.length; i++) {
    Cookie c = cookies[i];
    out.println("<tr><td>" + c.getName() + "</td><td>" +
    c.getValue() + "</td><td>" + c.getComment() + "</td><td>" + c.getMaxAge() + "</td></tr>");
  }
  out.println("</table></center>");
 }
 // Wrap up
 out.println("</body>");
 out.println("</html>");
 out.flush();
}

/**
* <p>Initialize the servlet. This is called once when the
* servlet is loaded. It is guaranteed to complete before any
* requests are made to the servlet
* @param cfg Servlet configuration information
*/
public void init(ServletConfig cfg)
throws ServletException
{
 super.init(cfg);
}

/**
* <p>Destroy the servlet. This is called once when the servlet
* is unloaded.
*/
public void destroy()
{
 super.destroy();
}
}
  注意:Cookie 进行服务器端与客户端的双向交流,所以它涉及到安全性问题。
 使用Java Servlet API 进行会话管理

  javax.servlet.http.HttpSession 接口封装了HTTP 会话的细节,该会话与一段时间内特定的Web 客户对Web 服务器的多个请求相关。管理会话数据主要涉及到3个方面:会话交换、会话重定位和会话持久性,只有实现了java.io.Serializable 接口的数据对象才能够被交换、重定位和保持。这个接口主要是让对象具有序列化的能力,它可以将对象的状态信息写入任意的输出流中如:文件、网络连接等。

  编程思路:下面是实现一个简单在商场购物的例子,当用户选购商品(糖果、收音机和练习簿)放入购物袋中,保存选购的商品信息。

  ShowBuy.java 的源代码如下:
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class ShowBuy extends HttpServlet
{
 public void doGet(HttpServletRequest req, HttpServletResponse res)
 throws ServletException, java.io.IOException
 {
  String[] item={"糖果","收音机","练习簿"}; 
  //获取会话对象
  HttpSession session=req.getSession(true);
  //获取选择的商品数目
  Integer itemCount=(Interger) session.getValue("itemCount");
  //如果没放入商品则数目为0
  if (itemCount==null){
   itemCount=new Integer(0);
  }

  // Set the content type of the response
  res.setContentType("text/html;charset=gb2312");
  PrintWriter out=res.getWriter();

  //取得POST上来的表单信息
  String[] itemsSelected;
  String itemName;
  itemsSelected=req.getParameterValues("item"); 
  //将选中的商品放入会话对象
  if(itemsSelected !=null){
   for(int i=0;i<itemsSelected.length;i++){
    itemName=itemsSelected[i];
    itemCount=new Integer(itemCount.intValue()+1);
    session.putValue("Item" + itemCount,itemName);
    //将商品名称定义为ItemX
    session.putValue("itemCount",itemCount);
    //将商品数量放入会话对象 
   }
  }

  // Write the page header
  out.println("<html>");
  out.println("<head>");
  out.println("<title>购物袋的内容</title>");
  out.println("</head>");
  out.println("<body>");
  out.println("<center><h1>你放在购物袋中的商品是: </h1></center>");
  //将购物袋的内容写入页面 
  for (int i = 1; i < itemCount.intValue(); i++) {
   String item =(String) session.getValue("Item"+i);
   //取出商品名称 
   out.println(items[Integer.parseInt(item)]);
   out.println("<BR>");
  }
  // Wrap up
  out.println("</body>");
  out.println("</html>");
  out.close();
 }
}

  客户端的ShowBuy.html 的源代码如下:
<HTML>
<HEAD>
 <TITLE>购物袋的实例 </TITLE>
</HEAD>
<BODY>
 <CENTER><H1>百货商场</H1></CENTER>
 <HR>
 <FORM ACTION='servlet/ShowBuy" METHOD="POST">
  选购商品
  <p><INPUT TYPE="Checkbox" NAME="item" VALUE="0">
   第一种:糖果</p>
  <p><INPUT TYPE="Checkbox" NAME="item" VALUE="1">
   第二种:收音机</p>
  <p><INPUT TYPE="Checkbox" NAME="item" VALUE="2">
   第三种:练习簿</p>
  <HR>
  <INPUT TYPE="Submit" NAME="bt_submit" VALUE="加入购物袋">
 </FORM>
</BODY>
</HTML>

  编程技巧说明:

  在Servlet 中进行会话管理时,首先要获得会话对象。HttpServletRequest.getSession()对象返回与请求相关的当前HttpSession 对象,并且当该对象不存在时就新创建一个对象;HttpServletRequest.getSession(true)实现相同的功能。如果参数是false,当不存在会话对象时,将返回一个null 值。
//获取会话对象
HttpSession session=req.getSession(true);
//获取选择的商品数目
Integer itemCount=(Interger) session.getValue("itemCount");


  具体操作时,当用户选择商品后,单击“加入购物袋"按钮,Servlet 输出用户选择的商品。
转自 :http://vod.sjtu.edu.cn/help/Article_Show.asp?ArticleID=1585&ArticlePage=5


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值