·配置 Tomcat5.5 站点

n 创建应用程序jspexample，配置具体步骤如下：

1. 在Tomcat下的webapps目录下创建自己的程序目录jspexample。

2. 在jspexample下创建目录WEB-INF。

3. 在WEB-INF下创建文件web.xml，具体内容如下所示。

<!DOCTYPE Web-app PUBLIC "-//Sun Microsystems,Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/Web-app_2_2.dtd">

<Web-app>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</Web-app>

·数据库的准备工作

1. 安装 Mysql4.0 以上的数据库软件。从 http://www.mysql.com 网站下载自动安装软件包和 JDBC 驱动。跟着自动安装向导可以非常容易的安装 Mysql 数据库软件。假设 mysql 安装在 c:\mysql 目录下。

2. 把mysql数据库的JDBC驱动如mysql-connector-java-3.0.16-ga-bin.jar拷贝到 Tomcat5.5 的 common\lib 目录下。

3. 创建数据库结构，在 c:\mysql\bin 目录下，键入 mysql 命令进入控制台，接着使用 CREATE DATABASE quoting 建立数据库 quoting，使用 exit 命令退出控制台，即执行下列语句：

c:\ mysql\bin> mysql

mysql> CREATE DATABASE quoting;

mysql> exit

4. 创建 SQL 文件 dbcreate.sql，文件内容如下：

DROP TABLE IF EXISTS customer;

CREATE TABLE customer (lname varchar(30) not null,

fname varchar(20), age int, sex char(1),

married char(1), children int, smoker char(1));

接着执行如下的命令，创建表 customer：

c:\mysql\bin> mysql quoting < dbcreate.sql

5. 设置 JNDI 数据源，这样我们可以在程序中通过 JNDI 数据源来访问数据库，注意 Tomcat 的版本是 5.5，版本不同，配置稍有差别。

首先，在 tomcat 的配置文件 conf/server.xml 中，在<Host></Host>标签中加入如下的内容：

<Context docBase="jspexample" path="/jspexample" reloadable="true">

<Resource name="jdbc/QuotingDB" auth="Container" type="javax.sql.DataSource" username="root" password="" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/quoting"/>

</Context>

其次，在WEB-INF 下的web.xml中的<web-app></web-app>标签中加入如下的内容：

<resource-ref>

<description>DB Connection</description>

<res-ref-name>jdbc/QuotingDB</res-ref-name>

<res-type>javax.sql.DataSource</res-type>

<res-auth>Container</res-auth>

</resource-ref>

·创建模型(Model)

创建一个 javabean 充当模型的角色，即 CustomerBean.java，完整代码如下：

package jsplession;

import java.sql.Connection;

import java.sql.SQLException;

import java.sql.Statement;

import javax.servlet.http.HttpServletRequest;

public class CustomerBean implements java.io.Serializable {

/* Member Variables */

private String lname, fname, sex;

private int age, children;

private boolean spouse, smoker;

/* Constructor */

public CustomerBean() {

/* Initialize properties */

setLname("");

setFname("");

setSex("");

setAge(0);

setChildren(0);

setSpouse(false);

setSmoker(false);

}

public void populateFromParms(HttpServletRequest _req) {

// Populate bean properties from request parameters

setLname(_req.getParameter("lname"));

setFname(_req.getParameter("fname"));

setSex(_req.getParameter("sex"));

setAge(Integer.parseInt(_req.getParameter("age")));

setChildren(Integer.parseInt(_req.getParameter("children")));

setSpouse(_req.getParameter("married").equals("Y"));

setSmoker(_req.getParameter("smoker").equals("Y"));

}

/* Accessor Methods */

/* Last Name */

public void setLname(String _lname) {

lname = _lname;

}

public String getLname() {

return lname;

}

/* First Name */

public void setFname(String _fname) {

fname = _fname;

}

public String getFname() {

return fname;

}

/* Sex */

public void setSex(String _sex) {

sex = _sex;

}

public String getSex() {

return sex;

}

/* Age */

public void setAge(int _age) {

age = _age;

}

public int getAge() {

return age;

}

/* Number of Children */

public void setChildren(int _children) {

children = _children;

}

public int getChildren() {

return children;

}

/* Spouse ? */

public void setSpouse(boolean _spouse) {

spouse = _spouse;

}

public boolean getSpouse() {

return spouse;

}

/* Smoker ? */

public void setSmoker(boolean _smoker) {

smoker = _smoker;

}

public boolean getSmoker() {

return smoker;

}

public boolean submit(Connection _dbCon) {

Statement s = null;

StringBuffer sql = new StringBuffer(256);

try {

s = _dbCon.createStatement();

// Insert record

sql.append("INSERT INTO customer VALUES('");

sql.append(lname).append("', '");

sql.append(fname).append("', ");

sql.append(age).append(", '");

sql.append(sex).append("', '");

sql.append((spouse) ? "Y" : "N").append("', ");

sql.append(children).append(", '");

sql.append((smoker) ? "Y" : "N").append("')");

s.executeUpdate(sql.toString());

} catch (SQLException e) {

System.out.println("Error saving customer: " + e.toString());

return false;

}finally{

System.out.println(sql);

}

return true;

}

}

