如何在JSP / Servlets中执行表单验证?

时间:2012-08-20 09:39:38

标签: java jsp java-ee servlets validation

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

<%@ 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>

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

3 个答案:

答案 0 :(得分:1)

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

关于如何创建自己的标签有Sun's tutorial,虽然有点旧但内部没有那么多改变,甚至更多,它可以用于任何servlet容器,因为它是标准的一部分

我会为您提供编写简单message标记所需的线索,如果您认为自己需要,我猜您可以自行推出field个标记。

基本方法

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

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消息等。)

答案 1 :(得分:1)

只要看看你重复的内容然后统一它。您正在重复<label><input>元素。只显示一次。您只需要在<label>添加一个类,并在有消息时添加其他元素。

<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>会以任何方式出现在用户界面中。

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

我只使用<span>代替<small>,因为不鼓励使用后者。

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

答案 2 :(得分:0)

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