2012-05-17 3 views
3

Как мне вызвать/получить доступ к собственности управляемого компонента, когда имя компонента известно, но еще не построено?Повторное использование макета в нескольких бобах

Например:

<p:selectOneMenu value="#{eval.evaluateAsBean(bean).text}" > 
    <f:selectItems value="#{eval.evaluateAsBean(bean).values}" var="val" 
     itemLabel="#{val}" itemValue="#{val}" /> 
</p:selectOneMenu> 

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

EDIT1

Контекст

Объект состоит из списка свойств (значений). Одно свойство модифицируется с помощью специального редактора JSF, в зависимости от его типа.

Список редакторов определяется по типу объекта и отображается в форме с использованием тегов custom:include. Этот настраиваемый тег используется для динамического включения редакторов <custom:include src="#{editor.component}">. Компонент указывает на местоположение редактора JSF.

В моем примере некоторые редакторы (отображаемые в виде блоков выбора) будут использовать один и тот же символ (dynamicDropdown.xhtml). Каждый редактор имеет обработанный сеансом управляемый компонент. Я хочу повторно использовать один и тот же манекен с несколькими компонентами и передать имя компонента в dynamicDropdown.xhtml, используя фасоль param.

genericAccount.xhtml

<p:dataTable value="#{group.editors}" var="editor"> 
    <p:column headerText="Key"> 
     <h:outputText value="#{editor.name}" /> 
    </p:column> 
    <p:column headerText="Value"> 
     <h:panelGroup rendered="#{not editor.href}"> 
      <h:outputText value="#{editor.component}" escape="false" /> 
     </h:panelGroup> 
     <h:panelGroup rendered="#{editor.href}"> 
      <custom:include src="#{editor.component}"> 
       <ui:param name="bean" value="#{editor.bean}"/> 
      <custom:include> 
     </h:panelGroup> 
    </p:column> 
</p:dataTable> 

#{editor.component} ссылается на файл dynamicDropdown.xhtml.

dynamicDropdown.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.prime.com.tr/ui"> 
    <p:selectOneMenu value="#{eval.evaluateAsBean(bean).text}" > 
    <f:selectItems value="#{eval.evaluateAsBean(bean).values}" var="val" 
     itemLabel="#{val}" itemValue="#{val}" /> 
    </p:selectOneMenu> 
</ui:composition> 

eval является управляемый компонент:

@ManagedBean(name = "eval") 
@ApplicationScoped 
public class ELEvaluator { 
    ... 

    public Object evaluateAsBean(String el) { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     Object bean = context.getELContext() 
      .getELResolver().getValue(context.getELContext(), null, el); 
     return bean; 
    } 

    ... 

} 
+0

Что именно ваш конкретный вопрос/проблема? Вы, кажется, нашли решение уже, но я не вижу никаких вопросов/проблем, связанных с ним. – BalusC

+0

Я получаю это исключение для : SEVERE: javax.el.PropertyNotFoundException: /WEB-INF/editors/dynamicDropdown.xhtml @ 13,73 value = "# {eval.evaluateAsBean ('profile'). text}": Свойство 'оцениватьAsBean' не найдено по типу com.acme.client.util.ELEvaluator – Seitaridis

+0

По-видимому, ваша среда не поддерживает EL 2.2. Какую версию контейнера вы используете? Какую версию сервлета объявляет ваш 'web.xml'? – BalusC

ответ

1

Я использую сервлета API 2,5

Servlet 2.5 означает EL 2.1. Вызов методов с аргументами не поддерживается в EL 2.1. Он введен в EL 2.2, который подразумевает Servlet 3.0.

Если вы не можете перейти на совместимый с Servlet 3.0 контейнер (Tomcat 7, Glassfish 3, JBoss AS 6 и т. Д.), Тогда вам нужно обновить реализацию EL 2.1. JBoss EL - это совместимая с EL 2.1 версия, которая поддерживает те же новые функции, что и в EL 2.2.Чтобы установить его, просто падение jboss-el.jar в WebApp-х /WEB-INF/lib и добавьте следующий параметр контекста в web.xml, при условии, что вы используете Mojarra:

<context-param>  
    <param-name>com.sun.faces.expressionFactory</param-name> 
    <param-value>org.jboss.el.ExpressionFactoryImpl</param-value> 
</context-param> 
+0

Благодарим за помощь. – Seitaridis

1

если вы прошли боб с помощью JSF, например, пропусканием боба = "# {testBean}" на ваш взгляд, вы получите доступ к свойству со значением = "# {cc.attrs.bean.test}"

1

Насколько я понял, ваш вопрос <h:outputText value="#{bean.text}"/> напечатал текст объекта на ваш экран, ваш управляемый bean-компонент должен быть аннотирован как таковой при помощи @ManagedBean.

+0

Он должен делать то же, что и # {testBean.text}. – Seitaridis

+0

Прошу прощения, но для меня лично ваш вопрос очень неоднозначен, если вы дадите более точный пример и/или объяснение, я постараюсь вам помочь. –

+0

Вместо того, чтобы иметь жесткокодированный компонент в facelet, например # {testBean.text}, я хочу передать строку, представляющую имя компонента. Таким образом, я смогу передать разные имена компонентов и повторное использование одного и того же представления. – Seitaridis

Смежные вопросы