· 配置 Tomcat5.5 站点

n 创建应用程序 strutsbasic

· 数据库的准备工作

n 使用 MVC 模式训练实训建立的数据库 quoting 和表 customer

· 安装 Struts

n 安装 Struts 需要的文件

可以从<http://struts.apache.org/>下载最新的 Struts 软件包。本实训 Struts 的版本是 1.2.9，不同版本的 Struts 有一定的差别，请注意。把 Struts 压缩文件解压后，将 lib 目录下的 JAR 文件拷贝至 WEB-INF\lib 目录下：

· commons-beanutils.jar

· commons-digester.jar

· commons-fileupload.jar

· commons-logging.jar

· commons-validator.jar

· jakarta-oro.jar

· struts.jar

n 创建/WEB-INF/struts-config.xml，文件内容可以暂时为空，我们后面再说这个文件的内容

n 配置 web.xml，ActionServlet 的映射路径为*.do

<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"

version="2.4">

<!-- The Action Servlet -->

<servlet>

<servlet-name>action</servlet-name>

<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

<init-param>

<param-name>config</param-name>

<param-value>/WEB-INF/struts-config.xml</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

<!-- Action Servlet Mapping -->

<servlet-mapping>

<servlet-name>action</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

</web-app>

· 创建 Struts 视图组件

n 创建 JSP 文件

共有 censusStruts.jsp 和 thankyouStruts.jsp 二个 JSP 文件，与 MVC 模式训练实训中的 2 个 jsp 文件作用相同，只不过这里我们使用 Struts 的标签库来构建这 2 个文件。

· censusStruts.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">

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>

<html:html>

<head>

<title>Insurance Quoting System</title>

</head>

<body bgcolor="#FFFF99">

<html:form action="/submit" method="post">

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

<font color="#ff0000"><html:errors/></font>

</center>

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

<tr>

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

<td><html:text property="fname" size="10"/></td>

</tr>

<tr>

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

<td><html:text property="lname" size="10"/></td>

</tr>

<tr>

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

<td><html:text property="age" size="2"/></td>

</tr>

<tr>

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

<td>

<html:radio property="sex" value="M"/>男

<html:radio property="sex" value="F"/>女

</td>

</tr>

<tr>

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

<td><html:text property="married" size="5"/></td>

</tr>

<tr>

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

<td><html:text property="children" size="2"/></td>

</tr>

<tr>

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

<td><html:text property="smoker" size="5"/></td>

</tr>

<tr>

<td colspan="2" align="center"><html:submit value="确定"/></td>

</tr>

</table>

</html:form>

</body>

</html:html>

其中：

1. <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>，声明使用 Struts html 标签库

2. <html:errors/>，用于显示 Struts 框架中其它组件产生的错误消息。

3. <html:form action="/submit" method="post">，用于创建 HTML 表单，它能够把 HTML 表单的字段和 ActionForm Bean 的属性相关联。action="/submit"，指明表单提交给 submit 这个 Action。

4. <html:text property="fname" size="10"/>，<html:form>的子标签，用于创建 HTML 表单的文本框。它和 ActionForm Bean 的属性 fname 相关联。

5. <html:radio property="sex" value="M"/>，<html:form>的子标签，用于创建 HTML 表单的单选按钮

6. <html:submit>，<html:form>的子标签，用于创建 HTML 表单的提交按钮

· thankyouStruts.jsp 代码如下：

1. <%@ taglib uri="http://jakarta.apache.org/struts/tags"-bean prefix="bean"%>，使用 Struts bean 标签库

2. <bean:message key="submit.success"/>，使用<bean:message>标签输出资源文件中 key 对应的文字信息。

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

pageEncoding="gbk"%>

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>

<html>

<head>

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

<title>Insurance Quoting System</title>

</head>

<body bgcolor="#FFFF99">

<center><bean:message key="submit.success" /></center>

</body>

</html>

n 创建消息资源文件

