Web开发框架中的架构模式比较(四)

类别:VC语言 点击:0 评论:0 推荐:
页面输入验证 Validation

ASP.Net提供验证功能的服务器控件: CompareValidator验证两个控件输入之间的比较,RangeValidator检查用户的输入是否在指定的上限和下限之间;RegularExpressionValidator 控件检查输入是否与某个正则表达式所定义的模式相匹配(社会保障号、电子邮件地址、电话号码、邮政编码等);RequiredFieldValidator 控件确保用户不会略过某个输入;CustomValidator 控件创建自定义服务器和客户端验证代码。稍后会举例说明。

 

Java web框架通常会把验证规则提出来,放在一个验证规则文件里。Apache Struts提供验证两种方式。一种是重载org.apache.struts.action.ActionForm类的validate方法,一种是定义Validator Plug-In文件,validator-rules.xml。Apache Cocoon也提供了类似的验证规则文件。稍后举例说明。

 

ASP.Net的例子

       摘自.Net框架文档,其余部分省略,只保留了关于RegularExpressionValidator的部分。本例中,id为RegularExpressionValidator1的控件的ControlToValidate属性为TextBox1,所以,RegularExpressionValidator1负责验证TextBox1是否符合正则表达式"\d{5}"——5个数字。

 

             <td>

                <asp:TextBox id="TextBox1"

                     runat="server"/>

             </td>

             <td>

                <asp:RegularExpressionValidator

                     id="RegularExpressionValidator1"

                     ControlToValidate="TextBox1"

                     ValidationExpression="\d{5}"

                     Display="Static"

                     EnableClientScript="false"

                     ErrorMessage="Zip code must be 5 numeric digits"

                     runat="server"/>

             </td>

 

Apache Struts的例子

下面的例子从Apache Struts的用户文档中摘录出来。Apache Struts提供的Validation机制非常强大,能够实现基于其它输入域的条件验证,即,如果另外一个或几个输入域都符合相应的情况,那么,验证当前域是否符合某种条件。

 

<form name="dependentlistForm">

 

<field

    property="firstName" indexedListProperty="dependents"

    depends="requiredif">

  <arg0 key="dependentlistForm.firstName.label"/>

  <var>

    <var-name>field[0]</var-name>

    <var-value>lastName</var-value>

  </var>

  <var>

    <var-name>field-indexed[0]</var-name>

    <var-value>true</var-value>

  </var>

  <var>

    <var-name>field-test[0]</var-name>

    <var-value>NOTNULL</var-value>

  </var>

</field>

 

<field

    property="dob"

    indexedListProperty="dependents"

    depends="requiredif,date">

  <arg0 key="dependentlistForm.dob.label"/>

  <var>

    <var-name>field[0]</var-name>

    <var-value>lastName</var-value>

  </var>

  <var>

    <var-name>field-indexed[0]</var-name>

    <var-value>true</var-value>

  </var>

  <var>

    <var-name>field-test[0]</var-name>

    <var-value>NOTNULL</var-value>

  </var>

</field>

 

<field

    property="coverageType"

    indexedListProperty="dependents"

    depends="requiredif">

  <arg0 key="dependentlistForm.coverageType.label"/>

  <var>

    <var-name>field[0]</var-name>

    <var-value>lastName</var-value>

  </var>

  <var>

    <var-name>field-indexed[0]</var-name>

    <var-value>true</var-value>

  </var>

  <var>

    <var-name>field-test[0]</var-name>

    <var-value>NOTNULL</var-value>

  </var>

  <var>

    <var-name>field[1]</var-name>

    <var-value>insureDependents</var-value>

  </var>

  <var>

    <var-name>field-test[1]</var-name>

    <var-value>EQUAL</var-value>

  </var>

  <var>

    <var-name>field-value[1]</var-name>

    <var-value>true</var-value>

  </var>

  <var>

    <var-name>field-join</var-name>

    <var-value>AND</var-value>

  </var>

</field>

 

</form>

Apache Cocoon的例子

下面的例子是Apache Cocoon的教学程序中的文件。对id和name两个域进行验证。同时,这个文件定义了页面元素和数据库数据之间的绑定。下一节就要阐述这个问题。

 

