2011-03-31 70 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