CustomerBean.java 作为 MVC 的模型部分，一是持有用户数据，包括有 7 个属性，即：

private String lname, fname, sex;

private int age, children;

private boolean spouse, smoker;

分别表示用户的名、姓、性别、年龄、多少个孩子、婚否和是否吸烟。同时按照 javabean 的编写规范，分别给这 7 个属性创建 getter 和 setter 方法。

二是包含和用户相关的 2 个方法：

(1) public void populateFromParms(HttpServletRequest _req)：从用户提交的表单中获取数据，并赋值给CustomerBean的对应属性，如获取性别：setSex(_req.getParameter("sex"))。

(2) public boolean submit(Connection _dbCon)：把CustomerBean包含的用户数据（即7个属性）永久保存到数据库中，根据成功与否返回true和false。

·创建视图(View)

视图部分有 2 个 jsp 的页面 census.jsp 和 thankyou.jsp。

n census.jsp 主要是提供一个供用户填入数据的表单，另外也显示错误信息，如下图所示。

在 census.jsp 其中有这样一行代码：

<form action="Main?action=submit" method="post">

这一行代码表示表单提交数据给控制器 Main，并指明进行的动作 action=submit，控制器 Main 则根据 action=submit 执行相应的代码。

census.jsp 完整代码如下：

<%@ page language="java" contentType="text/html; charset=gbk"

pageEncoding="gbk"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<title>Insurance Quoting System</title>

</head>

<body bgcolor="#FFFF99">

<basefont face="宋体">

<form action="Main?action=submit" method="post">

<% String submitError = (String) session.getAttribute("submitError");

if (submitError != null && submitError.equals("y")) {

%>

<center>

<font color="#ff0000">保存数据出错，请重试。</font>

</center>

<br><br>

<% }

%>

<center><b>请输入个人信息:</b></center>

<br><br>

<table cellspacing="2" cellpadding="2" border="0" align="center">

<tr>

<td align="right">名:</td>

<td><input type="Text" name="fname" size="10"></td>

</tr>

<tr>

<td align="right">姓:</td>

<td><input type="Text" name="lname" size="10"></td>

</tr>

<tr>

<td align="right">年龄:</td>

<td><input type="Text" name="age" size="2"></td>

</tr>

<tr>

<td align="right">性别:</td>

<td>

<input type="radio" name="sex" value="M" checked>男</input>

<input type="radio" name="sex" value="F">女</input>

</td>

</tr>

<tr>

<td align="right">婚否:</td>

<td><input type="Text" name="married" size="2"></td>

</tr>

<tr>

<td align="right">孩子数目:</td>

<td><input type="Text" name="children" size="2"></td>

</tr>

<tr>

<td align="right">是否吸烟:</td>

<td><input type="Text" name="smoker" size="2"></td>

</tr>

<tr>

<td colspan="2" align="center"><input type="Submit" value="提交"></td>

</tr>

</table>

</form>

</body>

</html>

n thankyou.jsp 是在用户信息成功保存到数据库中后，给用户一个反馈信息。

thankyou.jsp 完整代码如下：

<%@ page language="java" contentType="text/html; charset=gbk"

pageEncoding="gbk"%>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gbk">

<title>Insurance Quoting System</title>

</head>

<body bgcolor="#FFFF99">

<basefont face="宋体">

<center>

您的个人信息保存成功。感谢您参与调查。

</center>

</body>

</html>

·创建控制器(Controller)

n 创建一个 servlet 充当控制器的角色，即 Main.java，完整代码如下：

package jsplession;

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import java.sql.*;

import javax.naming.*;

import javax.sql.*;

