分享
 
 
 

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

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

页面输入验证 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,来管理在应用程序中使用的不同特定于区域性的资源。调用方可使用 GetObjectGetString 两种方法访问特定区域性的资源。这两个方法的参数都包括一个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莫属。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有