# 系统实现

一、 描述：

该案例使用 Servlet 来实现了一个网上书店，包括购物车、出纳员和收银员等等对象。

二、配置 Eclipse：

为了让我们的操作更加便捷，我们将给 Eclipse 添加 Sysdeo Tomcat 外挂程序。Sysdeo 外挂程序让你可以在 Eclipse 的环境中启动和中止 Tomcat。

首先保证你的系统已经安装了 Tomcat 服务器。我们在先前的小类子中已经调试和配置过 JSP 应用，在这里如果有问题请回顾先前的小类子配置。

从下面网页下载 Sysdeo：

<http://www.sysdeo.com/sysdeo/content/download/393/4930/file/tomcatPluginV31.zip>

解压后把 tomcatPluginV31 目录下的文件夹整个复制到 Eclipse 安装目录下的平 plugins 目录下。重新启动 Eclipse，可以看到在 Eclipse 工具栏上多了 3 个 tomcat 按钮，分别是启动、停止和重启控制（红色框框内）。

然后对 Eclipse 做些设置：打开“窗口”-〉“首选项”，我们看到 Tomcat 选项：

对 Tomcat 选项，我们要作如下设置：

1、 根据你当前安装的 Tomcat 版本准确选择“Tomcat version”选项；

2、 点击“浏览”选择 Tomcat 的安装目录；

3、 在“Context declaration mode”一项中，我们选择“Server.xml”，并点击“浏览”到 Tomcat 安装目录下选择 conf 目录下的“server.xml”文件。

4、 其它可按默认设置就行。点击应用，结束设置。

三、用 Eclipse 创建 case403 项目：

1、 文件-〉新建项目-〉Tomcat Project

2、 下一步，命名项目为“case404”

3、 下一步，按默认设置

4、 完成

四、创建应用

1、 在 WEB-INF/src 目录下创建 Java 源文件，代码参考该目录下的对应文件；

2、 配置 web.xml 文件

五、运行效果图

用浏览器打开<http://localhost:8080/case404/catalog>

六、要点

1、 虚拟数据库和数据视图：database.BookDB 和 database.BookDetails

在这里用一个哈希表来定义了一个小数据库，并用向量来定义了一个试图。

2、 购物车是这个案例的一个要点，如何设计一个购物车对象，如何添加物品和删除物品，

3、 在 Servlet 的使用方面，我们使用了

RequestDispatcher dispatcher =getServletContext().getRequestDispatcher("/banner");

从 web.xml 配置中得到另外一个 servlet

4、 在这个案例里我们使用了本地化货币符号￥。是通过 request.getLocale()取得本地信息，并通过 Current 类进行格式化。

5、 session 的使用，取得 session：

HttpSession session = request.getSession(true);

清除一个 session：

session.invalidate();

6、 页面自动跳转方法，在 HTML 头中添加一个<meta>标签，标签内容参看下面实类：

out.println("<html>" +

"<head><title> 收银台 </title>" +

"<meta http-equiv=\"refresh\" content=\"4; url=" +

"http://" + request.getHeader("Host") +

"/case404/catalog;\">" +

"</head>");

## 主程序框架

程序：CatalogServlet.java

import java.io.*;

import java.util.*;

import java.sql.*;

import javax.servlet.*;

import javax.servlet.http.*;

import database.*;

import cart.*;

public class CatalogServlet extends HttpServlet {

private BookDB bookDB;

public void init() throws ServletException {

bookDB =

(BookDB)getServletContext().getAttribute("examples.bookstore.database");

if (bookDB == null) {

bookDB = BookDB.instance();

getServletContext().setAttribute("examples.bookstore.database", bookDB);

}

}

public void destroy() {

bookDB = null;

}

public void doGet (HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException

{

// 取得客户的 session 和购物车

HttpSession session = request.getSession(true);

ShoppingCart cart = (ShoppingCart)session.getAttribute("examples.bookstore.cart");

// 如果这个客户没有购物车，则创建一个

if (cart == null) {

cart = new ShoppingCart();

session.setAttribute("examples.bookstore.cart", cart);

}

// 在访问 Writer 之前，设置 content-type 头

response.setContentType("text/html; charset=gb2312");

PrintWriter out = response.getWriter();

// 然后写出 response 数据

out.println("<html>" +

"<head><title> 购书目录</title></head>");

// 取得 dispatcher;给用户一个旗标

RequestDispatcher dispatcher =

getServletContext().getRequestDispatcher("/banner");

if (dispatcher != null)

dispatcher.include(request, response);

//书的信息来自来自数据库

// 把它添加到购物车

String bookId = request.getParameter("Add");

if (bookId != null) {

BookDetails book = bookDB.getBookDetails(bookId);

cart.add(bookId, book);

out.println("<p><h3>" +

"<font color=\"#ff0000\">" +

"<i>" + book.getTitle() + "</i> </font>"+

"已经放到到您的购物车上.</h3>");

}

//给一个“检查”选项，如果购物车不是空的，则给出结帐选项

if (cart.getNumberOfItems() > 0) {

out.println("<p><strong><a href=\"" +

response.encodeURL("/case404/showcart") +

"\"> 查看购物车</a>&nbsp;&nbsp;&nbsp;" +

"<a href=\"" +

response.encodeURL("/case404/cashier") +

"\"> 结算</a>" +

"</p></strong>");

}

// 总是提示客户买更多的书，取得并显示目录

out.println("<br> &nbsp;" +

"<center><h3>请选择我们的精品书目:</h3></center>" +

"<center> <table>");

Collection c = bookDB.getBooks();

Iterator i = c.iterator();

while (i.hasNext()) {

BookDetails book = (BookDetails)i.next();

bookId = book.getBookId();

//输出每一本书的信息

out.println("<tr>" +

"<td bgcolor=\"#ffffaa\">" +

"<a href=\"" +

response.encodeURL("/case404/bookdetails?bookId=" + bookId) +

"\"> <strong>" + book.getTitle() +

"&nbsp; </strong></a></td>" +

"<td bgcolor=\"#ffffaa\" rowspan=2>" +

Currency.format(book.getPrice(), request.getLocale()) +

"&nbsp; </td>" +

"<td bgcolor=\"#ffffaa\" rowspan=2>" +

"<a href=\"" +

response.encodeURL("/case404/catalog?Add=" + bookId)

+ "\"> &nbsp;添加到购物车 &nbsp;</a></td></tr>" +

"<tr>" +

"<td bgcolor=\"#ffffff\">" +

"&nbsp; &nbsp; by <em> " + book.getFirstName() +

" " + book.getSurname() + "</em></td></tr>");

}

out.println("</table></center></body></html>");

out.close();

}

public String getServletInfo() {

return "Catalog servlet 添加书目到客户的购物车并输出目录";

}

}