2012-01-06 29 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