最基本的方法是有一个Map<String, String>
在请求范围内,其中键表示字段名称,值表示验证错误(如果有)。
BeerDAO beerdao = new BeerDAO();
Beer beer = beerdao.getBeer(id);
request.setAttribute("beer", beer);
// ...
Map<String, String> messages = new HashMap<String, String>();
request.setAttribute("messages", messages);
// ...
String rating = request.getParameter("rating");
if (rating == null) {
messages.put("rating", "Please enter rating");
} else if (!rating.matches("\\d+")) {
messages.put("rating", "Please enter numbers only");
} else {
beer.setRating(Integer.valueOf(rating));
}
// ...
然后在视图中
<input name="rating" value="${empty messages.rating ? beer.rating : param.rating}" />
<span class="error">${messages.rating}</span>
当没有消息(因此验证已通过)时,条件表达式将显示啤酒评级,否则将显示用户提交的值作为请求参数。
无关针对具体问题,重新显示用户提交的数据而不进行 XML 转义很容易出现XSS http://en.wikipedia.org/wiki/Cross-site_scripting attacks http://ha.ckers.org/xss.html。我强烈建议安装JSTL https://stackoverflow.com/tags/jstl/info并使用fn:escapeXml() http://download.oracle.com/javaee/5/jstl/1.1/docs/tlddocs/fn/escapeXml.fn.html函数来转义值。
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<input name="rating" value="${fn:escapeXml(empty messages.rating ? beer.rating : param.rating)}" />