Частная переменная / переменная в JSF2 / Facelets? - PullRequest
2 голосов
/ 15 июня 2011

Возможно, я не думаю правильно с точки зрения визуальных компонентов в JSF, но я думаю, что это часть моего вопроса.Мой вопрос связан с кажущимся отсутствием области видимости переменных, объявленных в JSFРеализации.

Итак, скажем, у меня есть /resources/comp/myPanel.xhtml:

<?xml version="1.0" encoding="UTF-8" ?>
<ui:component xmlns="http://www.w3.org/1999/xhtml"
              xmlns:h="http://java.sun.com/jsf/html"
              xmlns:f="http://java.sun.com/jsf/core" 
              xmlns:ui="http://java.sun.com/jsf/facelets"
              xmlns:c="http://java.sun.com/jsp/jstl/core"      
              xmlns:cc="http://java.sun.com/jsf/composite">
    <cc:interface>
    </cc:interface>
    <cc:implementation>
        <f:loadBundle var="bundle" basename="panelOnly.bundle" />

        <h:outputText value="#{bundle.myText}" />
    </cc:implementation>
</ui:component>

И есть пакет ресурсов, который загружается в этот компонент, panelOnly / bundle.properties:

myText = This is a panel resource

А затем у меня есть страница, на которой размещается компонент myPanel, mainPage.xhtml:

<?xml version="1.0" encoding="UTF-8" ?>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core" 
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:comp="http://java.sun.com/jsf/composite/comp">
    <h:body>
        <f:view>
            <f:loadBundle basename="mainPage.bundle" var="bundle" />

            <comp:myPanel />

            <h:outputText value="#{bundle.myText}" />
        </f:view>
    </h:body>
</html>

, и на главной странице загружается пакет ресурсов, mainPage / bundle.Свойства:

myText = This is a main page resource

Теперь я бы предположил, что моя страница должна отображаться как:

This is a panel resource
This is a main page resource

Но вместо этого я получаю:

This is a panel resource
This is a panel resource

И яПредположим, что это потому, что я запутал то, что символ «bundle» обозначает в моем компоненте, поэтому, когда mainPage.xhtml пытается разрешить это значение, он ищет объект «bundle» компонента, а не исходный mainPage.

Мой обходной путь на сегодняшний день - просто использовать уникальные именованные переменные в моих компонентах, которые никогда не конфликтуют с переменными на моих главных страницах.Но я бы предпочел, чтобы был способ уговорить JSF распознать что-либо, объявленное в моем компоненте как переменные локальной области видимости, а не заглушить символы вызывающего.

Я думаю, что есть и другие теги, которые можно использовать для создания переменных локальной области видимости под # {cc.attrs ...}.Если бы вы могли перечислить мои локальные параметры области видимости в своем ответе, это было бы очень полезно.Я подозреваю, что мойэто особый случай, и, возможно, нет обходного пути для этого, так как он не был разработан св уме.

Спасибо!

PS Я использую Mojarra 2.1.1 (FCS 20110408)

(отредактировано для форматирования, копирования и вставки ошибок 15.06.2011)

1 Ответ

3 голосов
/ 15 июня 2011

К сожалению, так работает <f:loadBundle>. Это однократная настройка для всего представления. И любые последующие вызовы <f:loadBundle> в том же виде просто переопределят предыдущий.

Лучше всего управлять им с помощью вспомогательного компонента.

<cc:interface componentType="myPanel">

с

@FacesComponent(value="myPanel")
public class MyPanel extends UIComponentBase implements NamingContainer {

    private ResourceBundle bundle;

    public MyPanel() {
        bundle = ResourceBundle.getBundle("panelOnly.bundle", 
            FacesContext.getCurrentInstance().getViewRoot().getLocale());
    }

    @Override
    public String getFamily() {
        return "javax.faces.NamingContainer";
    }

    public ResourceBundle getBundle() {
        return bundle;
    }

}

, который можно использовать как

<cc:implementation>
    <h:outputText value="#{cc.bundle.myText}" />
</cc:implementation>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...