简化 Ajax 和 Java 开发,第 2 部分: 使用约定最小化设置和配置

http://tech.ddvip.com   2008年06月12日    社区交流

内容摘要:本文将展示如何使用 JSP 标准标记库(JSTL)和 JSP 标记文件实现数据绑定、页面导航和样式约定,从而简化开发和维护。您将了解如何构建带有动态属性的定制 JSP 标记,使快速更改应用程序变得更加容易。此外,本文最后一节包含了一个使用 Ajax 提交 Web 表单的示例。

  样式规则可以在 CSS 文件中定义。例如,如果想要更改 <df:textarea> 产生的每个 <textarea> 元素的边框,只需编写一个像清单 9 中那样的样式规则:

  清单 9. 定义 <textarea> 元素的默认样式

.default_textarea
  { border-color: #A0A0A0; border-style: solid; border-width: thin; }

  编写表单处理和页面导航规则

  JSF 框架有一个复杂的请求处理生命周期,它可以划分为 6 个不同的阶段。很少有开发人员能够完全理解它并进行定制。对于高流量的 Ajax 应用程序,需要使用一种更简单的 HTTP 请求处理机制,以避免过高的 CPU 开销。本节将展示如何借助 JSTL 和 JSP 标记文件轻松实现这一点。

  创建 <df:form> 组件

  form.tag 文件(如清单 10 所示)生成一个 <form> 元素,并使用 JSTL 设置嵌套标记访问的变量,在本文的后续内容中将会看到。无需像之前的 JSP 示例一样使用 dataModel 对象,标记文件拥有一个 model 属性,该属性像 JSP 标记文件的其他任何属性一样被放置到 page 作用域中。

  form.tag 文件使用 JSTL 标记 <c:set> 将它的一些属性复制到 request 作用域中,以便其他标记文件可以使用 formName、formModel 和 formAction 变量获取 name、model 和 action 属性的值。此外,formPost 变量指示 HTTP 方法是否为 POST,<jsp:useBean> 是否创建一个 HashMap 实例来存储任何处理错误。

  清单 10. form.tag 文件

<%@ attribute name="name" required="true" rtexprvalue="true" %>
<%@ attribute name="action" required="false" rtexprvalue="true" %>
<%@ attribute name="method" required="false" rtexprvalue="true" %>
<%@ attribute name="model" required="true" rtexprvalue="true"
  type="java.lang.Object"%>
<%@ tag dynamic-attributes="dynAttr" body-content="scriptless" %>
<%@ 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="formName" scope="request" value="${name}"/>
<c:set var="formModel" scope="request" value="${model}"/>
<c:if test="${!empty action}">
  <c:set var="formAction" scope="request" value="${action}"/>
</c:if>
<c:set var="formPost" scope="request"
  value="${fn:toUpperCase(pageContext.request.method) == 'POST'}"/>
<jsp:useBean id="formErrors" scope="request" class="java.util.HashMap"/>
<form name="${name}" method="POST" <dfu:attrList tag="form" map="${dynAttr}"/>>
  <jsp:doBody/>
</form>
<c:if test="${formPost && empty formErrors && !empty formAction}">
  <c:set var="forwardURL" value="${formAction}"/>
</c:if>
<c:remove var="formName" scope="request"/>
<c:remove var="formModel" scope="request"/>
<c:remove var="formAction" scope="request"/>
<c:remove var="formPost" scope="request"/>
<c:remove var="formErrors" scope="request"/>
<c:if test="${!empty forwardURL}">
  <jsp:forward page="${forwardURL}"/>
</c:if>

来源:ibm    作者:Andrei Cioroianu    责编:豆豆技术应用

正在加载评论...