· 配置 Tomcat5.5 站点

n 创建应用程序 Pizza

· 数据库的准备工作

1. 安装 Mysql4.0 以上的数据库软件和 JDBC 驱动。

2. 创建数据库 pizza

3. 创建 SQL 文件 pizza.sql，文件内容如下：

CREATE TABLE pizza.order (

order_id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,

customer_id INTEGER NOT NULL,

delivery VARCHAR(13),

size VARCHAR(6),

status CHAR(1) DEFAULT 'O' NOT NULL);

CREATE TABLE customer (

customer_id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,

name VARCHAR(50) NOT NULL,

address TEXT NOT NULL);

CREATE TABLE topping (

order_id INTEGER NOT NULL,

topping VARCHAR(13) NOT NULL,

PRIMARY KEY (order_id, topping)

);

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

c:\mysql\bin> mysql pizza < pizza.sql

表结构说明如下：

order 表
order_id | 订单 ID，主键
customer_id | 客户 ID
delivery | 订单类型
size | Pizza 尺寸
status | 订单状态（本实训的例子未使用此字段）
customer 表
customer_id | 客户 ID，主键
name | 客户姓名
address | 地址
topping 表
order_id | 订单 ID
topping | Pizza 浇汁类型

· 安装 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

同时，将 validator-rules.xml 文件拷贝至 WEB-INF 目录下。

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 文件

共有 pizzaStruts.jsp 和 processStruts.jsp 二个 JSP 文件

· 在 pizzaStruts.jsp 文件中，使用 Struts 的标签库创建表单，客户可以使用这个表单来下订单。完整代码如下：

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

pageEncoding="gbk"%>

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

prefix="html"%>

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

prefix="bean"%>

<html>

<head>

<title><bean:message key="text.pizza.title" /></title>

<style type="text/css">

H1 {

font-size: 12pt;

font-weight: bold;

}

.missing {

color: red;

}

</style>

</head>

<body>

<html:errors property="errors.database" />

<html:form action="/process.do" method="post">

<bean:message key="text.pizza.first.para" />

<bean:message key="text.pizza.second.para" />

<h1><bean:message key="text.pizza.your.info" /></h1>

<table>

<tr>

<td><bean:message key="text.pizza.name" /></td>

<td><html:text property="name" size="30" /> <html:errors

property="name" /></td>

</tr>

<tr>

<td><bean:message key="text.pizza.address" /></td>

<td><html:textarea rows="4" cols="40" property="address" /> <html:errors

property="address" /></td>

</tr>

</table>

<h1><bean:message key="text.pizza.order.type" /></h1>

<table>

<tr>

<td><html:radio property="purchaseType" value="Home Delivery" />

</td>

<td><bean:message key="text.pizza.home.delivery" /></td>

</tr>

<tr>

<td><html:radio property="purchaseType" value="Take Away" /></td>

<td><bean:message key="text.pizza.take.away" /></td>

</tr>

</table>

<h1><bean:message key="text.pizza.additional.toppings" /></h1>

<table>

<tr>

<td><html:multibox property="topping" value="Peppers" /></td>

<td><bean:message key="text.pizza.peppers" /></td>

</tr>

<tr>

<td><html:multibox property="topping" value="Sweetcorn" /></td>

<td><bean:message key="text.pizza.sweetcorn" /></td>

</tr>

<tr>

<td><html:multibox property="topping" value="Mouse innards" /></td>

<td><bean:message key="text.pizza.mouse.innards" /></td>

</tr>

</table>

<h1><bean:message key="text.pizza.choose.size" /></h1>

<table>

<tr>

<td><bean:message key="text.pizza.size" /></td>

<td><html:select property="size" value="Medium">

<html:option key="text.pizza.option.small" value="Small" />

<html:option key="text.pizza.option.medium" value="Medium" />

<html:option key="text.pizza.option.large" value="Large" />

</html:select></td>

</tr>

</table>

<html:submit>

<bean:message key="text.pizza.submit" />

</html:submit>

</html:form>

</body>

</html>

其中：

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

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

3. <bean:message key="text.pizza.title" />，使用<bean:message>标签输出资源文件中 key 对应的国际化文本。

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

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

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

7. <html:errors property="name" />，显示专门针对 name 表单项的错误信息。