<root>

  <parameter name="id" type="long" nullable="no"/>

  <parameter name="name" type="string" min-len="5" max-len="64"/>

 

  <constraint-set name="update">

    <validate name="name"/>

    <validate name="id"/>

  </constraint-set>

 

  <constraint-set name="add">

    <validate name="name"/>

  </constraint-set>

 

  <connection>personnel</connection>

  <table name="department">

    <keys>

      <key param="id" dbcol="id" type="int" mode="manual"/>

    </keys>

    <values>

      <value param="name" dbcol="name" type="string"/>

    </values>

  </table>

</root>

 

Database Driven Page

正如上一节最后一个例子(Apache Cocoon)所示,很多web开发框架提供页面元素和数据库字段的直接绑定。

.NET 框架包含三个便于显示大量数据的控件:Repeater 控件、DataList 控件和 DataGrid 控件。这三个控件都使用相似的数据绑定过程,绑定到DataSet、SqlDataReader或DataView。下面的代码示例从.Net框架文档摘录,显示如何将 SQL 数据库查询返回的 DataSet 绑定到 DataGrid 控件。

 

<%@ Import Namespace="System.Data" %>

<%@ Import Namespace="System.Data.SqlClient" %>

<HTML>

<script language="C#" runat="server">

   protected void Page_Load(Object Src, EventArgs E)

   {

      // Create a connection to the "pubs" SQL database located on the

      // local computer.

      SqlConnection myConnection = new SqlConnection("server=localhost;" +

         "database=pubs;Trusted_Connection=Yes");

      // Connect to the SQL database using a SQL SELECT query to get all

      // the data from the "Authors" table.

      SqlDataAdapter myCommand = new SqlDataAdapter("SELECT " +

         " * FROM Authors", myConnection);

      // Create and fill a DataSet.

      DataSet ds = new DataSet();

      myCommand.Fill(ds);

      // Bind MyDataGrid to the DataSet. MyDataGrid is the ID for the

      // DataGrid control in the HTML section.

      DataView source = new DataView(ds.Tables[0]);

      MyDataGrid.DataSource = source ;

      MyDataGrid.DataBind();

   }

</script>

 

<body>

   <%-- Display the DataGrid information in the  body of the page. --%>

   <h3><font face="Verdana">Simple SELECT to a DataGrid Control

   </font></h3>

   <%-- Display the data in a DataGrid. --%>

   <ASP:DataGrid id="MyDataGrid" runat="server"

      Width="700"

      BackColor="#ccccff"

      BorderColor="black"

      ShowFooter="false"

      CellPadding=3

      CellSpacing="0"

      Font-Name="Verdana"

      Font-Size="8pt"

      HeaderStyle-BackColor="#aaaadd"

      EnableViewState="false"

   />

</body>

</HTML> 多语言支持

多语言支持策略基本上都采取一种类似于查多本字典的模式。先举一个类比例子来说明,比如,我们有英英字典,英汉字典,英德字典,英法字典,对于一个英文单词,每本字典都有对应语言的单词,满足不同语言的用户的需要。我们把要查的英文单词称为key,所有的字典称为资源文件resource file,查出来的对应语言的单词,就是应该显示给用户的内容。、

上述模式简单而常见,不再列出例子代码,下面只进行简单的说明。

.Net框架通过一个重要的资源管理类System.Resources.ResourceManager,来管理在应用程序中使用的不同特定于区域性的资源。调用方可使用 GetObject 和 GetString 两种方法访问特定区域性的资源。这两个方法的参数都包括一个key,和一个本地语言信息。.Net的资源文件后缀是DLL。

Apache Struts项目的类org.apache.struts.util.MessageResources的getMessage方法提供了类似的功能。Apache Struts项目提供了一个扩展的HTML Tag —— Message,也起着多语言支持、本地化的作用。Struts的资源文件后缀是properties,格式按照java properties文件的格式。

Apache Cocoon项目提供了一类称为i18n的Transformer,用来实现多语言支持。常用的标记如<i18n:text>和<i18n:param>。Cocoon的多语言支持策略和前面所说的一样,应用方法也类似,但是实现方式却不一样——Cocoon采用XSLT实现多语言支持。Cocoon的资源文件后缀是xml,格式按照xml格式。看来,把xml贯彻始终者,非Cocoon莫属。

本文地址:http://com.8s8s.com/it/it1960.htm