考虑以下两个例子:
<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
有没有人有解决方案?
答案 0 :(得分:0)
您将不得不两次引用相同的“标识符”,无论是硬编码的String
,类名还是其他任何内容。一旦进入控制器,一次进入视图。
我看到你在尝试采用更多程序化的方法,理论上这是一个好主意,但你最终必须在JSP中注入scriptlet来实现这一点。除非必要,否则最好避免这种情况。
我建议在控制器类中使用一些定义良好的常量(所以你不要在整个Java代码中硬编码Strings
)并坚持按名称引用那些String
在您的JSP中(正如您目前所做的那样)。这是大多数MVC应用程序使用的常用方法。