简化 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    责编:豆豆技术应用

正在加载评论...