目前我为每个可能显示错误消息的字段执行类似的操作:
<%@ 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>
如何干掉/改善这段代码?我不想每次在另一个领域需要时重复所有这些东西。
答案 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()方法
以新的形式获得价值。