8. <html:textarea rows="4" cols="40" property="address" />，<html:form>的子标签，用于创建 HTML 表单的多行文本框

9. <html:radio property="purchaseType" value="Home Delivery" />，<html:form>的子标签，用于创建 HTML 表单的单选按钮

10. <html:multibox property="topping" value="Peppers" />，<html:form>的子标签，用于创建 HTML 表单的多选按钮

11. <html:select property="size" value="Medium">，<html:form>的子标签，用于创建 HTML 表单的下拉框

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

· processStruts.jsp 是 Action 类在把客户订单数据成功保存到数据库后，定向用户到此页面，显示客户的订单信息。${sessionScope.name}用于输出 session 范围的变量 name 的值。processStruts.jsp 完整代码如下：

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

pageEncoding="gbk"%>

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

prefix="bean"%>

<html>

<head>

<title><bean:message key="text.process.title" /></title>

<style type="text/css">

H1 {

font-size: 12pt;

font-weight: bold;

}

</style>

</head>

<body>

<h1><bean:message key="text.process.first.header" /></h1>

<table>

<tr>

<td><bean:message key="text.process.name" /></td>

<td>${sessionScope.name}</td>

</tr>

<tr>

<td><bean:message key="text.process.address" /></td>

<td>${sessionScope.address}</td>

</tr>

<tr>

<td><bean:message key="text.process.delivery.type" /></td>

<td>${sessionScope.purchaseType}</td>

</tr>

<tr>

<td><bean:message key="text.process.toppings" /></td>

<td>${sessionScope.topping[0]}</td>

</tr>

<tr>

<td></td>

<td>${sessionScope.topping[1]}</td>

</tr>

<tr>

<td></td>

<td>${sessionScope.topping[2]}</td>

</tr>

<tr>

<td><bean:message key="text.process.size" /></td>

<td>${sessionScope.size}</td>

</tr>

</table>

<p><bean:message key="text.process.thanks" /></p>

</body>

</html>

n 创建消息资源文件

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

text.pizza.title=快来买 Pizza

text.pizza.first.para=欢迎来到 Pizza 网上商店！

text.pizza.second.para= 请填写下列信息，完成后点击"下订单"按钮。

text.pizza.your.info=您的详细信息:

text.pizza.name=姓名:

text.pizza.address=地址:

text.pizza.order.type=订单类型:

text.pizza.home.delivery=送货上门

text.pizza.take.away=自取

text.pizza.additional.toppings=可选的浇汁:

text.pizza.peppers=Peppers

text.pizza.sweetcorn=Sweetcorn

text.pizza.mouse.innards=Mouse Innards

text.pizza.choose.size=Pizza 尺寸:

text.pizza.size=尺寸:

text.pizza.option.small=小

text.pizza.option.medium=中

text.pizza.option.large=大

text.pizza.submit=下订单

text.process.title=您的详细信息

text.process.first.header=您的详细信息

text.process.name=姓名:

text.process.address=地址:

text.process.delivery.type=送货方式:

text.process.toppings=浇汁:

text.process.size=Pizza 尺寸:

text.process.thanks=感谢您购买我们的 Pizza

errors.header=<font color="red">

errors.footer=</font>

errors.required=此项必添

errors.database=数据库出错，请致电 110 解决.

· 创建 messages_en.properties，此为英文资源文件。和上一个资源文件一起完成国际化和本地化的功能。系统会跟据客户浏览器的区域语言设置，挑选一个合适的资源文件。

text.pizza.title=Take The Pizza

text.pizza.first.para=Welcome to Take the Pizza Online! We're eager to take your order for pizza via our new web form.

text.pizza.second.para= Please fill out the fields below and click on "Place Order" when you're done.

text.pizza.your.info=Your Information:

text.pizza.name=Name:

text.pizza.address=Address:

text.pizza.order.type=Order Type:

text.pizza.home.delivery=Home Delivery

text.pizza.take.away=Take Away

text.pizza.additional.toppings=Please Select Any Additional Toppings:

text.pizza.peppers=Peppers

text.pizza.sweetcorn=Sweetcorn

text.pizza.mouse.innards=Mouse Innards

text.pizza.choose.size=Pizza Size:

text.pizza.size=Size:

text.pizza.option.small=Small

text.pizza.option.medium=Medium

text.pizza.option.large=Large

