这个问题已经有一个答案在这里:

我有一个类限定名称的各种会议的属性,例如

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 %>

这个运行良好,它印刷的预计价值"的电流。用户"的网页。我在失去解释为什么使用的字符串的工作原理,但引用的常不,当两个似乎有同样的价值。帮助。。...

有帮助吗?

解决方案

它的工作不在你的例子是因为 ATTR_CURRENT_USER 恒定是不可见的JSTL标签,期望性质被暴露通过吸气的功能。我没有尝试过,但是最清洁的方式来让你常看来是的 unstandard标记库.

ETA:老链接我给没有工作。新的链接中可以找到这个回答: Java常在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 />

这种产出:

使用小脚本

常数。ATTR_CURRENT_USER

电流。用户

会议[常数。ATTR_CURRENT_USER]


使用JSTL

常数。getATTR_CURRENT_USER_FUNC()

电流。用户

会议[常数。getATTR_CURRENT_USER_FUNC()]

常数。ATTR_CURRENT_USER



其他提示

本专题是很老,但是不管怎样..:)

我找到了很好的解决方案有常量可通过JSTL.你应该准备的地图利用反射,并把它任何你想要的。

该地图将总是包含所有常量定义中常类。你可以把它变成ServletContext使用监听和享有常量在JSTL,如:

${CONSTANTS["CONSTANT_NAME_IN_JAVA_CLASS_AS_A_STRING"]}


常量在这里是一个关键你用把地图入境:-)


以下是一片我的代码建立一个地图的定领域:

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 */ }
   }
}

你可以定义常数。ATTR_CURRENT_USER作为一个变量与c:设置,正如下:

<c:set var="ATTR_CURRENT_USER" value="<%=Constants.ATTR_CURRENT_USER%>" />
<c:if test="${sessionScope[ATTR_CURRENT_USER] eq null}">     
    <%-- Do somthing --%> 
</c:if> 

静电特性不是可以在EL。的解决方法,我使用的是创建一个非静态的变量分配自己的静态价值。

public final static String MANAGER_ROLE = 'manager';
public String manager_role = MANAGER_ROLE;

我用马塔兰产生吸气器和所以那是相当好。你EL看起来是这样的:

${bean.manager_role}

全代码 http://www.ninthavenue.com.au/java-static-constants-in-jsp-and-jsf-el

我迟到了来的讨论,但是我的方法是有点不同。我用一个定义的标签处理程序得到JSP页的常数值(数字或字符串)需要。这里是我怎么做:

本来我有一个类保留所有constants:

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.顶级域名。在内部,我有这样的:

<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.顶级域名的正常方式:

<%@ 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}**"/>&nbsp;
            <form:errors path="emailAddress" cssClass="error" element="span"/>
[snip]
        </stringHelper:fieldAttributes>

插一个自定义EL解决EL解决程序链,这将解决常量。EL解决程序是Java类延伸 内el。ELResolver 类。

谢谢,

首先,你语法有一个额外的"]",这是造成一种错误。

为了解决这个问题,并设置一个可变的,你会做这样的:

<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>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top