简化 Ajax 和 Java 开发,第 2 部分: 使用约定最小化设置和配置
http://tech.ddvip.com 2008年06月12日 社区交流
内容摘要:本文将展示如何使用 JSP 标准标记库(JSTL)和 JSP 标记文件实现数据绑定、页面导航和样式约定,从而简化开发和维护。您将了解如何构建带有动态属性的定制 JSP 标记,使快速更改应用程序变得更加容易。此外,本文最后一节包含了一个使用 Ajax 提交 Web 表单的示例。
<form> 元素将拥有与 <df:form> 标记相同的 HTML 属性,但 method(始终为 POST)和 action(省略以便将数据发送回相同的页面)除外。<form> 元素也会包含 <jsp:doBody> 生成的输出,该元素执行 <df:form> 与 </df:form> 之间的 JSP 代码(参见清单 11)。如果 HTTP 方法为 POST 并且没有出现错误,form.tag 文件将请求转发到其 URL 在 action 属性中指定的页面,以供进一步处理。在这之前,标记文件使用 JSTL 标记 <c:remove> 将其变量从 request 作用域删除。
清单 11. 在 JSP 页面中使用 <df:form>
<df:form name="..." model="${...}" action="...">
...
<df:textarea .../>
...
</df:form>
处理用户错误和应用程序异常
之前展示的 textarea.tag 文件不处理在设置与表单元素绑定的 JavaBean 属性时可能发生的任何异常。这个问题可以使用 setProp.tag 文件解决(如清单 12 所示),如果出现转换错误(比如 NumberFormatException),该文件会使用 JSTL 标记 <c:catch> 捕捉 JavaBean 属性的设置方法或者甚至是 <c:set> 标记可能抛出的任何异常:
清单 12. setProp.tag 文件
<%@ attribute name="name" required="true" rtexprvalue="true" %>
<%@ attribute name="array" required="false" rtexprvalue="true"
type="java.lang.Boolean" %>
<%@ attribute name="bool" required="false" rtexprvalue="true"
type="java.lang.Boolean" %>
<%@ tag body-content="empty" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="dfu" tagdir="/WEB-INF/tags/dynamic/forms/util" %>
<c:set var="propValue" value="${null}"/>
<c:if test="${formPost && empty formErrors[name]}">
<c:if test="${!array && !bool && !empty param[name]}">
<c:set var="propValue" value="${param[name]}"/>
</c:if>
<c:if test="${!array && bool}">
<c:set var="propValue" value="${!empty param[name]}"/>
</c:if>
<c:if test="${array && fn:length(paramValues[name]) > 0}">
<c:set var="propValue" value="${paramValues[name]}"/>
</c:if>
</c:if>
<c:if test="${propValue != null}">
<c:catch var="exception">
<c:set target="${formModel}" property="${name}" value="${propValue}"/>
</c:catch>
<c:if test="${exception != null}">
<dfu:addError name="${name}" msg="${exception.message}"
exception="${exception}"/>
</c:if>
</c:if>
来源:ibm 作者:Andrei Cioroianu 责编:豆豆技术应用