text.pizza.submit=Place Order

text.process.title=Your details

text.process.first.header=Your Details

text.process.name=Name:

text.process.address=Address:

text.process.delivery.type=Delivery type:

text.process.toppings=Toppings:

text.process.size=Pizza size:

text.process.thanks=Thank you for ordering.

errors.header=<font color="red">

errors.footer=</font>

errors.required=* Required field

errors.database=There was a database error. Please phone us on 555-1234.

· 创建 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

可以通过继承 ActionForm 等类来创建一个 ActionForm Bean。另外，也可以直接配置一个动态的 ActionForm，这样就没有必要编写额外的程序来创建具体的 ActionForm 类。我们下面就在 struts-config.xml 中配置一个动态的 ActionForm：

<struts-config>

…

<form-beans>

<form-bean name="pizzaForm"

type="org.apache.struts.validator.DynaValidatorForm">

<form-property name="name" type="java.lang.String" />

<form-property name="address" type="java.lang.String" />

<form-property name="purchaseType" type="java.lang.String"

initial="Home Delivery" />

<form-property name="topping" type="java.lang.String[]" />

<form-property name="size" type="java.lang.String" />

</form-bean>

</form-beans>

…

</struts-config>

其中：

1. <form-bean name="pizzaForm" type="org.apache.struts.validator.DynaValidatorForm">，定义一个名为"pizzaForm"的 ActionForm Bean，type="org.apache.struts.validator.DynaValidatorForm"表示这是一个动态 ActionForm，并且可以利用 Validator 框架对表单数据进行验证。

2. <form-property name="name" type="java.lang.String" />，定义一个 name 属性，和 pizzaStruts.jsp 表单的<html:text property="name" size="30" />相对应。

n 表单数据的验证

· 创建 validation.xml 文件，对表单数据进行验证。

1. <form name="pizzaForm">，指明验证的是名为"pizzaForm"的 ActionForm Bean。

2. <field property="name" depends="required"/>，指明"name"属性的验证规则是"required"，这个规则在 validator-rules.xml 文件中定义。

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

<!DOCTYPE form-validation PUBLIC

"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"

"http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">

<!-- This file tells Struts which fields to validate in which forms -->

<form-validation>

<formset>

<form name="pizzaForm">

<field property="name" depends="required"/>

<field property="address" depends="required"/>

</form>

</formset>

</form-validation>

· validator-rules.xml 包含在 Struts 的安装包里，直接拷贝过来即可，本例的 validator-rules.xml 完整代码如下：

<!DOCTYPE form-validation PUBLIC

"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"

"http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">

<form-validation>

<global>

<validator name="required"

classname="org.apache.struts.validator.FieldChecks"

method="validateRequired"

methodParams="java.lang.Object,

org.apache.commons.validator.ValidatorAction,

org.apache.commons.validator.Field,

org.apache.struts.action.ActionMessages,

org.apache.commons.validator.Validator,

javax.servlet.http.HttpServletRequest"

msg="errors.required" />

</global>

</form-validation>

其中：<validator name="required">此规则意即必须填写的项，msg="errors.required"是验证失败时显示资源文件"errors.required"这个 key 所对应的国际化信息。

· 创建 Struts 控制器组件

n 创建 public class DBManager。public static Connection getConnection()方法用来获得数据库连接。

package jsplession;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

