Пользовательские компоненты JSF ResponseWriter
Я знаю о методах startElement, endElement и writeAttribute в ResponseWriter. Моя проблема в том, что я хочу, например, вывести ах: commandLink, объявив его как HtmlCommandLink link = new HtmlCommandLink();
,
Как я могу вывести другие компоненты UIC, как это в моем собственном компоненте? Я мог бы также захотеть использовать некоторые компоненты RichFaces Ajax в своих компонентах, так что надеюсь, что я смогу избежать всего этого с нуля.
Редактировать: я пытаюсь создать собственную библиотеку тегов со следующим тегом <myTags:commentTree>
, У каждого комментария есть кнопка ответа, когда нажимается кнопка ответа, я создаю форму ответа под комментарием. Как только это будет выполнено, я хотел бы вывести, например, richfaces <a4j:commandButton>
составная часть. Это должно быть сделано внутри моего собственного файла тегов Java, который я призвал CommentsTreeUI.java
,
Обычно я выводю все свои элементы, которые отображают формы и кнопки с writer.startElement("input", myComponent); writer.writeAttribute("type", "button", null);
но если бы я мог вместо этого сделать, например, startElement("a4j:commandbutton", myComponent)
это поможет моему ALOT, так как он имеет все встроенные функции AJAX и т. д.
Есть какие-нибудь подсказки?
3 ответа
Эта проблема была решена путем добавления новых компонентов с помощью
HtmlCommandButton button = new HtmlCommandButton();
button.encodeAll(context);
Вы можете сделать что-то вроде этого:
HtmlCommandLink link = new HtmlCommandLink();
getChildren().add(link);
Это зависит от того, что вы хотите сделать с дочерними компонентами, хотя, например, если вы хотите, чтобы они были окружены пользовательским HTML (например, в списке HTML), вам потребуется нечто более сложное.
Один из подходов к созданию составных элементов управления заключается в использовании атрибута привязки, чтобы связать тег с вашим собственным кодом:
<f:view>
<h:form>
<h:panelGroup binding="#{compositeControlBean.panelGrid}" />
</h:form>
</f:view>
Конфигурация bean-компонента в face-config.xml:
<managed-bean>
<managed-bean-name>compositeControlBean</managed-bean-name>
<managed-bean-class>
composite.CompositeControlBean
</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
Код бина:
/**
* Configure this bean in request scope as "compositeControlBean".
*/
public class CompositeControlBean {
private transient UIComponent panelGrid;
public UIComponent getPanelGrid() {
if (panelGrid == null) {
panelGrid = createCompositePanel();
}
return panelGrid;
}
public void setPanelGrid(UIComponent panelGrid) {
this.panelGrid = panelGrid;
}
private UIComponent createCompositePanel() {
initContextMemebers();
UIComponent commandLink = createCommandLink();
String id = view.createUniqueId();
UIComponent panelGrid = application
.createComponent("javax.faces.HtmlPanelGroup");
panelGrid.setId(id);
panelGrid.setRendererType("javax.faces.Group");
panelGrid.getChildren().add(commandLink);
return panelGrid;
}
private UIComponent createCommandLink() {
// create control
String id = view.createUniqueId();
UIComponent commandLink = application
.createComponent("javax.faces.HtmlCommandLink");
commandLink.setId(id);
commandLink.setRendererType("javax.faces.Link");
// set attributes (bind to printHello method)
Map<String, Object> attributes = commandLink
.getAttributes();
MethodExpression action = expressionFactory
.createMethodExpression(elContext,
"#{compositeControlBean.printHello}",
String.class, new Class<?>[0]);
attributes.put("value", "print hello");
attributes.put("actionExpression", action);
return commandLink;
}
private transient FacesContext context;
private transient Application application;
private transient ELContext elContext;
private transient ExpressionFactory expressionFactory;
private transient UIViewRoot view;
private void initContextMemebers() {
context = FacesContext.getCurrentInstance();
application = context.getApplication();
elContext = context.getELContext();
expressionFactory = application.getExpressionFactory();
view = context.getViewRoot();
}
public String printHello() {
System.out.println("Hello");
return null;
}
}