Skip to content

15. 示例 12 – 各种转换与验证

新应用程序支持使用 Struts 验证器输入各种元素:

  • 在 [1] 中,输入表单
  • 在 [2] 中,输入确认

该应用程序的工作原理与之前的类似,因此我们仅对不同之处进行说明。

15.1. NetBeans 项目

NetBeans 项目结构如下:

  • 在 [1] 中,应用程序视图
  • [Accueil.jsp]:主页
  • [FormDivers.jsp]:输入表单
  • [ConfirmationFormDivers.jsp]:确认页面
  • 在 [2] 中,消息文件 [messages.properties] 和 Struts 主配置文件
  • 在 [3] 中:
  • [FormDivers.java]:用于显示和处理表单的操作
  • [FormDivers-validation.xml]:[FormDivers] 动作的验证规则。该文件将这些验证委托给模型。
  • [FormDiversModel]:[FormDivers] 操作的模型
  • [FormDiversModel-validation.xml]:模型的验证规则
  • [FormDiversModel.properties]:模型的消息文件
  • [example.xml]:辅助的 Struts 配置文件

15.2. 项目配置

该项目主要通过以下 [example.xml] 文件进行配置:


<?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="example" namespace="/example" extends="struts-default">
    <action name="Accueil">
      <result name="success">/example/Accueil.jsp</result>
    </action>
    <action name="FormDivers" class="example.FormDivers">
      <result name="input">/example/FormDivers.jsp</result>
      <result name="cancel" type="redirect">/example/Accueil.jsp</result>
      <result name="success">/example/ConfirmationFormDivers.jsp</result>
    </action>
  </package>
</struts>

这与之前版本中研究的内容类似。

15.3. 消息文件

[messages.properties] 文件内容如下:


Accueil.titre=Accueil
Accueil.message=Struts 2 - Conversions et validations
Accueil.FormDivers=Saisies diverses (email, url, chaine de caract\u00e8res avec contr\u00f4le du nombre de caract\u00e8res)
Form.titre=Conversions et validations
FormDivers.message=Struts 2 - Conversions et validations de types divers
Form.submitText=Valider
Form.cancelText=Annuler
Form.clearModel=Raz mod\u00e8le
Confirmation.titre=Confirmation
Confirmation.message=Confirmation des valeurs saisies
Confirmation.champ=champ
Confirmation.valeur=valeur
Confirmation.lien=Formulaire de test
xwork.default.invalid.fieldvalue=Valeur invalide pour le champ "{0}".

[FormDiversModel.properties] 文件内容如下:


