2016-08-01 7 views
0

Я пытался получить «общее» диалоговое окно с функциональностью автозаполнения, чтобы работать в течение нескольких дней. Оказывается, я просто создавал MethodExpression как «неправильный путь». Поэтому я думал, что буду документировать это здесь.Создать методExpression в Java (и использовать его в JSF)

Чтобы повторить: вы хотите динамически создать методExpression, сохранить его в свойстве и использовать его на странице JSTL Template или JSF.

Например:

// Template 
<c:forEach items="#{property.subItems}" var="subitem"> 
    <ui:include src="editor.xhtml"> 
    <ui:param name="autocompleteMethod" value="#{subitem.autocompMethod}" /> 
    </ui:include> 
</c:forEach> 

// editor.xhtml 
// We're using RichFaces (unfortunately), but this is just an example 
<rich:autocomplete mode="cachedAjax" minChars="2" 
     autocompleteMethod="#{autocompleteMethod}" 
/> 
+1

Как вы думаете, это дубликат? Вопрос, который вы связали, использует определенные структуры, такие как OmniFaces и PrimeFaces, для решения проблемы. Главное здесь - как построить MethodExpression из кода. Возможно, я использую его в виджетах RichFaces, но это просто пример использования и его можно заменить. Само решение является чистым JSF и работает со всеми структурами Faces. –

ответ

0

Я нашел решение в http://javaevangelist.blogspot.co.at/2012/10/jsf-2x-tip-of-day-programmatically_20.html

public static MethodExpression createMethodExpression(String methodExpression, Class<?> expectedReturnType, Class<?>[] expectedParamTypes) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    return context.getApplication().getExpressionFactory() 
      .createMethodExpression(context.getELContext(), methodExpression, expectedReturnType, expectedParamTypes); 
} 

Вы можете создать MethodExpression и хранить его в собственность. Для RichFaces автозаполнения Подпись: List<String> autocomplete(String prefix)

@SuppressWarnings("rawtypes") // Generics use type erasure 
Class<List> retType = List.class; 
Class<?>[] paramTypes = {String.class}; 
MethodExpression autocompleteMethod = createMethodExpression("#{myBean.myAutocomplete}", retType, paramTypes); 
// In the questions example, we'd need to set a property here: 
this.autocompMethod = autocompleteMethod; 

Тогда есть apropriate поглотитель:

MethodExpression getAutocompMethod() { 
    return this.autocompMethod; 
} 

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

  • Нет связанных вопросов^_^