访问JSP中的常量(没有scriptlet)

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

class Constants { public static final String ATTR_CURRENT_USER = "current.user"; } 

我想在JSP中使用这些常量来测试这些属性的存在,例如:

      

但我似乎无法让sytax正确。 另外,为了避免在多个地方重复上面相当冗长的测试,我想将结果分配给本地(页面范围)变量,并改为引用它。 我相信我可以用做到这一点,但我再次努力找到正确的语法。

更新:继续下面的建议,我试过:

  

这没用。 所以相反,我尝试替换常量的字面值。 我还将常量添加到页面的内容中,因此我可以在呈现页面时validation常量的值

   

这很好,它在页面上打印了期望值“current.user”。 我无法解释为什么使用String文字工作,但是当两个看起来具有相同的值时,对常量的引用不会。 帮帮我…..

它在您的示例中不起作用,因为JSTL标记看ATTR_CURRENT_USER常量,JSTL标记期望getter函数公开属性。 我没有尝试过,但是揭示常量的最干净的方法似乎是不标准的标记库 。

ETA:我给的旧链接没有用。 在这个答案中可以找到新的链接: JSP中的Java常量

代码片段以阐明您所看到的行为:示例类:

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

Using scriptlets

Constants.ATTR_CURRENT_USER

<%=Constants.ATTR_CURRENT_USER%>

Session[Constants.ATTR_CURRENT_USER]

<%=session.getAttribute(Constants.ATTR_CURRENT_USER)%> <%-- JSTL --%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

Using JSTL

Constants.getATTR_CURRENT_USER_FUNC()

Session[Constants.getATTR_CURRENT_USER_FUNC()]

Constants.ATTR_CURRENT_USER

<%-- Commented out, because otherwise will error: The class 'com.example.Constants' does not have the property 'ATTR_CURRENT_USER'.

cons.ATTR_CURRENT_USER

--%>

这输出:

使用scriptlet

Constants.ATTR_CURRENT_USER

当前用户

会议[Constants.ATTR_CURRENT_USER]


使用JSTL

Constants.getATTR_CURRENT_USER_FUNC()

当前用户

会话[Constants.getATTR_CURRENT_USER_FUNC()]

Constants.ATTR_CURRENT_USER


这个话题很老了,不管怎么说.. 🙂

我找到了很好的解决方案,通过JSTL提供常量。 您应该使用reflection准备地图并将其放在任何地方。

地图将始终包含您在Constants类中定义的所有常量。 你可以使用监听器将它放入ServletContext并在JSTL中享受常量,如:

 ${CONSTANTS["CONSTANT_NAME_IN_JAVA_CLASS_AS_A_STRING"]} 

CONSTANTS这里是你用于将地图放入上下文的关键:-)


以下是构建常量字段映射的代码片段:

 Map map = new HashMap(); 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 */ } } } 

您可以使用c:set将Constants.ATTR_CURRENT_USER定义为变量,如下所示:

   <%-- Do somthing --%>  

EL中无法访问静态属性。 我使用的解决方法是创建一个非静态变量,将自己分配给静态值。

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

我使用lombok来生成getter和setter,这样就可以了。 你的EL看起来像这样:

 ${bean.manager_role} 

完整代码, url为http://www.ninthavenue.com.au/java-static-constants-in-jsp-and-jsf-el

我讨论的时间比较晚,但我的方法有点不同。 我使用自定义标记处理程序为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。 在里面,我有这个:

  fieldAttributes package.path.JspFieldAttributes scriptless This tag provide HTML field attributes that CCS is unable to do.  

在JSP上,我以正常方式包含StringHelper.tld:

 <%@ taglib uri="/WEB-INF/tags/StringHelper.tld" prefix="stringHelper" %> 

最后,我使用标签并使用EL应用所需的值。

   [snip]    [snip]  

将自定义EL解析器插入EL解析器链,它将解析常量。 EL解析器是扩展javax.el.E​​LResolver类的Java类。

谢谢,

首先,你的语法有一个额外的“]”导致错误。

要解决这个问题,并设置一个变量,你可以这样做:

   

First Test

Another Test