【问题标题】:issue while loading data加载数据时出现问题
【发布时间】:2014-06-16 15:04:40
【问题描述】:

我在页面中有多个表单,每个表单都有数据表。 当我选择映射到该控件的数据表时,应显示在页面上。 使用 primefaces 开发应用程序时遇到以下异常:

  javax.faces.view.facelets.TagAttributeException: //C:/Workspace/Application/WebContent/transfer.xhtml @28,102 rendered="#{transferMB.mySelectedValues('1')}" Error Parsing: #{transferMB.mySelectedValues('1')}
            at com.sun.faces.facelets.tag.TagAttributeImpl.getValueExpression(TagAttributeImpl.java:428)
            at com.sun.faces.facelets.tag.TagAttributeImpl.getValueExpression(TagAttributeImpl.java:378)
            at com.sun.faces.facelets.tag.jsf.ComponentRule$ValueExpressionMetadata.applyMetadata(ComponentRule.java:107)
            at com.sun.faces.facelets.tag.MetadataImpl.applyMetadata(MetadataImpl.java:81)
            at javax.faces.view.facelets.MetaTagHandler.setAttributes(MetaTagHandler.java:129)
            at javax.faces.view.facelets.DelegatingMetaTagHandler.setAttributes(DelegatingMetaTagHandler.java:102)
     weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
            at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
            at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
            at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
            at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
            at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
            at weblogic.work.ExecuteThread.run(ExecuteThread.java:178)
        Caused by: javax.el.ELException: Error Parsing: #{transferMB.mySelectedValues('1')}
            at com.sun.el.lang.ExpressionBuilder.createNodeInternal(Unknown Source)
            at com.sun.el.lang.ExpressionBuilder.build(Unknown Source)
            at com.sun.el.lang.Expres

sionBuilder.createValueExpression(Unknown Source)
        at com.sun.el.ExpressionFactoryImpl.createValueExpression(Unknown Source)
        at com.sun.faces.facelets.tag.TagAttributeImpl.getValueExpression(TagAttributeImpl.java:412)
        ... 94 more

【问题讨论】:

  • 是否调用了 selectedItems 的设置器?你可以试试<p:ajax event="change" partialSubmit="true" update=":transForm, :sprdForm"/>

标签: ajax jsf primefaces


【解决方案1】:

您应该使用逗号分隔要更新的表单,例如:

<p:ajax update=":transForm, :sprdForm" />   

表示有两种形式要更新。
如果你的代码如下:

<p:ajax update=":transForm :sprdForm" />

表示您要在transForm 中更新sprdForm,这是不可能的,因为您不能将表单放入另一个表单中。

