11. Web应用程序 MVC [personne] – 版本 6
11.1. 简介
在此版本中,我们进行了以下修改:
上一版本未使用会话来在两次客户端/服务器交互之间保存数据。它采用了 Cookie 技术,即服务器将需要保存的数据发送给客户端,以便客户端在下次交互时将其发回。在新版本中,我们采用了一种类似的技术,即表单中的隐藏字段。这两种技术之间存在以下差异:
Cookie | 隐藏字段 |
- 服务器将需保存的数据项放置在文档 HTML 之前的流 HTTP 中。 | - 服务器将需保存的元素放置在文档 HTML 中。 |
- 该技术要求浏览器接受 Cookie,以便在发送 GET 或 POST 请求时将其发回给服务器。 | - 该技术要求客户端向服务器的所有请求均为 POST,以便将隐藏字段发送至服务器。 |
- 用户可通过查看浏览器接收的 Cookie 来访问存储的信息。大多数浏览器都提供此选项。 | - 用户可通过查看收到的文档 HTML 的源代码来访问存储的数据。 |
由于所有客户端调用均为 POST 类型,因此此处可采用隐藏字段技术。
11.2. Eclipse 项目
要为 Web 应用程序 [/personne6] 创建 Eclipse 项目 [mvc-personne-06],需按照第 6.2 节所述步骤复制项目 [mvc-personne-05]。
![]() | ![]() |
11.3. Web 应用程序 [personne6] 的配置
应用程序 /personne6 的文件 web.xml 如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" 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>mvc-personne-06</display-name>
...
该文件与上一版本完全相同,仅存在以下细微差异:
- 第 6 行:Web 应用程序的显示名称已更改为 [mvc-personne-06]
主页 [index.jsp] 与应用程序 [/personne5] 的主页完全相同:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<c:redirect url="/do/formulaire"/>
11.4. 视图代码
仅 [réponse, erreurs] 视图发生了变化。这些视图的表单中现在包含隐藏字段,而在之前的版本中,这些表单并未提交任何参数。
[réponse.jsp]:
...
<html>
...
<body>
...
<form name="frmPersonne" action="retourFormulaire" method="post">
<input type="hidden" name="nom" value="${nom}">
<input type="hidden" name="age" value="${age}">
</form>
<a href="javascript:document.frmPersonne.submit();">
${lienRetourFormulaire}
</a>
</body>
</html>
- 第 6-9 行:点击第 10-12 行链接时将提交至服务器的表单
- 第 6 行:POST 的目标将指向 [/do/retourFormulaire]
- 第7-8行:隐藏字段[nom]和[age]将被提交。其值${nom}和${age}将由显示[réponse.jsp]的控制器设定。这些将是表单中输入的值。
[erreurs.jsp]:
...
<html>
...
<body>
...
<form name="frmPersonne" action="retourFormulaire" method="post">
<input type="hidden" name="nom" value="${nom}">
<input type="hidden" name="age" value="${age}">
</form>
<a href="javascript:document.frmPersonne.submit();">
${lienRetourFormulaire}
</a>
</body>
</html>
修改和说明与视图 [réponse.jsp] 相同。 需要注意的是,视图 [erreurs] 的模板新增了两个元素 [nom, age],它们补充了已有的另外两个元素:[erreurs, lienRetourFormulaire]。
建议读者按照前几个版本中的原则测试这些新视图。
11.5. 控制器 [ServletPersonne]
Web 应用程序 [/personne6] 中的控制器 [ServletPersonne] 与上一版本非常相似。变化源于视图 [erreurs] 的模型发生了变更。 需要在此添加两个额外元素:[nom, age]。仅涉及用于显示该视图的方法,即方法 [doGet] 和 [doValidationFormulaire]。
11.5.1. 方法 [doGet]
[doGet] 的代码如下:
实际上,该代码与之前完全一致。在之前的版本中,[nom, age]中的元素并未被放入视图模板[erreurs]中。 如果继续不将其放入,[erreurs.jsp] 中的变量 ${nom} 和 ${age} 将被替换为空字符串。这对我们来说是可以接受的,因为在此特定情况下,链接 [Retour au formulaire] 不会显示给用户。 实际上,我们也没有将 [lienRetourFormulaire] 元素放入模板中。[erreurs.jsp] 中的变量 ${lienRetourFormulaire} 将被替换为空字符串。 因此不会生成链接,也就无法提交 [erreurs.jsp] 表单中的隐藏字段 [nom, age]。这些字段的值因此可以是空字符串。
11.5.2. 方法 [doValidationFormulaire]
其代码如下:
第 8-10 行,将 [nom, age, lienRetourFormulaire] 元素放入模板中。 已知该方法会显示 [réponse] 或 [erreurs] 其中一个视图。因此,后者将在其模板中包含 [nom,age] 元素。
11.6. 测试
将 Eclipse 项目 [personne-mvc-06] 集成到 Tomcat 后,启动或重启 Tomcat,然后访问 URL [http://localhost:8080/personne6]。

