- 浏览: 20456 次
- 性别:
- 来自: 上海
文章分类
最新评论
Struts 2与AJAX(第三部分)
http://www.35java.com/zhibo/forum.php?mod=viewthread&tid=371&extra=page%3D3
什么是DWR DWR(Direct Web Remoting)是在Java EE中较流行的AJAX框架,它的最大优势就是可以像使用本地的Javascript函数一样,调用服务器上的Java方法。如下图所示:
图1 DWR工作原理
其实DWR原理也不复杂,它先在web.xml中配置一个Servlet,映射到特定的路径(通常是%CONTEXT_PATH%/dwr/*)。这个Servlet的作用就是初始化要暴露给Javascript调用的Java类(通过dwr.xml进行配置),并生成相应的代理的Javascript类代码。在XHR请求到来的时候,Servlet负责将请求的参数变成对应的Java对象,并以其为参数调用目标Java方法,并将返回值转化为Javascript代码。详情请参考:http://getahead.ltd.uk/dwr/
Struts 2与DWR 在Struts 2.0.x中使用DWR实现AJAX表单校验。在大家掌握了DWR的原理后,下面我想详细介绍一下实现的步骤。
首先,到以下站点https://dwr.dev.java.net/files/documents/2427/47455/dwr.jar下载DWR的1.1.4版本的JAR包。需要注意的是,DWR虽然已经发布2.0版本,但它与1.1.4有很大的区别,所以请大家不要使用2.0版本,否则会出现异常的;
接着,新建WEB工程,将下图所示的JAR包加入到工程的“Build Path”中;
图2 依赖的JAR包
接下来,配置web.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4"
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 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts 2 AJAX Part 3</display-name>
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ActionContextCleanUp
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 开始DWR配置 -->
<servlet>
<servlet-name>dwr</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<!-- 结束DWR配置 -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
清单1 WebContent/WEB-INF/web.xml 然后是DWR的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- START SNIPPET: dwr -->
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
<allow>
<create creator="new" javascript="validator">
<param name="class" value="org.apache.struts2.validators.DWRValidator"/>
</create>
<convert converter="bean" match="com.opensymphony.xwork2.ValidationAwareSupport"/>
</allow>
<signatures>
<![CDATA[
import java.util.Map;
import org.apache.struts2.validators.DWRValidator;
DWRValidator.doPost(String, String, Map<String, String>);
]]>
</signatures>
</dwr>
<!-- END SNIPPET: dwr -->
清单2 WebContent/WEB-INF/dwr.xml 通过以上配置,我们可以将DWRValidator中的方法暴露为Javascript可以调用的远程接口。
在正确完成以上步骤之后,我们发布运行一下应用程序,在浏览器地址栏中输入http://localhost:8080/Struts2_Ajax3/dwr/,应该会出现如下页面:
图3 DWR Servlet默认输出页面
接下来,我们要开始编写Action类了,代码如下:
package tutorial;
import com.opensymphony.xwork2.ActionSupport;
public
class AjaxValidation extends ActionSupport {
private
static
final
long serialVersionUID =
-7901311649275887920L;
private String name;
private String password;
private
int age;
public
int getAge() {
return age;
}
public
void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public
void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public
void setPassword(String password) {
this.password = password;
}
@Override
public String execute() {
return SUCCESS;
}
}
清单3 src/tutorial/AjaxValidation.java 上述代码一目了然,相信大家已经很熟悉了。下面,我们再来看看表单校验的配置代码:
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<validator type="regex">
<param name="fieldName">password</param>
<param name="expression">
<![CDATA[(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,10})$]]>
</param>
<message>Password must be between 8 and 10 characters, contain at least one digit and one alphabetic character, and must not contain special characters</message>
</validator>
<field name="name">
<field-validator type="requiredstring">
<message>You must enter a name</message>
</field-validator>
</field>
<field name="age">
<field-validator type="int">
<param name="min">18</param>
<param name="max">127</param>
<message>Age must be between 18 and 127</message>
</field-validator>
</field>
</validators>
清单4 src/tutorial/AjaxValidation-validation.xml 对于AjaxValidation类的name、password和age三个字段,我分别用了非空、正规表达式和范围验证。正规表达式(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,10})$的作用是保证密码由至少包括一个数字和一个字母,且不能含有符号的长度为8到10的字符串组成。它也是所谓强密码(Strong Password)的普通实现。
接下来的是JSP的代码,内容如下:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Struts 2 AJAX - Validation</title>
<s:head theme="ajax"
/>
</head>
<body>
<h2>
AJAX Validation Using DWR
</h2>
<s:form method="post" validate="true" theme="ajax">
<s:textfield label="Name" name="name"
/>
<s:password label="Password" name="password"
/>
<s:textfield label="Age" name="age"
/>
<s:submit />
</s:form>
</body>
</html>
清单5 WebContent/AjaxValidation.jsp 以上代码也不复杂,不过需要的是注意的是除了要加入<s:head theme="ajax" />外,<s:form />也必须加入validate="true" theme="ajax"的属性。
最后是Struts 2的配置文件,内容如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="Struts2_AJAX_DEMO" extends="struts-default">
<action name="AjaxValidation" class="tutorial.AjaxValidation">
<result name="input">AjaxValidation.jsp</result>
<result>AjaxValidation.jsp</result>
</action>
</package>
</struts>
清单6 src/struts.xml 最后发布运应用程序,在浏览器地址栏中输入http://localhost:8080/Struts2_Ajax3/AjaxValidation!input.action出现如下图所示页面:
图4 AjaxValidation页面输出
在文本框中输入错误的值使页面出现错误提示信息,如下图所示:
图5 AjaxValidation页面错误提示
可能有朋友会问怎么知道这是通过AJAX进行校验的呢?在这里我向大家推荐一个AJAX开发必备的工具——Firebug。Firebug是Firefox的一个功能强大的插件,它可以准确地输出和定位Javascript的错误、通过直观的方式查看HTML文档的DOM及其样式、所见即所得的编辑方式,更值得一赞的是它可以方便地对Javascript进行跟踪和调试,如果你希望这进一步了解这个工具,请安装Firefox 2.0以上版本,并使用它浏览以下网址http://www.getfirebug.com。
在安装完成Firebug之后,在Firefox中打开http://localhost:8080/Struts2_Ajax3/AjaxValidation!input.action,按“F12”键找开Firebug窗口,如果你第一次使用Firebug,请点击其窗口中的链接“Enable Firebug”激活插件。之后,点击“Net”,并在出现的菜单中点击选中“XHR”。然后将光标移入文本框,再将光标移出使文本框失去焦点,你可以看到Firebug窗口会多出一项记录,如下图所示:
图6 Firebug中查看XHR请求
这就证明你在文本框失去焦出时,Struts 2会发送XHR请求到服务器以对该文本框值进行校验。有兴趣的朋友可以通过Firebug,研究XHR的请求与响应,这样可以加深对DWR工作原理的理解。
何时使用AJAX表单校验 虽然在Struts 2实现AJAX表单校验是一件非常简单的事,但我建议大家不要在所有的场合都使用这个功能,原因可以分为以下几个方面:
什么是DWR DWR(Direct Web Remoting)是在Java EE中较流行的AJAX框架,它的最大优势就是可以像使用本地的Javascript函数一样,调用服务器上的Java方法。如下图所示:
图1 DWR工作原理
其实DWR原理也不复杂,它先在web.xml中配置一个Servlet,映射到特定的路径(通常是%CONTEXT_PATH%/dwr/*)。这个Servlet的作用就是初始化要暴露给Javascript调用的Java类(通过dwr.xml进行配置),并生成相应的代理的Javascript类代码。在XHR请求到来的时候,Servlet负责将请求的参数变成对应的Java对象,并以其为参数调用目标Java方法,并将返回值转化为Javascript代码。详情请参考:http://getahead.ltd.uk/dwr/
Struts 2与DWR 在Struts 2.0.x中使用DWR实现AJAX表单校验。在大家掌握了DWR的原理后,下面我想详细介绍一下实现的步骤。
首先,到以下站点https://dwr.dev.java.net/files/documents/2427/47455/dwr.jar下载DWR的1.1.4版本的JAR包。需要注意的是,DWR虽然已经发布2.0版本,但它与1.1.4有很大的区别,所以请大家不要使用2.0版本,否则会出现异常的;
接着,新建WEB工程,将下图所示的JAR包加入到工程的“Build Path”中;
图2 依赖的JAR包
接下来,配置web.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4"
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 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts 2 AJAX Part 3</display-name>
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ActionContextCleanUp
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 开始DWR配置 -->
<servlet>
<servlet-name>dwr</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
<!-- 结束DWR配置 -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
清单1 WebContent/WEB-INF/web.xml 然后是DWR的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- START SNIPPET: dwr -->
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
"http://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
<allow>
<create creator="new" javascript="validator">
<param name="class" value="org.apache.struts2.validators.DWRValidator"/>
</create>
<convert converter="bean" match="com.opensymphony.xwork2.ValidationAwareSupport"/>
</allow>
<signatures>
<![CDATA[
import java.util.Map;
import org.apache.struts2.validators.DWRValidator;
DWRValidator.doPost(String, String, Map<String, String>);
]]>
</signatures>
</dwr>
<!-- END SNIPPET: dwr -->
清单2 WebContent/WEB-INF/dwr.xml 通过以上配置,我们可以将DWRValidator中的方法暴露为Javascript可以调用的远程接口。
在正确完成以上步骤之后,我们发布运行一下应用程序,在浏览器地址栏中输入http://localhost:8080/Struts2_Ajax3/dwr/,应该会出现如下页面:
图3 DWR Servlet默认输出页面
接下来,我们要开始编写Action类了,代码如下:
package tutorial;
import com.opensymphony.xwork2.ActionSupport;
public
class AjaxValidation extends ActionSupport {
private
static
final
long serialVersionUID =
-7901311649275887920L;
private String name;
private String password;
private
int age;
public
int getAge() {
return age;
}
public
void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public
void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public
void setPassword(String password) {
this.password = password;
}
@Override
public String execute() {
return SUCCESS;
}
}
清单3 src/tutorial/AjaxValidation.java 上述代码一目了然,相信大家已经很熟悉了。下面,我们再来看看表单校验的配置代码:
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<validator type="regex">
<param name="fieldName">password</param>
<param name="expression">
<![CDATA[(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,10})$]]>
</param>
<message>Password must be between 8 and 10 characters, contain at least one digit and one alphabetic character, and must not contain special characters</message>
</validator>
<field name="name">
<field-validator type="requiredstring">
<message>You must enter a name</message>
</field-validator>
</field>
<field name="age">
<field-validator type="int">
<param name="min">18</param>
<param name="max">127</param>
<message>Age must be between 18 and 127</message>
</field-validator>
</field>
</validators>
清单4 src/tutorial/AjaxValidation-validation.xml 对于AjaxValidation类的name、password和age三个字段,我分别用了非空、正规表达式和范围验证。正规表达式(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,10})$的作用是保证密码由至少包括一个数字和一个字母,且不能含有符号的长度为8到10的字符串组成。它也是所谓强密码(Strong Password)的普通实现。
接下来的是JSP的代码,内容如下:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Struts 2 AJAX - Validation</title>
<s:head theme="ajax"
/>
</head>
<body>
<h2>
AJAX Validation Using DWR
</h2>
<s:form method="post" validate="true" theme="ajax">
<s:textfield label="Name" name="name"
/>
<s:password label="Password" name="password"
/>
<s:textfield label="Age" name="age"
/>
<s:submit />
</s:form>
</body>
</html>
清单5 WebContent/AjaxValidation.jsp 以上代码也不复杂,不过需要的是注意的是除了要加入<s:head theme="ajax" />外,<s:form />也必须加入validate="true" theme="ajax"的属性。
最后是Struts 2的配置文件,内容如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="Struts2_AJAX_DEMO" extends="struts-default">
<action name="AjaxValidation" class="tutorial.AjaxValidation">
<result name="input">AjaxValidation.jsp</result>
<result>AjaxValidation.jsp</result>
</action>
</package>
</struts>
清单6 src/struts.xml 最后发布运应用程序,在浏览器地址栏中输入http://localhost:8080/Struts2_Ajax3/AjaxValidation!input.action出现如下图所示页面:
图4 AjaxValidation页面输出
在文本框中输入错误的值使页面出现错误提示信息,如下图所示:
图5 AjaxValidation页面错误提示
可能有朋友会问怎么知道这是通过AJAX进行校验的呢?在这里我向大家推荐一个AJAX开发必备的工具——Firebug。Firebug是Firefox的一个功能强大的插件,它可以准确地输出和定位Javascript的错误、通过直观的方式查看HTML文档的DOM及其样式、所见即所得的编辑方式,更值得一赞的是它可以方便地对Javascript进行跟踪和调试,如果你希望这进一步了解这个工具,请安装Firefox 2.0以上版本,并使用它浏览以下网址http://www.getfirebug.com。
在安装完成Firebug之后,在Firefox中打开http://localhost:8080/Struts2_Ajax3/AjaxValidation!input.action,按“F12”键找开Firebug窗口,如果你第一次使用Firebug,请点击其窗口中的链接“Enable Firebug”激活插件。之后,点击“Net”,并在出现的菜单中点击选中“XHR”。然后将光标移入文本框,再将光标移出使文本框失去焦点,你可以看到Firebug窗口会多出一项记录,如下图所示:
图6 Firebug中查看XHR请求
这就证明你在文本框失去焦出时,Struts 2会发送XHR请求到服务器以对该文本框值进行校验。有兴趣的朋友可以通过Firebug,研究XHR的请求与响应,这样可以加深对DWR工作原理的理解。
何时使用AJAX表单校验 虽然在Struts 2实现AJAX表单校验是一件非常简单的事,但我建议大家不要在所有的场合都使用这个功能,原因可以分为以下几个方面:
相关推荐
由于Java没有内置的JSON类,我们可以使用第三方库如Gson或Jackson来帮助解析JSON。这里以Gson为例: 1. 首先,在项目中引入Gson库: ```xml <groupId>com.google.code.gson</groupId> <artifactId>gson ...
5. `remote`标签:Struts2提供了`<s:remote>`标签来创建远程调用,它可以与服务器进行异步通信,并在响应后更新指定的DOM元素。 6. JSON(JavaScript Object Notation):在AJAX请求中,JSON是一种常见的数据交换...
#### 二、Struts 2与Ajax结合的意义 在Web 2.0时代,用户对于Web应用的体验有了更高的要求,传统的表单提交方式已经无法满足用户的即时反馈需求。而Ajax技术的出现则很好地解决了这一问题,通过在后台与服务器进行...
在实际开发中,我们可能会用到一些第三方库,比如`ajaxfileupload.js`,这是一个专门用于文件上传的JavaScript库,它简化了Ajax上传的操作,提供了一些回调函数,方便我们在上传过程中处理进度、错误等问题。...
#### 三、Struts2与jQuery的整合 在Struts2项目中集成jQuery可以显著提高用户体验。下面我们将详细介绍如何在Struts2中引入jQuery,并通过一个具体的示例来演示如何利用jQuery实现Ajax功能。 ##### 3.1 引入jQuery ...
3. Struts2 Action处理:在Struts2的Action类中,接收AJAX请求,根据请求参数执行相应的业务逻辑,比如从数据库中查询关联数据。 4. 数据处理:查询到的数据转化为JSON格式,这是AJAX请求期望的响应格式。Struts2...
在提供的PDF文档《Struts 2与AJAX(第一部分)、(第二部分)、(第三部分)》中,可能涵盖了如何配置Struts2框架以支持Ajax,以及如何在Action中处理Ajax请求,如何使用Ajax标签库创建Ajax请求,如何处理和展示Ajax...
大型门户网站是这样炼成的,本书详细介绍了以JSP 2、Struts 2、Spring 2.5、Hibernate 3.2、AJAX等主流JavaEE技术进行优化组合开发高性能大型门户网站的实践经验。针对读者的不同学习阶段,共分技术篇、实践篇与部署...
### Struts2.0与AJAX(第三部分)—— 使用DWR实现AJAX表单校验 #### 一、引言 随着Web技术的发展,AJAX作为一种新兴的技术被广泛应用于现代Web开发中,使得Web应用更加高效且用户体验更好。Struts2作为一款流行的...
Struts AJAX 文件上传是一种在Java Web开发中实现异步数据传输的技术,它结合了Struts框架和AJAX...在实际开发中,还可以结合其他技术和最佳实践,如使用第三方库如Struts2 jQuery Plugin,进一步简化文件上传的实现。
Struts2通过Action类和配置文件来定义请求映射,支持拦截器机制,能方便地集成各种插件和第三方库,例如JSON支持。 **2. JSON (JavaScript Object Notation)** JSON是一种轻量级的数据交换格式,易于人阅读和编写,...
你可以通过继承`org.apache.struts2.json.JSONResult`并覆盖`processType`方法,或者使用第三方库如Gson或Jackson来实现。 总结起来,将jQuery的AJAX与Struts2结合,可以通过JSON对象数组进行前后端的数据交互。在...
本篇文章介绍如何利用Struts2框架结合jQuery与JSON来构建一个简单的Ajax功能。 #### 一、环境搭建 1. **引入Struts2的JSON插件** 描述中提到的第一步是将Struts2的JSON插件加入到Web项目的lib目录下。这一步非常...
【标题】"hibernate+struts2+ajax的网上商城"揭示了这是一个基于Java技术栈的电子商务项目,采用Hibernate作为持久层框架,Struts2作为MVC(模型-视图-控制器)框架,以及Ajax进行异步数据交互,旨在提供高效、用户...
1. **生成验证码**:在服务器端,使用Java或者第三方库(如Apache Commons Codec)生成随机字符串,并将其转化为图像。同时,将生成的验证码字符串存储在一个会话(session)中,供后续验证使用。 2. **展示验证码*...
比如,当用户在第一级菜单中做出选择后,通过Ajax调用Struts2的Action,Action返回JSON格式的数据,这些数据随后被jQuery解析并用来填充第二级菜单。 JSON(JavaScript Object Notation)是一种轻量级的数据交换...
10. **第十章:Struts2与AJAX** - 描述Struts2与Ajax的集成,实现页面的部分刷新。 11. **第十一章:Struts2与Spring集成** - 讨论如何将Struts2与Spring框架结合,实现依赖注入和事务管理。 12. **第十二章:Struts...
根据网络在线考试系统的特点,可以将其分为前台和后台两个部分进行设计。前台主要用于考生注册和登录系统、在线考试、查询成绩以及修改个人资料等;后台主要用于管理员对考生信息、课程信息、考题信息和考生成绩信息...
在本项目"开发基于Struts Spring Hibernate Ajax的网上信息发布平台"的第三章中,我们将深入探讨这四个核心技术在构建高效、灵活的Web应用程序中的应用。Struts、Hibernate、Spring和Ajax是Java Web开发中非常重要的...
第1章 Struts 2概述,第2章 Struts 2下的HelloWorld,第3章 Struts 2基础,第4章 深入Struts 2,第5章 Struts 2的类型转换,第6章 文件的上传和下载.,第7章 Struts 2的拦截器,第8章 Struts 2的输入校验,9.2 ...