email.prompt=1-Tapez une adresse \u00E9lectronique (x@y.z)
email.error=Format invalide
url.prompt=2-Tapez une url (http://www.ibm.com)
url.error=Format invalide
chaine.prompt=3-Tapez une chaine de 5 caract\u00E8res
chaine.error=Format invalide

15.4. 输入表单

[FormDivers.jsp] 视图如下:


<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title><s:text name="Form.titre"/></title>
    <s:head/>
  </head>
 
  <body background="<s:url value="/ressources/standard.jpg"/>">
    <h2><s:text name="FormDivers.message"/></h2>
    <s:form name="formulaire" action="FormDivers">
      <s:textfield name="email" key="email.prompt" size="30"/>
      <s:textfield name="url1" key="url.prompt" size="30"/>
      <s:textfield name="chaine" key="chaine.prompt" size="10"/>
      <s:submit key="Form.submitText" method="execute"/>
    </s:form>
    <br/>
    <s:url id="url" action="FormDivers" method="cancel"/>
    <s:a href="%{url}"><s:text name="Form.cancelText"/></s:a>
      <br/>
    <s:url id="url" action="FormDivers" method="clearModel"/>
    <s:a href="%{url}"><s:text name="Form.clearModel"/></s:a>
  </body>
</html>

第 12 至 14 行是三个输入字段。

15.5. 确认视图

确认视图 [ConfirmationFormDivers.jsp] 如下所示:


<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <title><s:text name="Confirmation.titre"/></title>
    <s:head/>
  </head>
 
  <body background="<s:url value="/ressources/standard.jpg"/>">
    <h2><s:text name="Confirmation.message"/></h2>
    <table border="1">
      <tr>
        <th><s:text name="Confirmation.champ"/></th>
        <th><s:text name="Confirmation.valeur"/></th>
      </tr>
      <tr>
        <td><s:text name="email.prompt"/></td>
        <td><s:text name="email"/></td>
      </tr>
      <tr>
        <td><s:text name="url.prompt"/></td>
        <td><s:text name="url1"/></td>
      </tr>
      <tr>
        <td><s:text name="chaine.prompt"/></td>
        <td><s:text name="chaine"/></td>
      </tr>
     </table>
    <br/>
    <s:url id="url" action="FormDivers!input"/>
    <s:a href="%{url}"><s:text name="Confirmation.lien"/></s:a>
  </body>
</html>

15.6. [FormDiversModel] 模板

来自 [FormDivers.jsp] 表单的输入字段被注入到以下 [FormDiversModel] 模板中:


package example;
 
public class FormDiversModel {
 
  // constructor without parameters
  public FormDiversModel() {
  }
 
  // fields
  private String email;
  private String url1 ;
  private String chaine;
 
    // raz model
  public void clearModel() {
    email = null;
    url1 = null;
    chaine = null;
  }
 
  // getters and setters
   ...
}

15.7. 模型验证

模型验证由两个文件控制:[FormDivers-validation.xml] 和 [FormDiversModel-validation.xml]。

[FormDivers-validation.xml] 文件将验证任务委托给以下 [FormDiversModel-validation.xml] 文件:


<!--
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//
EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-->
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//
EN" "http://localhost:8084/exemple-10/example/xwork-validator-1.0.2.dtd">
 
<validators>
  <field name="model" >
    <field-validator type="visitor">
      <param name="appendPrefix">false</param>
      <message/>
    </field-validator>
  </field>
</validators>

我们已经遇到过这个文件。

[FormDateModel-validation.xml] 文件包含以下验证规则:


<!--
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//
EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-->
 
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//
EN" "http://localhost:8084/exemple-12/example/xwork-validator-1.0.2.dtd">
 
<validators>
 
  <field name="email" >
    <field-validator type="requiredstring" short-circuit="true">
      <message key="email.error"/>
    </field-validator>
    <field-validator type="email" short-circuit="true">
      <message key="email.error"/>
    </field-validator>
  </field>
 
  <field name="url1" >
    <field-validator type="requiredstring" short-circuit="true">
      <message key="url.error"/>
    </field-validator>
    <field-validator type="url" short-circuit="true">
      <message key="url.error"/>
    </field-validator>
  </field>
 
  <field name="chaine" >
    <field-validator type="requiredstring" short-circuit="true">
      <message key="chaine.error"/>
    </field-validator>
    <field-validator type="stringlength" short-circuit="true">
      <param name="minLength">5</param>
      <param name="maxLength">5</param>
      <message key="chaine.error"/>
    </field-validator>
  </field>
 
</validators>
  • 第 11–18 行:检查电子邮件字段的有效性
  • 第 15–17 行:验证电子邮件字符串是否为有效的电子邮件地址
  • 第 20–27 行:验证 url1 字段的有效性
  • 第 24–26 行:验证 url1 字符串是否为有效的 URL
  • 第 29–38 行:检查 chaine 字段的有效性
  • 第 33–37 行:验证字符串 chaine 的长度是否恰好为 5 个字符。

15.8. [FormDivers] 操作

[FormDivers] 操作如下:


package example;
 
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.interceptor.validation.SkipValidation;
 
public class FormDivers extends ActionSupport implements ModelDriven, SessionAware {
 
  // constructor without parameters
  public FormDivers() {
  }
 
  // action model
  public Object getModel() {
    if (session.get("model") == null) {
      session.put("model", new FormDiversModel());
    }
    return session.get("model");
  }
 
  @SkipValidation
  public String clearModel() {
    // close to the model
    ((FormDiversModel) getModel()).clearModel();
    // result
    return INPUT;
  }
 
  public String cancel() {
    // cleaning the model
    ((FormDiversModel) getModel()).clearModel();
    // result
    return "cancel";
  }
 
  // SessionAware
  Map<String, Object> session;
 
  public void setSession(Map<String, Object> session) {
    this.session = session;
  }
}

[FormDivers] 操作基于与之前讨论的操作相同的模型构建。这里只是没有 validate 方法,因为验证工作已由 [FormDiversModel-validation.xml] 文件完成。