· 创建 messages.properties，默认的资源文件。我们把应用程序需要的文字信息都定义在这个文件中，然后在程序的适当位置用相应的 key 来引用这些文字。注意此资源文件包含中文，需要用 native2asc 工具进行转码。

errors.header=<UL>

errors.prefix=<LI>

errors.suffix=</LI>

errors.footer=</UL>

errors.fname.required=名是必须的

errors.lname.required=姓是必须的

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

· 创建 sql.properties，访问数据库所用到的所有 SQL 语句定义在此文件中。

sql.apostrophe.replace=\\'

sql.insert.customer=INSERT INTO customer (name, address) VALUES(?, ?)

sql.select.customer=SELECT MAX(customer_id) AS id FROM customer

sql.insert.order=INSERT INTO pizza.order (customer_id, delivery, size) VALUES(?, ?, ?)

sql.select.order=SELECT MAX(order_id) AS id FROM pizza.order

sql.insert.topping=INSERT INTO topping (order_id, topping) VALUES(?, ?)

n 创建 ActionForm Bean

创建 public class CensusForm extends ActionForm，代码如下：

package formbean;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionErrors;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionMapping;

import org.apache.struts.action.ActionMessage;

public class CensusForm extends ActionForm {

private String fname;

private String lname;

private int age;

private String sex;

private int children;

private boolean married;

private boolean smoker;

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public int getChildren() {

return children;

}

public void setChildren(int children) {

this.children = children;

}

public String getFname() {

return fname;

}

public void setFname(String fname) {

this.fname = fname;

}

public String getLname() {

return lname;

}

public void setLname(String lname) {

this.lname = lname;

}

public boolean isMarried() {

return married;

}

public void setMarried(boolean married) {

this.married = married;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public boolean isSmoker() {

return smoker;

}

public void setSmoker(boolean smoker) {

this.smoker = smoker;

}

public void reset(ActionMapping mapping, HttpServletRequest request) {

fname = null;

lname = null;

sex = "M";

}

public ActionErrors validate(ActionMapping mapping,

HttpServletRequest request) {

ActionErrors errors = new ActionErrors();

if (fname == null || fname.length() < 1) {

errors.add("fname", new ActionMessage("errors.fname.required"));

}

if (lname == null || lname.length() < 1) {

errors.add("lname", new ActionMessage("errors.lname.required"));

}

return errors;

}

}

ActionForm 实质上是一种 Javabean。其中有二个方法是父类 ActionForm 定义的方法，子类需要覆盖这二个方法：

· public void reset(…)：把属性设置为初始值

· public ActionErrors validate(…)：对表单数据进行验证。若 ActionErrors 对象为 null 则表示验证通过，否则返回原始页面。此项功能需要在 struts-config.xml 中把相应 action 元素的 validate 属性设置为"true"。

· 创建 Struts 控制器组件

n 创建 public class SubmitAction extends Action，一个具体的 Action 类。Action 类一般负责调用模型的方法，更新模型的状态，并帮助控制应用程序的流程。在我们这个小小的例子中，这个 Action 类没有调用模型，而是直接完成实际的业务逻辑，即存储调查数据到数据库。

package actions;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.sql.Statement;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.sql.DataSource;

import org.apache.struts.action.Action;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

import org.apache.struts.action.ActionMapping;

import formbean.CensusForm;

public class SubmitAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

CensusForm census = (CensusForm) form;

if (recordSurvey(census)) {

return mapping.findForward("success");

} else {

return mapping.getInputForward();

}

}

private boolean recordSurvey(CensusForm form) {

DataSource ds;

Connection dbCon = null;

StringBuffer sql = new StringBuffer(256);

try {

Class.forName("com.mysql.jdbc.Driver");

dbCon = DriverManager.getConnection(

"jdbc:mysql://localhost:3306/quoting", "root", "");

Statement s = dbCon.createStatement();

// Insert record

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

sql.append(form.getLname()).append("', '");

sql.append(form.getFname()).append("', ");

sql.append(form.getAge()).append(", '");

sql.append(form.getSex()).append("', '");

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

sql.append(form.getChildren()).append(", '");

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

s.executeUpdate(sql.toString());

return true;

} catch (java.sql.SQLException e) {

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

} catch (Exception e) {

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

} finally {

System.out.println(sql);

try {

if (dbCon != null)

dbCon.close();

} catch (SQLException e) {

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

}

}

return false;

}

}

