2

目前我对可能显示错误消息的每个字段执行类似的操作:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:choose>
  <c:when test="${message == null}">
    <label>Field name</label>
    <input type="text" name="field-name">
  </c:when>
  <c:otherwise>
    <label class="error">Field name</label>
    <input type="text" name="field-name">
    <small class="error">${message}</small>
  </c:otherwise>
</c:choose>

如何干燥/改进这段代码?我不想每次在另一个领域需要它时都重复所有这些东西。

4

3 回答 3

1

如果您只是使用纯 JSP(没有任何其他框架),那么我建议您创建自己的自定义 JSP 标记。一个field标签和一个message标签。这将有点重新发明轮子,因为许多框架都提供了类似的东西,如果这只是您的唯一要求,那么您可以尝试一下。

Sun 的关于如何创建自己的标签的教程,虽然有点旧,但内部没有太大变化,而且,它可以与任何 servlet 容器一起使用,因为它是标准的一部分。

我将为您提供编写简单标签所需的线索,如果您认为需要它message,我想您可以自己制作一个。field

基本方法

开始创建一个扩展TagSupport抽象类并覆盖该doEndTag()方法的基类。message检查当前 pageContext 中是否有任何属性,如果存在,则通过标签的打印流打印该错误消息:

public class MessageTag extends TagSupport {

    public int doEndTag() {
        String message = pageContext.findAttribute("message");
        if (message != null) {
            StringBuilder output = new StringBuilder();
            output.append("<small class=\"error\">").append(message).append("</small>");
            JspWriter out = pageContext.getOut();
            out.println(output.toString());
        }
        return EVAL_PAGE;
    }

}

然后按照上一个教程中的步骤在你的 webapp 中定义标签库并在你的 JSP 中使用它:

<label>Field name</label>
<input type="text" name="field-name">
<mytags:message />

真实世界

那将是最简单的方法。但是在现实世界的场景中,您希望根据您正在验证的字段显示不同的错误消息,因此我将向name标记类添加一个属性(或类似的东西)并使其能够根据以下内容查找不同的消息该属性的值:

public class MessageTag extends TagSupport {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void release() {
        super.release();
        name = null;
    }

    public int doEndTag() {
        String lookupAttr = (name != null ? name : "message");
        String message = pageContext.findAttribute(lookupAttr);
        if (message != null) {
            StringBuilder output = new StringBuilder();
            output.append("<small class=\"error\">").append(message).append("</small>");
            JspWriter out = pageContext.getOut();
            out.println(output.toString());
        }
        return EVAL_PAGE;
    }

}

这样您就可以为每个特定字段重用您的标签:

<label>Field name</label>
<input type="text" name="field-name">
<mytags:message name="field-name" />

请注意,您还需要将属性定义添加到标签库中。

显然,您可以根据需要将其复杂化(即:添加一个style允许您显示 INFO、WARNING 或 ERROR 消息等的属性)

于 2012-08-20T11:16:10.563 回答
1

只要看看你在重复什么,然后把它统一起来。您正在重复<label>and<input>元素。只显示一次。<label>当有消息时,您只需要向 the 添加一个类和一个附加元素。

<label class="${not empty message ? 'error' : ''}">Field name</label>
<input type="text" name="field-name">
<c:if test="${not empty message}"><small class="error">${message}</small></c:if>

您甚至可以省略<c:if>altogeter,如果没有消息,则<small>根本不会以任何方式出现在 UI 中。

<label class="${not empty message ? 'error' : ''}">Field name</label>
<input type="text" name="field-name">
<small class="error">${message}</small>

我只会使用 a<span>而不是<small>因为不鼓励使用后者来达到这个目的。

<label class="${not empty message ? 'error' : ''}">Field name</label>
<input type="text" name="field-name">
<span class="error">${message}</span>
于 2012-08-21T00:34:21.953 回答
0

你必须做这样的事情<input type="text" name="user" value="user">现在读取你想要使用的表单中的值。你可以使用 setAttribute() 和 getAttribute() 方法来获取新表单中的值。

于 2012-08-20T10:04:49.233 回答