考虑下面两个例子:使用枚举检索页面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