JSF обращается к объекту карты поддержки - PullRequest
1 голос
/ 22 ноября 2011

У меня есть страница подпредставления jsp, которой я передал параметр, и я хочу затем передать этот параметр методу get () карты, который хранится в сессионном компоненте.

Ex:

<h:panelGrid id="panelGrid1" rendered="#{MySessionBean[param.id].showPanelGrid1}">
...
</h:panelGrid>

В приведенном выше примере MySessionBean реализует интерфейс Map, и у меня есть собственный метод get, который создаст объект и поместит его в карту, если для ключа [params.id] не существует ни одного. Когда я запускаю код в режиме отладки, мой метод get для MySessionBean никогда не вызывается, и моя панель всегда отображается. Я неправильно передаю параметры? Или доступ к параметру, переданному в подкорректную корректировку?

Вот как я передал параметр этому подпредставлению:

<f:subview id="subview1">
  <jsp:include page="/MyTemplatePage.jsp">
    <jsp:param name="id" value="staticUniqueId1"/>
  </jsp:include>
</f:subview>

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

Также я ограничен JSF 1.2, JSTL 1.1, JBoss 4.0.4. Поэтому я не могу использовать ответы, которые используют RichFaces или JSF 2.

РЕДАКТИРОВАНИЕ: 22.11.11 11: 23

Я заменил [param.id] статическим строковым значением.

<h:panelGrid id="panelGrid1" rendered="#{MySessionBean.MY_TEMP_VAL.showPanelGrid1}">
  ...
</h:panelGrid>

И все заработало. Это вызвало мой метод получения карты и доступ к сессионным компонентам и всему прочему. Так что это явно не нравится всему, используя [params.id], передавая объект карты. Не уверен, что делать отсюда.

1 Ответ

2 голосов
/ 23 ноября 2011

В JSF2 правильным и простым решением будет использование композитных компонентов. Поскольку вы застряли с JSF 1.2 и jsp, вы можете вместо этого использовать tag files . Они похожи на обычные jsps, но с расширением tag или tagx и расположены под WEB-INF/tags. Я использую синтаксис xml в примере ниже, в имени файла example.tagx:

<jsp:root version="2.1"
          xmlns:jsp="http://java.sun.com/JSP/Page"
          xmlns:h="http://java.sun.com/jsf/html">
    <jsp:directive.attribute name="myBean"
                             required="true"
                             rtexprvalue="false"
                             deferredValue="true"
                             deferredValueType="com.example.MyBean"/>
    <h:panelGrid id="panelGrid1" rendered="#{myBean.showPanelGrid1}">
    ...
    </h:panelGrid>
</jsp:root>

В jspx вы должны объявить пространство имен как xmlns:myTags="urn:jsptagdir:/WEB-INF/tags/", в jsp синтаксис будет:

<%@taglib tagdir="/WEB-INF/tags" prefix="myTags" %>

Затем пользовательский тег можно использовать на странице несколько раз, а правый компонент поддержки можно передать в виде атрибута, подобного этому:

<myTags:example myBean="#{myBeanInstance1}" />

Редактировать: Вам также может понадобиться файл WEB-INF/tags/implicit.tld, чтобы указать версию:

<?xml version = '1.0' encoding = 'UTF-8'?>
<taglib xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
        version="2.1" xmlns="http://java.sun.com/xml/ns/javaee">
        <tlib-version>2.1</tlib-version>
</taglib>
...