Используйте c:set, чтобы установить нестроковое значение

Всякий раз, когда выполняется <c:set var="name" value="1"/>, #{name} всегда является строкой, о чем свидетельствует #{name.class}.

Есть ли способ в контексте JSF/Facelets установить атрибут области действия, который является целочисленным или длинным литеральным значением?


person GreenieMeanie    schedule 17.03.2010    source источник


Ответы (2)


EL имеет автоматическое преобразование типов. В этой статье содержится полезная информация. Однако суть в том, что вам все равно. Вы должны иметь возможность делать такие вещи, как показано ниже, если param.month на самом деле является целым числом.

<c:set var="myInteger" value="${param.month}"/>
<p>
The value of myInteger is:<c:out value="${myInteger}"/>
Perform a multiplication operation to show that the type is correct:
<c:out value="${myInteger *2}"/>
person Randy Simon    schedule 17.03.2010
comment
+1, хотя я исправил, что вы неправильно назвали это JSTL вместо EL. JSTL — это библиотека тегов, описанная здесь java.sun.com/products/ jsp/jstl/1.1/docs/tlddocs, EL — это те ${} вещи, которые описаны в этой спецификации JSP/EL: jsp.dev.java.net/spec/jsp-2_1-fr-spec-el.pdf - person BalusC; 17.03.2010
comment
Ах, мне просто нужно использовать выражение, а не литерал, так что если я сделаю value=#{1}, то это будет длинное. Мне все еще не нравится, как вы не можете контролировать, длинное это или целое. - person GreenieMeanie; 17.03.2010
comment
Спасибо, просто опечатка. Виноват. Я уже давно не на земле Явы. - person Randy Simon; 17.03.2010
comment
@GreenieMeanie: Такова природа EL, и обычно это не должно навредить. Если вам нужна безопасность типов, используйте вместо этого компоненты JSF. Если это проблема, задайте новый вопрос, как это болит, и мы предоставим решения/обходные пути. Кстати, использование JSTL в JSF не всегда считается хорошей практикой. - person BalusC; 17.03.2010
comment
@Balus: Вся эта штука с JSP/JSF/EL/JSTL/Facelets - это беспорядок, и в наши дни так сложно отслеживать точные термины и версии ... - person GreenieMeanie; 17.03.2010
comment
@GreenieMeanie: тогда этот ответ может оказаться полезным: stackoverflow.com/questions/2095397/ - person BalusC; 17.03.2010

На странице JSF xhtml я использую технику для уменьшения количества символов для ввода!

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:c="http://java.sun.com/jsp/jstl/core"
      >

    <!-- JSF ViewController of this page -->
    <c:set var="vC" value="#{optionsViewController}"/> 
...
    <h:outputText 
        value="#{vC.txtOriginator.value}"  
        rendered="#{vC.txtOriginator.protected}"
        />

вместо

<h:outputText 
    value="#{optionsViewController.txtOriginator.value}"  
    rendered="#{optionsViewController.txtOriginator.protected}"
    />

Вместо того, чтобы вводить optionsViewController более 100 типов, я пишу определение только vC переменной JSTL один раз в начале моего файла xhtml и использую ее каждый раз, когда использую optionsViewController.

ДРУГИЕ преимущества:

  1. Код xhtml короче и читабельнее.

  2. Когда я копирую некоторые строки кода с помощью Вставки/Копирования между отдельными страницами xhtml, переменная vC не должна заменяться!

person schlebe    schedule 16.08.2018