代码解释如下：

1. 创建 private boolean recordSurvey(CensusForm form)：把 CensusForm form 包含的调查数据保存到数据库，成功返回 true，否则返回 false。

2. 重写 public ActionForward execute(…)：

· 把 ActionMapping 转换为 CensusForm 类型即 CensusForm census = (CensusForm) form。

· 然后调用 recordSurvey(…)，若成功，则将流程传递给"success"指定的 ActionForward 对象，实际就是重定向用户到 thankyouStruts.jsp，即 return mapping.findForward("success")；否则返回 action 的输入页面即 return mapping.getInputForward()。

· 创建 Struts 配置文件 struts-config.xml

在前面的各步骤中我们创建了很多元素，比如资源文件、ActionForm、Action 和 ActionForward 对象，我们还必须在 struts-config.xml 定义这些元素以及这些元素之间的关系，这样这些元素才能够共同工作。struts-config.xml 完整代码如下：

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"

"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

<struts-config>

<form-beans>

<form-bean name="censusForm" type="formbean.CensusForm"/>

</form-beans>

<action-mappings>

<action path="/submit" type="actions.SubmitAction" name="censusForm" scope="request" validate="true" input="/censusStruts.jsp">

<forward module="/" name="census" path="/censusStruts.jsp"/>

<forward module="/" name="success" path="/thankyouStruts.jsp"/>

</action>

</action-mappings>

<message-resources parameter="MessageResources" />

</struts-config>

代码解释如下：

1. 配置 ActionForm

<form-beans>

<form-bean name="censusForm" type="formbean.CensusForm"/>

</form-beans>

· name="censusForm"，指定 ActionForm 的名称

· type="formbean.CensusForm"，ActionForm 对应的 Java 类

2. 配置 ActionMapping。

<action path="/submit" type="actions.SubmitAction" name="censusForm" scope="request" validate="true" input="/censusStruts.jsp">

<forward module="/" name="census" path="/censusStruts.jsp"/>

<forward module="/" name="success" path="/thankyouStruts.jsp"/>

</action>解释如下：

· path="/submit"，指明此 Action 的访问路径是/submit；

· type=""actions.SubmitAction"，指明此 Action 的 java 类文件

· name="censusForm"，指明和此 Action 关联的 ActionForm 是" censusForm "

· scope=" request "，指明关联的 ActionForm 的存储范围

· input="/censusStruts.jsp"，指明输入文件是/pizzaStruts.jsp"，

· validate="true"，指明在 Action 处理表单数据前，需要验证表单数据。本例就是调用 ActionForm 对象的 validate(…)方法对表单数据进行验证。

· <forward…/>，配置此 Action 范围内的转发

3. 配置默认资源文件

<message-resources parameter=" MessageResources " />

· 部署运行

n 部署文件

整个 Struts 应用程序的目录结构如下(lib 目录里的 jar 文件省略)，再次提醒 messages.properties 资源文件包含中文，需要用 native2asc 工具进行转码，详见概念及定义。

\censusStruts.jsp

\thankyouStruts.jsp

\WEB-INF\web.xml

\WEB-INF\struts-config.xml

\WEB-INF\classes\action\SubmitAction.class

\WEB-INF\classes\formbean\CensusForm.class

\WEB-INF\classes\messages.properties

n 启动 Tomcat，启动 Mysql

n 在 IE 浏览器的地址栏中输入：<http://localhost:8080/strutsbasic/censusStruts.jsp>，不输入任何数据，直接点击确定按钮，查看错误信息。

输入合法数据，点击确定按钮