public class DBManager {

public static Connection getConnection() throws SQLException {

Connection conn = null;

try {

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

conn = DriverManager.getConnection(

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

} catch (Exception e) {

System.out.println("Error Connecting to pizza DB: "

+ e.toString());

}

return conn;

}

}

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

package actions;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import jsplession.DBManager;

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 org.apache.struts.util.MessageResources;

import org.apache.struts.validator.DynaValidatorForm;

public final class ProcessAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws SQLException {

DynaValidatorForm dynaForm = (DynaValidatorForm) form;

String name = (String) dynaForm.get("name");

String address = (String) dynaForm.get("address");

String purchaseType = (String) dynaForm.get("purchaseType");

String size = (String) dynaForm.get("size");

String[] topping = (String[]) dynaForm.get("topping");

MessageResources resources = getResources(request, "sql");

String apostropheReplace = resources

.getMessage("sql.apostrophe.replace");

name = name.replaceAll("'", apostropheReplace);

address = address.replaceAll("'", apostropheReplace);

HttpSession session = request.getSession();

Connection con = null;

PreparedStatement stmt = null;

try {

// Open the connection

con = DBManager.getConnection();

con.setAutoCommit(false);

String sql = resources.getMessage("sql.insert.customer");

stmt = con.prepareStatement(sql);

stmt.setString(1, name);

stmt.setString(2, address);

stmt.executeUpdate();

sql = resources.getMessage("sql.select.customer");

stmt = con.prepareStatement(sql);

ResultSet key = stmt.executeQuery();

String customer_id = "";

while (key.next()) {

customer_id = key.getString(1);

}

// Now insert the order

sql = resources.getMessage("sql.insert.order");

stmt = con.prepareStatement(sql);

stmt.setString(1, customer_id);

stmt.setString(2, purchaseType);

stmt.setString(3, size);

// Now we insert the data

stmt.executeUpdate();

// We need the inserted key

sql = resources.getMessage("sql.select.order");

stmt = con.prepareStatement(sql);

key = stmt.executeQuery();

String order_id = "";

while (key.next()) {

order_id = key.getString(1);

}

// Insert the topping

sql = resources.getMessage("sql.insert.topping");

stmt = con.prepareStatement(sql);

for (int i = 0; i < topping.length; i++) {

stmt.setString(1, order_id);

stmt.setString(2, topping[i]);

// Now we insert the data

stmt.executeUpdate();

}

// Commit the transaction and then return to auto-commit mode

con.commit();

con.setAutoCommit(true);

} catch (Exception sqle) {

System.out.println("Error dealing with database");

System.out.println("Reason: " + sqle.getMessage());

throw new SQLException(sqle.getMessage());

} finally {

if (con != null) {

// Close the Statement and the Connection

stmt.close();

con.close();

}

}

// Add the details to the session so we can show the user

session.setAttribute("name", name);

session.setAttribute("address", address);

session.setAttribute("purchaseType", purchaseType);

session.setAttribute("size", size);

session.setAttribute("topping", topping);

// Remove the obsolete form bean

if (mapping.getAttribute() != null) {

if ("request".equals(mapping.getScope())) {

request.removeAttribute(mapping.getAttribute());

} else {

session.removeAttribute(mapping.getAttribute());

}

}

// Forward control to the specified success URI

return (mapping.findForward("success"));

}

}

代码解释如下：

1. 获得 ActionForm 包含的表单数据：

DynaValidatorForm dynaForm = (DynaValidatorForm) form;

String name = (String) dynaForm.get("name");

String address = (String) dynaForm.get("address");

String purchaseType = (String) dynaForm.get("purchaseType");

String size = (String) dynaForm.get("size");

String[] topping = (String[]) dynaForm.get("topping");

2. 获得包含 SQL 语句的资源文件：

MessageResources resources = getResources(request, "sql");

3. 替换表单数据中的单引号，否则会引起数据库错误

String apostropheReplace = resources

.getMessage("sql.apostrophe.replace");

name = name.replaceAll("'", apostropheReplace);

address = address.replaceAll("'", apostropheReplace);

4. 获得 session 对象，后面我们会用到

HttpSession session = request.getSession();

5. 获得数据库连接，插入新客户数据，并查询此新客户的 ID

// Open the connection

con = DBManager.getConnection();

con.setAutoCommit(false);

String sql = resources.getMessage("sql.insert.customer");

stmt = con.prepareStatement(sql);

stmt.setString(1, name);

stmt.setString(2, address);

stmt.executeUpdate();

sql = resources.getMessage("sql.select.customer");

stmt = con.prepareStatement(sql);

ResultSet key = stmt.executeQuery();

String customer_id = "";

while (key.next()) {

customer_id = key.getString(1);

}

6. 向数据库插入新订单数据，并获得此新订单的 ID

sql = resources.getMessage("sql.insert.order");

stmt = con.prepareStatement(sql);

stmt.setString(1, customer_id);

stmt.setString(2, purchaseType);

stmt.setString(3, size);

stmt.executeUpdate();

sql = resources.getMessage("sql.select.order");

stmt = con.prepareStatement(sql);

key = stmt.executeQuery();

String order_id = "";

while (key.next()) {

order_id = key.getString(1);

}

7. 向数据库中插入此订单的浇汁类型：