public class Main extends HttpServlet {

// Connection dbCon;

DataSource ds;

HttpSession session;

/* Initialize servlet. Use JNDI to look up a DataSource */

public void init() {

try {

Context initCtx = new InitialContext();

ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/QuotingDB");

} catch (javax.naming.NamingException e) {

System.out

.println("A problem occurred while retrieving a DataSource object");

System.out.println(e.toString());

}

}

public void doPost(HttpServletRequest _req, HttpServletResponse _res)

throws ServletException, IOException {

/* Refresh session attributes */

session = _req.getSession();

session.removeAttribute("submitError");

String action = _req.getParameter("action");

/* Record the survey data if the request comes from the survey form */

if (action.equals("submit")) {

if (recordSurvey(_req)) {

/* forward to ThankYou page */

gotoPage("/WEB-INF/jsp/thankyou.jsp", _req, _res);

} else {

session.setAttribute("submitError", "y");

gotoPage("/census.jsp", _req, _res);

}

}

}

/* Send request to a different page */

private void gotoPage(String _page, HttpServletRequest _req,

HttpServletResponse _res) throws IOException, ServletException {

RequestDispatcher dispatcher = _req.getRequestDispatcher(_page);

if (dispatcher != null)

dispatcher.forward(_req, _res);

}

/* Using the CustomerBean, record the data */

public boolean recordSurvey(HttpServletRequest _req) {

Connection dbCon = null;

try {

dbCon = ds.getConnection();

CustomerBean cBean = new CustomerBean();

cBean.populateFromParms(_req);

return cBean.submit(dbCon);

} catch (java.sql.SQLException e) {

System.out

.println("A problem occurred while accessing the database.");

System.out.println(e.toString());

} catch (Exception e) {

System.out

.println("A problem occurred while accessing the CustomerBean.");

System.out.println(e.toString());

} finally {

try {

dbCon.close();

} catch (SQLException e) {

System.out

.println("A problem occurred while closing the database.");

System.out.println(e.toString());

}

}

return false;

}

}

在 servlet 的初始化方法 public void init()中，查找我们先前创建的 JNDI 数据源，获得一个 DataSource ds，依赖 DataSource ds 完成数据库的访问工作，即：

Context initCtx = new InitialContext();

ds = (DataSource)initCtx.lookup("java:comp/env/jdbc/QuotingDB");

其次，创建几个辅助的方法：

· private void gotoPage(String _page, HttpServletRequest _req, HttpServletResponse _res)，用于重定向用户到_page 页面。

· public boolean recordSurvey(HttpServletRequest _req)，使用 CustomerBean 类，把用户提交的数据保存到数据库，根据成功与否返回 true 和 false。

然后，重写 public void doPost(…)方法:

· 获得用户请求的动作：String action = _req.getParameter("action")；

· 如果动作是 submit：if (action.equals("submit"))，则调用方法 recordSurvey()保存数据到数据库；

· 若成功，重定向用户到 thankyou.jsp 页面：gotoPage("/WEB-INF/jsp/thankyou.jsp", _req, _res)，

· 若不成功设置错误标志：session.setAttribute("submitError", "y")，并重定向用户到 census.jsp 页面：gotoPage("/census.jsp", _req, _res)。census.jsp 页面会根据错误标志 submitError 显示错误信息。

这样 Main 类就完成了控制器的工作。

n 最后不要忘了，需要在 WEB-INF 下的 web.xml 做相应的配置，把 Main 类配置成 Servlet，这样就可以通过路径：/Main，来访问这个控制器类：

<servlet>

<servlet-name>

Main

</servlet-name>

<servlet-class>

jsplession.Main

</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>

Main

</servlet-name>

<url-pattern>

/Main

</url-pattern>

</servlet-mapping>

·部署运行

n 部署文件

编译 CustomerBean.java 和 Main.java，把 CustomerBean.class 和 Main. class 放到 WEB-INF\classes\jsplession 目录下。把 census.jsp 放到应用程序jspexample目录下，thankyou.jsp 放到 WEB-INF\jsp 目录下。目录结构如下：

\census.jsp

\WEB-INF\jsp\thankyou.jsp

\WEB-INF\classes\jsplession\Main.class

\WEB-INF\classes\jsplession\CustomerBean.class

n 启动 Tomcat

n 在 IE 浏览器的地址栏中输入<http://localhost:8080/jspexample/census.jsp>

n 先不输入任何数据，直接点击“提交”按钮，查看错误信息

再输入合法数据，点击“提交”按钮，查看反馈信息。