我有一个定义各种会话属性名称的类,例如
class Constants {
public static final String ATTR_CURRENT_USER = "current.user";
}
我想在JSP中使用这些常量来测试这些属性的存在,例如:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="com.example.Constants" %>
<c:if test="${sessionScope[Constants.ATTR_CURRENT_USER] eq null}">
<%-- Do somthing --%>
</c:if>
但我似乎无法使sytax正确。另外,为了避免在多个地方重复上面相当冗长的测试,我想将结果分配给本地(页面范围)变量,并改为引用它。我相信我可以用<c:set>
做到这一点,但我再次努力寻找正确的语法。
更新:根据以下建议,我尝试了:
<c:set var="nullUser" scope="session"
value="${sessionScope[Constants.ATTR_CURRENT_USER] eq null}" />
哪个不起作用。所以相反,我尝试替换常量的字面值。我还将常量添加到页面的内容中,因此我可以在呈现页面时验证常量的值
<c:set var="nullUser" scope="session"
value="${sessionScope['current.user'] eq null}" />
<%= "Constant value: " + WebHelper.ATTR_CURRENT_PARTNER %>
这很好用,它在页面上打印了期望值“current.user”。我无法解释为什么使用String文字工作,但是当两个看起来具有相同的值时,对常量的引用不会。帮助.....
答案 0 :(得分:12)
它在您的示例中不起作用,因为ATTR_CURRENT_USER
常量对JSTL标记不可见,JSTL标记期望getter函数公开属性。我没有尝试过,但揭露常量的最简洁方法似乎是unstandard tag library。
ETA:我给的旧链接没有用。可在此答案中找到新链接:Java constants in JSP
代码段以澄清您所看到的行为: 样本类:
package com.example;
public class Constants
{
// attribute, visible to the scriptlet
public static final String ATTR_CURRENT_USER = "current.user";
// getter function;
// name modified to make it clear, later on,
// that I am calling this function
// and not accessing the constant
public String getATTR_CURRENT_USER_FUNC()
{
return ATTR_CURRENT_USER;
}
}
JSP页面的片段,显示示例用法:
<%-- Set up the current user --%>
<%
session.setAttribute("current.user", "Me");
%>
<%-- scriptlets --%>
<%@ page import="com.example.Constants" %>
<h1>Using scriptlets</h1>
<h3>Constants.ATTR_CURRENT_USER</h3>
<%=Constants.ATTR_CURRENT_USER%> <br />
<h3>Session[Constants.ATTR_CURRENT_USER]</h3>
<%=session.getAttribute(Constants.ATTR_CURRENT_USER)%>
<%-- JSTL --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<jsp:useBean id="cons" class="com.example.Constants" scope="session"/>
<h1>Using JSTL</h1>
<h3>Constants.getATTR_CURRENT_USER_FUNC()</h3>
<c:out value="${cons.ATTR_CURRENT_USER_FUNC}"/>
<h3>Session[Constants.getATTR_CURRENT_USER_FUNC()]</h3>
<c:out value="${sessionScope[cons.ATTR_CURRENT_USER_FUNC]}"/>
<h3>Constants.ATTR_CURRENT_USER</h3>
<c:out value="${sessionScope[Constants.ATTR_CURRENT_USER]}"/>
<%--
Commented out, because otherwise will error:
The class 'com.example.Constants' does not have the property 'ATTR_CURRENT_USER'.
<h3>cons.ATTR_CURRENT_USER</h3>
<c:out value="${sessionScope[cons.ATTR_CURRENT_USER]}"/>
--%>
<hr />
输出:
current.user
我
current.user
我
答案 1 :(得分:4)
这个话题已经很老了,但无论如何......:)
我找到了很好的解决方案,可以通过JSTL获得常量。您应该使用反射准备地图并将其放在任何地方。
地图将始终包含您在Constants类中定义的所有常量。您可以使用侦听器将其放入ServletContext中,并在JSTL中享受常量,如:
${CONSTANTS["CONSTANT_NAME_IN_JAVA_CLASS_AS_A_STRING"]}
CONSTANTS这里是你用于将地图放入上下文的关键:-)
以下是我的代码构建常量字段的映射:
Map<String, Object> map = new HashMap<String, Object>();
Class c = Constants.class;
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
int modifier = field.getModifiers();
if (Modifier.isPublic(modifier) && Modifier.isStatic(modifier) && Modifier.isFinal(modifier)) {
try {
map.put(field.getName(), field.get(null));//Obj param of get method is ignored for static fields
} catch (IllegalAccessException e) { /* ignorable due to modifiers check */ }
}
}
答案 2 :(得分:4)
您可以使用c:set将Constants.ATTR_CURRENT_USER定义为变量,如下所示:
<c:set var="ATTR_CURRENT_USER" value="<%=Constants.ATTR_CURRENT_USER%>" />
<c:if test="${sessionScope[ATTR_CURRENT_USER] eq null}">
<%-- Do somthing --%>
</c:if>
答案 3 :(得分:1)
将自定义EL解析器插入EL解析器链,这将解析常量。 EL解析器是扩展javax.el.ELResolver类的Java类。
谢谢,
答案 4 :(得分:1)
EL中无法访问静态属性。我使用的解决方法是创建一个非静态变量,将自己分配给静态值。
public final static String MANAGER_ROLE = 'manager';
public String manager_role = MANAGER_ROLE;
我使用lombok来生成getter和setter,这样就可以了。你的EL看起来像这样:
${bean.manager_role}
http://www.ninthavenue.com.au/java-static-constants-in-jsp-and-jsf-el
的完整代码答案 5 :(得分:1)
我讨论迟到了,但我的方法有点不同。我使用自定义标记处理程序为JSP页面提供所需的常量值(数字或字符串)。我是这样做的:
假设我有一个保留所有常量的类:
public class AppJspConstants implements Serializable {
public static final int MAXLENGTH_SIGNON_ID = 100;
public static final int MAXLENGTH_PASSWORD = 100;
public static final int MAXLENGTH_FULLNAME = 30;
public static final int MAXLENGTH_PHONENUMBER = 30;
public static final int MAXLENGTH_EXTENSION = 10;
public static final int MAXLENGTH_EMAIL = 235;
}
我也有这个非常简单的自定义标签:
public class JspFieldAttributes extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
getJspContext().setAttribute("maxlength_signon_id", AppJspConstants.MAXLENGTH_SIGNON_ID);
getJspContext().setAttribute("maxlength_password", AppJspConstants.MAXLENGTH_PASSWORD);
getJspContext().setAttribute("maxlength_fullname", AppJspConstants.MAXLENGTH_FULLNAME);
getJspContext().setAttribute("maxlength_phonenumber", AppJspConstants.MAXLENGTH_PHONENUMBER);
getJspContext().setAttribute("maxlength_extension", AppJspConstants.MAXLENGTH_EXTENSION);
getJspContext().setAttribute("maxlength_email", AppJspConstants.MAXLENGTH_EMAIL);
getJspBody().invoke(null);
}
}
然后我有一个StringHelper.tld。在里面,我有这个:
<tag>
<name>fieldAttributes</name>
<tag-class>package.path.JspFieldAttributes</tag-class>
<body-content>scriptless</body-content>
<info>This tag provide HTML field attributes that CCS is unable to do.</info>
</tag>
在JSP上,我以正常方式包含StringHelper.tld:
<%@ taglib uri="/WEB-INF/tags/StringHelper.tld" prefix="stringHelper" %>
最后,我使用标签并使用EL应用所需的值。
<stringHelper:fieldAttributes>
[snip]
<form:input path="emailAddress" cssClass="formeffect" cssErrorClass="formEffect error" maxlength="**${maxlength_email}**"/>
<form:errors path="emailAddress" cssClass="error" element="span"/>
[snip]
</stringHelper:fieldAttributes>
答案 6 :(得分:-2)
首先,你的语法有一个额外的“]”,这导致了一个错误。
要解决这个问题,并设置一个变量,你可以这样做:
<c:set var="nullUser"
scope="session"
value="${sessionScope[Constants.ATTR_CURRENT_USER] eq null}" />
<c:if test="${nullUser}">
<h2>First Test</h2>
</c:if>
<c:if test="${nullUser}">
<h2>Another Test</h2>
</c:if>