访问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.ELResolver类的Java类。
谢谢,
首先,你的语法有一个额外的“]”导致错误。
要解决这个问题,并设置一个变量,你可以这样做:
First Test
Another Test