// Insert the topping

sql = resources.getMessage("sql.insert.topping");

stmt = con.prepareStatement(sql);

for (int i = 0; i < topping.length; i++) {

stmt.setString(1, order_id);

stmt.setString(2, topping[i]);

// Now we insert the data

stmt.executeUpdate();

}

8. 把客户订单的信息依次保存在 session 范围内：

session.setAttribute("name", name);

session.setAttribute("address", address);

session.setAttribute("purchaseType", purchaseType);

session.setAttribute("size", size);

session.setAttribute("topping", topping);

9. 从 request 范围或者 session 范围删除不需要的 ActionForm bean

if (mapping.getAttribute() != null) {

if ("request".equals(mapping.getScope())) {

request.removeAttribute(mapping.getAttribute());

} else {

session.removeAttribute(mapping.getAttribute());

}

}

10. 返回"success"指定的 ActionForward 对象，把控制传递下去。

return (mapping.findForward("success"));

· 创建 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.1//EN"

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

<struts-config>

<form-beans>

<form-bean name="pizzaForm"

type="org.apache.struts.validator.DynaValidatorForm">

<form-property name="name" type="java.lang.String" />

<form-property name="address" type="java.lang.String" />

<form-property name="purchaseType" type="java.lang.String"

initial="Home Delivery" />

<form-property name="topping" type="java.lang.String[]" />

<form-property name="size" type="java.lang.String" />

</form-bean>

</form-beans>

<global-exceptions>

<exception type="java.sql.SQLException" key="errors.database" />

</global-exceptions>

<global-forwards>

<forward name="pizza" path="/pizzaStruts.jsp" />

<forward name="success" path="/processStruts.jsp"

redirect="true" />

</global-forwards>

<action-mappings>

<!-- The action mappings -->

<action path="/process" type="actions.ProcessAction"

name="pizzaForm" scope="session" input="/pizzaStruts.jsp"

validate="true">

</action>

</action-mappings>

<message-resources parameter="resources.messages" />

<message-resources parameter="resources.sql" key="sql" />

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">

<set-property property="pathnames"

value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />

</plug-in>

</struts-config>

代码解释如下：

1. 配置全局异常

<global-exceptions>

<exception type="java.sql.SQLException" key="errors.database" />

</global-exceptions>

2. 配置全局转发

<global-forwards>

<forward name="pizza" path="/pizzaStruts.jsp" />

<forward name="success" path="/processStruts.jsp"

redirect="true" />

</global-forwards>

3. 配置 ActionMapping。

<action path="/process" type="actions.ProcessAction" name="pizzaForm" scope="session" input="/pizzaStruts.jsp" validate="true">解释如下：

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

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

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

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

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

· validate="true"，指明在 Action 处理表单数据前，需要验证表单数据。本例就是使用 Validator 框架对表单数据进行验证。

<action-mappings>

<!-- The action mappings -->

<action path="/process" type="actions.ProcessAction"

name="pizzaForm" scope="session" input="/pizzaStruts.jsp"

validate="true">

</action>

</action-mappings>

4. 配置默认资源文件

<message-resources parameter="resources.messages" />

5. 配置其它的资源文件，必须指定 key

<message-resources parameter="resources.sql" key="sql" />

6. 配置 Validator 插件，使用 Validator 框架对表单数据验证

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">

<set-property property="pathnames"

value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />

</plug-in>

· 部署运行

n 部署文件

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

\pizzaStruts.jsp

\processStruts.jsp

\WEB-INF\web.xml

\WEB-INF\struts-config.xml

\WEB-INF\validation.xml

\WEB-INF\validator-rules.xml

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

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

\WEB-INF\classes\resources\messages.properties

\WEB-INF\classes\resources\messages_en.properties

\WEB-INF\classes\resources\sql.properties

n 启动 Tomcat，启动 Mysql

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

n 不输入任何数据，点击"下订单"按钮，查看错误信息。

n 输入合法数据，点击"下订单"按钮，查看订单的详细信息。

n 打开 IE 浏览器的"工具"->Internet 选项…->语言，添加一个英语(美国)，并上移到顶部，如下图。确定后关闭 IE 浏览器

n 打开一个新的 IE 浏览器，输入：<http://localhost:8080/strutstest/pizzaStruts.jsp>，看看国际化的效果。