Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 如何在post之后创建带有链接的JSF表_Jsf 2_Myfaces - Fatal编程技术网

Jsf 2 如何在post之后创建带有链接的JSF表

Jsf 2 如何在post之后创建带有链接的JSF表,jsf-2,myfaces,Jsf 2,Myfaces,我喜欢显示一个表单,最终用户可以在其中输入详细信息,帖子将生成一个表,其中包含基于用户输入的过滤列表。此表应该为每一行提供链接,以选择该特定行并返回详细视图 accounts-list.xhtml: <?xml version="1.0" encoding="UTF-8"?> <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns

我喜欢显示一个表单,最终用户可以在其中输入详细信息,帖子将生成一个表,其中包含基于用户输入的过滤列表。此表应该为每一行提供链接,以选择该特定行并返回详细视图

accounts-list.xhtml:

<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"
xmlns:utils="http://java.sun.com/jsf/composite/snippets" template="/WEB-INF/templates/default.xhtml">

    <ui:define name="title"></ui:define>
    <ui:define name="content">
        <h:form id="search">
            <fieldset>
                <legend>Search for account</legend>
                <div class="account_list_section">
                    <span class="account_section_title"><h:outputLabel for="id" value="Account ID" /></span>
                    <span class="account_list_item">
                        <h:inputText id="id" value="#{accountsCrudBean.searchId}" styleClass="field_inputtext_account" />
                    </span>
                </div>
                <div class="account_list_section">
                    <span class="account_section_title"><h:outputLabel for="name" value="Account Name" /></span>
                    <span class="account_list_item">
                        <h:inputText id="name" value="#{accountsCrudBean.searchName}" styleClass="field_inputtext_account" />
                    </span>
                </div>
                <h:commandButton id="search" value="Display" action="#{accountsCrudBean.actionSearch}" />
            </fieldset>
        </h:form>

        <h:form id="view" rendered="#{accountsCrudBean.dataItemId.value != null}">
            <h:dataTable var="dataItem" binding="#{accountsCrudBean.dataTable}" value="#{accountsCrudBean.list}" id="accountListTable"
                columnClasses="accountsCrudBeanTable_row_date, transactionsListTable_row_amount, transactionsListTable_row_balance, transactionsListTable_row_description" styleClass="transactionsListTable">
                <h:column headerClass="transactionsListTable_header_amount">
                    <f:facet name="header">Id</f:facet>
                    <h:commandLink value="#{dataItem.id}" action="#{accountsCrudBean.editDataItem}" />
                </h:column>
                <h:column headerClass="transactionsListTable_header_balance">
                    <f:facet name="header">Name</f:facet>#{dataItem.name}</h:column>
                <h:column headerClass="transactionsListTable_header_description">
                    <f:facet name="header">Total Balance</f:facet>#{dataItem.totalBalance}</h:column>
            </h:dataTable>
            <h:inputHidden binding="#{accountsCrudBean.dataItemId}" />
        </h:form>
    </ui:define>
</ui:composition>
这是基于

在文章中,作者使用了@RequestScoped bean,但是如果我尝试将bean更改为@RequestScoped,那么过滤器将无法工作,并且我无法获得包含链接的表


谢谢。

您的bean在会话范围内。您根本不需要
。删除它和所有相关代码。您的支持bean操作方法应该如下所示:

public void actionSearch() {
    actionLoad();
}

public String editDataItem() {
    dataItem = (Account) dataTable.getRowData();
    return "accounts-edit";
}
还可以将视图中的
{accountsCrudBean.dataItem.id}
替换为
{accountsCrudBean.dataItem.id}


与具体问题无关,请注意,这篇文章已有近6年的历史,并且基于JSF 1.x。现在,有了JSF2.x和EL2.2,还有其他更简单的方法来获取所选行。我最喜欢的是

<h:commandLink value="#{dataItem.id}" action="#{accountsCrudBean.editDataItem(dataItem)}" />

我尝试了您提供的两种方法,现在我得到了错误:java.lang.IllegalStateException:具有重复id的组件“view:accountListTable:j_id1621193992_7da98672”发现您不应该将物理上不同的JSF组件绑定到同一个bean属性。而且,在JSF2.x中,
绑定
是不必要的。正如顶部通知栏或那篇旧博客文章中提到的,请参考JSF2.x方法。我应该在前面看到该博客:)使用您最喜欢的方法并删除绑定使其工作(在Jboss 6和Jboss 7.1上)。非常感谢。顺便问一下:有没有什么办法可以让它不被讨论@ViewScope导致异常:
javax.faces.application.ViewExpiredException-/s/accounts-list.jsf无法找到视图标识符的保存视图状态:/s/accounts list.jsf
单击显示按钮(获取列表)时@ConversationScope没有引发异常并显示列表,但链接不起作用,但是只需重新加载页面。您真的希望重新加载页面时出现令人困惑的行为吗?我会在异常上显示一个自定义的
,它告诉用户会话已超时。或者,您可以将JSF状态保存方法设置为
client
,这样就不会发生此异常,并且操作始终按照预期进行。另见
javax.faces.el.EvaluationException: javax.el.ELException: /s/accounts-list.xhtml at line 22 and column 94 action="#{accountsCrudBean.actionSearch}": java.lang.IllegalArgumentException: row is unavailable
    at javax.faces.component._MethodExpressionToMethodBinding.invoke(_MethodExpressionToMethodBinding.java:96)
    at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:100)
    at javax.faces.component.UICommand.broadcast(UICommand.java:120)
    at javax.faces.component.UIViewRoot._broadcastAll(UIViewRoot.java:889)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:238)
    at javax.faces.component.UIViewRoot._process(UIViewRoot.java:1201)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:627)
    at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:34)
    at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:171)
    at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:324)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242)
    at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:274)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242)
    at com.demo.server.ejb.security.AuthenticationFilter.doFilter(AuthenticationFilter.java:35)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:274)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:181)
    at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.event(CatalinaContext.java:285)
    at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.invoke(CatalinaContext.java:261)
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:88)
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:100)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:159)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.jboss.web.tomcat.service.request.ActiveRequestResponseCacheValve.invoke(ActiveRequestResponseCacheValve.java:53)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:654)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951)
    at java.lang.Thread.run(Thread.java:722)
Caused by: javax.el.ELException: /s/accounts-list.xhtml at line 22 and column 94 action="#{accountsCrudBean.actionSearch}": java.lang.IllegalArgumentException: row is unavailable
    at org.apache.myfaces.view.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:95)
    at javax.faces.component._MethodExpressionToMethodBinding.invoke(_MethodExpressionToMethodBinding.java:88)
    ... 35 more
Caused by: java.lang.IllegalArgumentException: row is unavailable
    at javax.faces.model.ListDataModel.getRowData(ListDataModel.java:69)
    at javax.faces.component.UIData.getRowData(UIData.java:462)
    at com.demo.server.web.AccountsCrudBean.actionSearch(AccountsCrudBean.java:130)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:196)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:43)
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:56)
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:43)
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:56)
    at org.apache.myfaces.view.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:83)
    ... 36 more
public void actionSearch() {
    actionLoad();
}

public String editDataItem() {
    dataItem = (Account) dataTable.getRowData();
    return "accounts-edit";
}
<h:commandLink value="#{dataItem.id}" action="#{accountsCrudBean.editDataItem(dataItem)}" />
public String editDataItem(Account dataItem) {
    this.dataItem = dataItem;
    return "accounts-edit";
}