考慮下面兩個例子:使用枚舉檢索頁面Bean
<c:if test="${errorMessage!=null}">
Welcome <c:out value="${homePageBean.currentUserName}"/>
當我看看Spring控制器來啓用JSTL,JSP溝通的例子,我注意到程序員在控制器硬編碼的模型對象的名稱和然後在JSP中硬編碼相同的名稱。我試圖找到一個更好的方式來做到這一點。
我創建了一個包含模型對象名稱的枚舉。
public enum Bean {
ERROR_MESSAGE("errorMessage"),
LOGIN_PAGE_BEAN("loginPageBean"),
HOME_PAGE_BEAN("homePageBean");
private String beanId;
private Bean(String beanId) {
this.beanId=beanId;
}
public String getBeanId() {
return beanId;
}
}
所以在我的控制,而不是硬編碼對象的名字,我只是這樣做:
String errorMessage=failedAttempt?"login.invalidUserNameOrPassword":null;
model.put(Bean.ERROR_MESSAGE.getBeanId(), errorMessage);
但無論我如何努力,我不能似乎能夠通過使用Bean.ERROR_MESSAGE.getBeanId()
來檢索jsp中的這個「bean」。
<c:out value="${errorMessage}" /> // works but uses hardcoded name
<c:out value="${Bean.ERROR_MESSAGE.getBeanId()}" /> // doesn't work
<c:out value="${<%=Bean.ERROR_MESSAGE.getBeanId()%>}" /> // doesn't compile
有沒有人有解決方案?
我不明白'$ {Bean.ERROR_MESSAGE}'比'$ {errorMessage}'更好。在這兩種情況下,您在Java和JSP中都有相同的硬編碼引用。 – skaffman 2012-01-06 22:38:13
那麼,bean的名稱可能會改變。答案是使用地圖符號與枚舉的名稱作爲關鍵,但是meh。 – 2012-01-06 22:45:52
「bean」名稱可能會改變是一回事。另一個是確保使用正確的名稱來檢索'bean'。當我們假設不同的程序員控制組件時,這會變得更清晰。但對我而言,我控制兩者,這只是一個純粹原則的問題。如果沒有辦法將控制器綁定到jstl,那就這樣吧。我寧願問,然後住在黑暗中。 :) – jacekn 2012-01-07 04:55:01