当前位置: 首页 > 面试题库 >

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

督嘉言
2023-03-14
问题内容

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

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>

但是我似乎无法正确理解该语法。另外,为避免在多个地方重复上述相当冗长的测试,我想将结果分配给局部(页面范围)变量,然后引用该变量。我相信我可以用做到这一点<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文字可以工作,但是当两者看起来具有相同的值时,对常量的引用却不能。帮帮我.....


问题答案:

它在您的示例中不起作用,因为该ATTR_CURRENT_USER常量对于JSTL标记不可见,因为JSTL标记期望属性由getter函数公开。我还没有尝试过,但是暴露常量的最干净的方法似乎是非标准标记库。

ETA:我给的旧链接无效。在此答案中可以找到新的链接:

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

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

当前用户

会话[Constants.ATTR_CURRENT_USER]

使用JSTL

Constants.getATTR_CURRENT_USER_FUNC()

当前用户

会话[Constants.getATTR_CURRENT_USER_FUNC()]

常数.ATTR_CURRENT_USER



 类似资料:
  • 问题内容: 我在JSP中有一个表格。我必须基于请求对象(来自servlet)填充它。如何使用Java Script访问请求对象属性,或者可以建议我其他更好的方法来动态填充表单? 问题答案: 您需要认识到Java / JSP仅仅是HTML/CSS/JS代码生产者。因此,您要做的就是让JSP像打印JavaScript变量一样打印Java变量,并且所生成的HTML / JS代码输出在语法上是有效的。 假

  • 我尝试访问一个类中的常量: 文件1。php file2.php 我使用了一些变体,如: 但总是有这样的错误: 或者 非常感谢您的任何提示!我还阅读了有关stackoverflow的其他类似问题,但没有人正确回答此问题:/ 现在更新我已经测试了以下解决方案: file2.php 或者 文件1。php 后果

  • 问题内容: 我需要知道是否存在从子模块访问父模块的方法。如果我导入子模块: 我有-是否有一些Python魔术可以从中访问模块?上课与此类似。 问题答案: 如果您已经访问了模块,则通常可以从词典中访问它。Python不会使用名称保留“父指针”,特别是因为这种关系不是一对一的。例如,使用您的示例: 如果你会注意到存在的在模块只是一个假象在里面的语句。只要您需要该模块即可。 实际上,将来的版本可能不再导

  • 问题内容: 我正在尝试用其他常量定义常量,但似乎无法完成,因为当所需常量依赖于它时,初始常量尚未准备就绪。我想确定这是否完全不可能。 目前,我有这样的常量: 后两个常数是我想要完成的 问题答案: 定义控制器,服务和其他控制器之间的依赖关系的角度方法是通过依赖关系注入(DI)。因此,如果您有一个依赖于服务B的控制器A,则必须像这样创建它。 可以看到,angular将检查serviceB依赖关系,并查

  • 我在项目中定义了一个模型类。和往常一样,它有一些私有变量和公共的获取者和设置者 假设在其他类中我使用这个模型,就像 然后person的私有变量保存值“my name”,我使用类的public getter访问变量,如 所以据我所知的人。getMark()返回私有变量名的引用,因此如果我修改局部变量“localMark”,它将影响Person类的私有变量,因此它会破坏变量的私有属性 前任: 我猜大多