2012-01-06 27 views
1

考慮下面兩個例子:使用枚舉檢索頁面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 

有沒有人有解決方案?

+1

我不明白'$ {Bean.ERROR_MESSAGE}'比'$ {errorMessage}'更好。在這兩種情況下,您在Java和JSP中都有相同的硬編碼引用。 – skaffman 2012-01-06 22:38:13

+0

那麼,bean的名稱可能會改變。答案是使用地圖符號與枚舉的名稱作爲關鍵,但是meh。 – 2012-01-06 22:45:52

+0

「bean」名稱可能會改變是一回事。另一個是確保使用正確的名稱來檢索'bean'。當我們假設不同的程序員控制組件時,這會變得更清晰。但對我而言,我控制兩者,這只是一個純粹原則的問題。如果沒有辦法將控制器綁定到jstl,那就這樣吧。我寧願問,然後住在黑暗中。 :) – jacekn 2012-01-07 04:55:01

回答

0

您將不得不引用兩次相同的「標識符」,無論是硬編碼String,類名還是其他任何內容。一旦進入控制器,一旦進入視圖。

我知道你在哪裏試圖採取更多的程序化方法,它理論上是一個好主意,但最終你不得不在JSP中注入scriptlet來實現這一點。除非必要,否則最好避免這種情況。

我會建議使用一些良好定義的常量在你的控制器類(這樣你就不會硬編碼Strings在你的Java代碼),並堅持在JSP中按名稱引用這些String S(爲你」目前正在做)。這是大多數MVC應用程序使用的常用方法。

+0

博,感謝您的貢獻。我同意,scriptlet不是編碼的好方法。至於常量,它們與enums幾乎相同,因爲枚舉在確保使用有效值方面有一些優勢。我理解你的答案是「你已經做到了可以做到的最好的事情」 – jacekn 2012-01-07 05:23:03