2011-03-31 66 views
3

我正在学习Web开发的同时,在一个小型的Servlets & JSP应用程序中工作。使用Servlet和JSP验证号码

我对jsp和servlet之间的验证和传递值有个疑问。

我有一个“啤酒”类,有一个“评级”属性(类型为double)。

加载“edit.jsp”的servlet将创建一个Beer对象并从DB加载当前值。

BeerDAO beerdao = new BeerDAO(); 
Beer beer = beerdao.getBeer(id);    
request.setAttribute("beer", beer); 

在JSP,对象被显示在下面的方式:

... 
<td class="left">Beer Name:</td> 
<td><input type="text" name="name" value="${beer.name}"/></td> 
... 
<td class="left">Rating:</td> 
<td><input type="text" name="rating" value="${beer.rating}"/></td> 
... 

现在,当我提交表单到“更新”的servlet,每个属性被验证。在“评级”属性的情况下,我将其转换为双倍。

我应该在验证中发现一个错误(即:字母,而不是数字的评分值),我想返回到用户键入的值和错误消息的表单。事情是,我需要在表单中显示请求中的啤酒对象,但我无法将“评级”值传递给它,因为它不是正确的类型。所以现在我将用户带回一个空白评级的表单。

我猜我错了。那么,验证数字并回到编辑表单的正确方法是什么?

回答

4

最基本的方法是在请求范围中有一个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转义很容易出现XSSattacks。我强烈建议安装JSTL并使用fn:escapeXml()函数来转义值。

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
... 
<input name="rating" value="${fn:escapeXml(empty messages.rating ? beer.rating : param.rating)}" /> 
+0

谢谢!你的解决方案非常漂亮。我不知道参数对象。 – robertrv 2011-03-31 22:59:24

+0

不客气。有关EL中的隐式对象的更多信息,请参阅此答案http://stackoverflow.com/questions/2113286/what-are-implicit-objects-what-does-it-mean – BalusC 2011-03-31 23:36:36