доступ к константам в JSP (без скриптлета) [дубликат]

StackOverflow https://stackoverflow.com/questions/122254

  •  02-07-2019
  •  | 
  •  

Вопрос

На этот вопрос уже есть ответ здесь:

У меня есть класс, который определяет имена различных атрибутов сеанса, например.

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».Я не могу объяснить, почему использование строкового литерала работает, а ссылка на константу — нет, хотя они имеют одинаковое значение.Помощь.....

Это было полезно?

Решение

В вашем примере это не работает, потому что ATTR_CURRENT_USER константа не видна для тегов JSTL, которые ожидают, что свойства будут предоставлены функциями получения.Я не пробовал, но самый простой способ раскрыть ваши константы — это нестандартная библиотека тегов.

Расчетное время прибытия:Старая ссылка, которую я дал, не работала.Новые ссылки можно найти в этом ответе: Константы 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

текущий пользователь

Сеанс[Constants.ATTR_CURRENT_USER]

Мне


Использование JSTL

Константы.getATTR_CURRENT_USER_FUNC()

текущий пользователь

Сеанс [Constants.getATTR_CURRENT_USER_FUNC()]

Мне

Константы.ATTR_CURRENT_USER



Другие советы

тема довольно старая, но все равно..:)

Я нашел хорошее решение — сделать константы доступными через JSTL.Вам следует подготовить карту с использованием отражения и разместить ее там, где вы хотите.

Карта всегда будет содержать все константы, которые вы определяете в классе Constants.Вы можете поместить его в 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 */ }
   }
}

Вы можете определить Constants.ATTR_CURRENT_USER как переменную с помощью c:set, как показано ниже:

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

Я использую lombok для генерации геттеров и сеттеров, так что это вполне нормально.Ваш EL выглядит так:

${bean.manager_role}

Полный код на 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.Внутри у меня есть вот это:

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

Подключите пользовательский преобразователь EL к цепочке преобразователей EL, который будет разрешать константы.EL Resolver — это расширение класса Java. javax.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