【讨论】:

    【解决方案2】:

    您正在尝试将列表与单个字符串进行比较:

    rendered="#{transferMB.selectedItems == '1'}"
    

    但是,您应该检查列表是否包含这个单个字符串:

    在html中:

    rendered="#{denemeBean.controlSelectedValues('1')}"
    

    在bean类中:

    // list should be initialized (unless, we'll get NullPointer 
    // when using the below method)
    
    private List<String> selectedItems = new ArrayList<>();
    
    // This methods returns true if parameter is included in the 
    // list of selected items
    
    public boolean controlSelectedValues(String needed) {
        for (String string : selectedItems) {
            if (string.equals(needed)) {
                return true;
            }
        }
        return false;
    }
    

    最后,我不确定您是否真的需要将这些数据表放入表单中。 下面你可以看到我工作的工作副本:(当然你应该用你的数据表替换 outputTexts)

    // bean file
    
    import java.util.List;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.ViewScoped;
    
    @ManagedBean(name = "denemeBean")
    @ViewScoped
    public class DenemeBean implements Serializable {
    
        private List<String> selectedItems = new ArrayList<>();
    
        /**
         * @return the selectedItems
         */
        public List<String> getSelectedItems() {
            return selectedItems;
        }
    
        /**
         * @param selectedItems the selectedItems to set
         */
        public void setSelectedItems(List<String> selectedItems) {
            this.selectedItems = selectedItems;
        }
    
        public boolean controlSelectedValues(String needed) {
            for (String string : selectedItems) {
                if (string.equals(needed)) {
                    return true;
                }
            }
    
            return false;
        }
    }
    
    // html file: 
    
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:p="http://primefaces.org/ui"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:ui="http://java.sun.com/jsf/facelets">
        <h:head>
            <title></title>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        </h:head>
        <h:body>
            <h:form>
    
                <h:selectManyCheckbox value="#{denemeBean.selectedItems}">
                    <f:selectItem itemValue="1" itemLabel="Transfer Status" />
                    <f:selectItem itemValue="2" itemLabel="Spread Status" />
                    <f:selectItem itemValue="3" itemLabel="Number1 - 3" />
                    <p:ajax event="change" update=":tables" />
                </h:selectManyCheckbox>
    
            </h:form>
    
            <p:panel id="tables" >
                <p:panel id="transForm" rendered="#{denemeBean.controlSelectedValues('1')}">
                    <h:outputText value="table1 Here" />
                </p:panel>
    
                <p:panel id="sprdForm" rendered="#{denemeBean.controlSelectedValues('2')}">
                    <h:outputText value="table 2 Here" />
                </p:panel>
            </p:panel>
        </h:body>
    </html>
    

    【讨论】:

    • 我试过你提到的,它在页面上抛出异常。 “渲染=“#{searchMB.controlSelectedValues('1')}”错误解析:#{transferMB.controlSelectedValues('1')}”。控制台上的异常:1100: JSF1073: javax.faces.view.facelets.TagAttributeException 在处理 RENDER_RESPONSE 6 @Null 指针期间捕获。
    • 按照您的建议完成,面临异常。请参阅上面的帖子已修改并包含异常 - @Null Pointer。
    • 我猜你不能在你的调用中传递参数。 (与表达语言(EL)有关,但我不知道细节)。因此,您需要将此调用和相关控制方法更改为非参数样式。像:“rendered="#{denemeBean.controlTableA}"" 和 "public boolean controlTableA(){controlSelectedValues("1");}" 这样,每个控件都有一个方法。而这些方法调用我们的 main 方法并带有必要的参数。
    【解决方案3】:

    使用&lt;p:ajax update=":transForm :sprdForm" /&gt; 是完全有效的。 您在这里还有多个其他问题。

    第一点:您的渲染属性将列表与字符串 (selectedItems=='1') 进行比较。它应该测试列表是否包含字符串 (selectedItems.contains('1'))。 (注意:您必须为此使用 EL 2.2)

    第二点是:我认为&lt;p:panelGrid&gt; 需要columns-属性。 我剥离了你的代码,这对我来说很好:

    <h:body>
    <h:form>
        <p:selectManyCheckbox value="#{transferMB.selectedItems}">
            <f:selectItem itemValue="1" itemLabel="Transfer Status" />
            <f:selectItem itemValue="2" itemLabel="Spread Status" />
            <f:selectItem itemValue="3" itemLabel="Number1 - 3" />
            <p:ajax update=":transForm :sprdForm"/>
        </p:selectManyCheckbox>
    </h:form>
    
    <h:form id="transForm">
        <p:panelGrid columns="1" rendered="#{transferMB.selectedItems.contains('1')}">
            transForm
        </p:panelGrid>
    </h:form>
    
    <h:form id="sprdForm">
        <p:panelGrid columns="1" rendered="#{transferMB.selectedItems.contains('2')}">
            sprdForm
        </p:panelGrid>
    </h:form>
    </h:body>
    

    我使用了&lt;p:selectManyCheckbox&gt;,因为&lt;h:selectManyCheckbox&gt; 和内部&lt;p:ajax&gt; 导致java.lang.ClassCastException: java.lang.Boolean cannot be cast to org.primefaces.component.api.ClientBehaviorRenderingMode。我认为这可能是我的 JSF 实现 jsf-impl-2.1.7-jbossorg-2.jar 中的错误。

    【讨论】:

    • 如上述帖子中所述尝试时遇到以下异常:“rendered="#{searchMB.controlSelectedValues('1')}”错误解析:#{transferMB.controlSelectedValues('1')}” .控制台异常:1100: JSF1073: javax.faces.view.facelets.TagAttributeException 在处理 RENDER_RESPONSE 6 期间捕获。 @Ishkafel
    • Stacktrace 中的根异常是什么?根据给出的信息,我们只能猜测。始终检查 NullPointerException(列表已初始化?)。您还在评论中提到了 searchMB 和 transferMB,请检查您的代码:您使用的是哪一个? controlSelectedValues这个方法基本上和List上的contains是一样的,为什么不用这个呢?
    • 我在stackoverflow.com/questions/24271045/… 找到了您提出相同问题的地方。请参阅我在此处发布的建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 2010-12-30
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多