JSF命令按钮在包含的JSF页面中不起作用

时间:2014-01-30 08:56:20

标签: jsf java-ee primefaces

我尝试使用Primefaces 4.0和JSF 2.2.5构建应用程序。我需要根据选择的菜单项动态加载内容。 这是我的主页:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
  xmlns:p="http://primefaces.org/ui"
  xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<title>Hello, world!</title>
</h:head>
<h:body>
<p:layout fullPage="true">
    <p:layoutUnit position="west" size="15%">
        <h:form>
            <p:commandButton value="List1" action="#{backingBean.setCurrentPage('included.xhtml')}"
                             update=":mypanel_id" process="@this"/><br/>
            <p:commandButton value="List2"/>
        </h:form>
    </p:layoutUnit>
    <p:layoutUnit position="center">
        <p:panel id="mypanel_id">
            <ui:include src="#{backingBean.page}"/>
        </p:panel>
        <p:messages autoUpdate="true" showDetail="true" showSummary="true"/>
    </p:layoutUnit>
</p:layout>
</h:body>
</html>

这包括在页面中:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
  xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
  xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Hello,world</title>
</h:head>
<h:body>
    <h:outputText value="Included page"/>
    <h:form>
        <ui:repeat value="#{backingBean.items}" var="item">
            <p:fieldset legend="item" toggleable="true">
                <h:outputText value="#{item}"/>
                <ui:param name="it" value="#{item}"/>
                <p:commandButton value="Click" style="margin-left: 50px;"
                                 actionListener="#{backingBean.actionListener}"/>
            </p:fieldset>
        </ui:repeat>
        <p:commandButton value="Test" action="#{backingBean.actionListener}"/>
    </h:form>
</h:body>
</html>

命令按钮不起作用。没有动作也没有actionListener。我做错了什么?如何使用有条件渲染的元素构建页面,例如命令按钮和字段集?

P.S。忘了说,我的bean有请求范围。

更新:

public class BackingBean {
private List<String> items;
private String currentItem;
private String page;

public BackingBean() {
    items = new ArrayList<String>();
}

public List<String> getItems() {
    if (items.size() == 0) {
        this.fillAndUpdate();
    }
    return items;
}

public void setItems(List<String> items) {
    this.items = items;
}

public void fillAndUpdate() {
    for (int i = 0; i < 5; i++) {
        items.add("Item " + String.valueOf(i));
    }
}

public String getPage() {
    return page;
}

public void setPage(String page) {
    this.page = page;
}

public void setCurrentPage(String page) {
    this.page = page;
}

public void actionListener() {
    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Test"));
}

}

已更新

确定。我发现错误(如果有人感兴趣)。因为我的bean有请求范围,当我单击右侧面板中的按钮时,我的视图已更新,但项目列表也已更新并变为空(请求范围)。现在我在会话bean中保留选定的菜单,并在视图呈现时返回该数字。

1 个答案:

答案 0 :(得分:0)

尝试在命令按钮中添加ajax="false"