使用enum检索页面bean

时间:2012-01-06 21:04:58

标签: java jsp jstl javabeans

考虑以下两个例子:

<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 个答案:

答案 0 :(得分:0)

您将不得不两次引用相同的“标识符”,无论是硬编码的String,类名还是其他任何内容。一旦进入控制器,一次进入视图。

我看到你在尝试采用更多程序化的方法,理论上这是一个好主意,但你最终必须在JSP中注入scriptlet来实现这一点。除非必要,否则最好避免这种情况。

我建议在控制器类中使用一些定义良好的常量(所以你不要在整个Java代码中硬编码Strings)并坚持按名称引用那些String在您的JSP中(正如您目前所做的那样)。这是大多数MVC应用程序使用的常用方法。