1. 程序描述
视图层主要由JSP网页构成,此外还包括Resource Bundle资源文件及ActionForm Bean、Validation等,这些组件提供对国际化、接收用户输入的表单数据、表单验证和错误处理等的支持。
与User的视图层有关的文件有:
userList.jsp:用户列表页面,用于具有管理权限的用户对其他用户的管理。
userForm.jsp:用户信息页面,用于对用户信息的增、删、改
UserForm.java:与用户信息表单对应的ActionForm Bean
validation.xml:对用户信息表单进行验证的配置文件
Resource Bundle资源文件,中文的就是ApplicationResource_Zh_cn.properties
default.jsp:用于复合网页的sitemesh文件
JavaScript、CSS文件
2. JSP页面
与用户相关的JSP页面包括用户列表和用户信息。head及foot等通用信息放置在head.jsp、foot.jsp中,因此userList.jsp及userForm.jsp只包含与业务相关的标签。下面介绍主要的标签功能:
<logic:messagesPresent>:判断指定的消息是否存在。若指定message属性为true,则从request范围内
检索属性key为Globals.MESSAGE_KEY的ActionMessages对象。若不指定属性,则默认检索属性key为
Globals.ERROR_KEY的ActionMessages对象。在本系统中一个检索Success消息,一个检索Error消息。
<fmt:message>:JSTL标签。用于输出Resource Bundle中的一条消息。
<bean:struts>:用于检索Struts框架内在的对象,如ActionFormBean、ActionForward、
ActionMapping。在这里用于在JSP页面上定义一个ActionForward
变量以方便其它地方的引用。forward为struts-config.xml中定义的global-forward。
<c:set>:JSTL标签。用于定义一个变量,以方便其它地方的引用。
<c:out>:JSTL标签。用于在页面上显示一个EL表达式的值,如显示<c:set>定义的变量。EL是JSTL采用的简单的表达式语言,该语言提供一个访问和操作应用程序数据的简单方式。
<c:if><c:when><c:forEach><c:choose>:JSTL标签。用于处理条件的标记,根据特定的逻辑条件来控制输出网页内容,或者循环遍历集合中的所有元素。
<display>:Display Tag的标签,用于显示控制层返回的List。可以方便的定制表格是否分页、对列排序、导出数据等。
<html:form>:用来定义HTML表单。Struts的HTML标签可以和标准的HTML元素完成相同的功能,Struts框架能够把表单中的数据自动映射到相应的ActionForm Bean中。
<html:text><html:password><html:hidden>:在表单上生成相应的HTML元素。
<html:submit><html:cancel>:在表单上生成提交按钮和取消按钮。当用户按下按钮时,将产生一个提交事
件或取消事件,由Action类捕获。本系统中<html:submit><html:cancel>的属性相同(均为
method),用户按下提交按钮或取消按钮后执行哪个方法由lookupMethods.properties决定。
<html-el:multibox>:在表单上生成HTML的CheckBox标签。html-el使用了JSTL扩展,可以使用EL表达式。
<html:messages><html:errors>:用于在网页中输出消息。<html:errors>用
于输出错误消息,本系统中用于显示表单中字段级的错误信息,<html:messages>显示全局的消息。
自定义标签:
在你最初运行ant new时,AppFuse就会根据你键入的项目名自动生成一个标签文件,在userForm.jsp中你会看到这个标签。
<YOURAPPNAME:label>:它用于显示表单输入域前的提示文本,对文本添加了一些特别的样式,如在必填项前自动加"*"号等。
<YOURAPPNAME:country>:userForm中有设置国家一项,该标签用于显示国家的下拉列表。
<YOURAPPNAME:constants>:用于在页面上显示常量类org.appfuse.Constants中的常量的值。
3. ActionForm Bean
ActionForm
Bean是Struts提供的表单数据传输对象,用于在视图层和控制层之间传递HTML表单数据。控制层可以从ActionForm
Bean中读取用户输入的表单数据,也可以把来自模型层的数据存放到ActionForm Bean中,然后把它返回给视图。
User表单的ActionForm
Bean为UserForm。UserForm继承BaseForm。BaseForm是ActionForm的子类对象,扩展了三个通用方法:
toString()、equals(Object o)
和hashCode()。并定义了一个验证,用于允许用户在点击"删除"或"取消"按钮时表单无须验证。
UserForm中定义了与用户信息表单中的字段对应的属性。
4. Validator验证框架
Validator验证框架负责数据验证,采用基于XML的配置文件来配置验证规则。其相关的文件有:
validation.xml:针对具体的Struts表单,为ActionForm配置所需的验证规则。
validator-rules.xml:框架自带文件,包含了一组通用的验证规则。
validator-rules-custom.xml:自定义验证规则。本系统中定义了验证两个指定的输入域值是否相等的规则。用于验证密码和确认密码
是否相等。其实将这个方法稍微修改一下,把“=”变为“<、>”就可以验证一个域不能大于/小于另外一个域,非常的实用。
Resource Bundle:定义验证失败时显示的提示文本。Resource Bundle 中以errors为前缀的Key绝大部分用于Validator的错误提示。
下面是在validation.xml 中配置的userForm验证规则
<form name="userForm">
<field property="username"
depends="required">
<arg0 key="userForm.username"/>
</field>
……………………………
</form>
该配置通过depends="required"定义了userForm的username字段即用户名是必填项。
<arg0 key="userForm.username"/>声明了该字段所对应的文本在Resource
Bundle中的Key。Validator会在Resource Bundle中寻找errors.required对应的文本:'{0}'
为必填项,将userForm.username对应的文本带入{0}。如用户没有填写该项,Validator会提示“'用户名' 为必填项”的消息。
validation.xml中使用正则表达式定义了一些简单的全局的规则,如电话号码的格式等。
默认情况下,Validator框架在Web服务器端执行表单验证。validator-rules.xml里已经定义了客户端JavaScript的生成规则,可以在JSP网页中生成JavaScript脚本。需要进行客户端验证时,在JSP中包含:
<html:javascript formName="userForm" cdata="false"
dynamicJavascript="true" staticJavascript="false"/>
<script type="text/javascript"
src="<c:url value="/scripts/validator.jsp"/>"></script>
并在<html:form>中定义onsubmit事件:
onsubmit="return validateUserForm(this)"
在userForm表单的提交和取消按钮中包含了onclick="bCancel=false"事件。bCancel是Validator定义的是否进行验证的变量。当用户点击删除或取消按钮时,表单无须验证,此时bCancel= true。