0

我正在使用 netbeans 7.2 和 primefaces 3.4。我创建了一个数据库,来自数据库的实体类和来自实体类的 jsf 页面。我现在正在尝试设置一个页面,该页面显示一个数据表,其中包含来自其中一个数据库的信息 - Userdetails - (done),当单击一行时,会打开一个对话框来添加一组预设选项,这些选项可以在将该用户添加到另一个表之前进行编辑。

不过,我无法从所选行中获取信息以显示。我已经尽可能地清理了代码并将其限制在相关部分 - 如果需要添加或删除任何内容,请告诉我。

我已经在此问题上查看了一些答案,但我无法让它们为我工作。我在行选择方法上尝试了命令按钮方法和 ajax。

package jsf;

// LOTS OF IMPORTS 

@ManagedBean(name = "userdetailsController")
//@ViewScoped
@SessionScoped
public class UserdetailsController implements Serializable {

    //DECLARATIONS eg private Userdetails selectedElement;

    public UserdetailsController() {
    }

// BUNCH OF PREGENERATED CODE OMITTED 

    public Userdetails getSelected() {
        if (current == null) {
            current = new Userdetails();
            selectedItemIndex = -1;
        }
        return current;
    }

    public String create() {
        try {
            getFacade().create(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("resources/Bundle").getString("UserdetailsCreated"));
            return prepareCreate();
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("resources/Bundle").getString("PersistenceErrorOccured"));
            return null;
        }
    }

    public void setSelectedElement(Userdetails selectedElement) {
        this.selectedElement = selectedElement;
    }

    public Userdetails getSelectedElement() {
        return selectedElement;
    }

    //COLUMN MODEL STUFF THAT WORKS FINE HERE

}

xhtml 的东西

    <p:dataTable var="userdetails" value="#{userdetailsController.elements}"
                 rowKey="#{userdetails.userid}" 
                 scrollable="true" scrollRows="10" scrollHeight="150"
                 resizableColumns="true" 
                 selection="#{userdetailsController.selectedElement}"  
                 draggableColumns="true" selectionMode="single" paginator="true" 
                 widgetVar="userdetails" id="elementsTable">    


        <p:ajax event="rowSelect"  
    update=":datatableForm:display" /> 


                <p:columns value="#{userdetailsController.columns}" var="column" columnIndexVar="colIndex" sortBy="#{userdetails[column.property]}" filterBy="#{userdetails[column.property]}">  


                    <f:facet name="header">  
                        #{column.header}  
                    </f:facet>  

                    #{userdetails[column.property]}  
                </p:columns>  

   <f:facet name="footer">
       <p:commandButton id="addDlgBtn" value="Add this user?" update=":datatableForm:display" oncomplete="addUser.show()"/>  
   </f:facet>
            </p:dataTable>  
            </p:fieldset>

这就是限制数据表的方式,对话框看起来像这样,但有更多选项:

<p:dialog id="dlgAdd"  header="Adding users" widgetVar="addUser">

        <p:panelGrid id="display" columns="2" cellpadding="4">  

            <h:outputLabel value="#{bundle.CreateConnectiontableLabel_userid}" for="userid"/>
            <h:outputText value="#{userdetailsController.selected.userid}" title="#{bundle.CreateConnectiontableTitle_userid}"/>

            <h:outputLabel value="#{bundle.CreateConnectiontableLabel_username}" for="username"/>
            <h:outputText value="#{userdetailsController.selected.username}" title="#{bundle.CreateConnectiontableTitle_username}"/>

            <h:outputLabel value="#{bundle.CreateConnectiontableLabel_infovalue}" for="infovalue"/>
            <h:inputText value="1" title="#{bundle.CreateConnectiontableTitle_infovalue}"/>

        </p:panelGrid>   


    <p:commandButton id="addbtn" value="Add the User." update=":datatableForm" 
                         actionListener="#{connectiontableController.create}" 
                         onclick="addUser.close()"/>   


</p:dialog>

但是,当我单击添加按钮时,我没有得到那些来自 selectedElement 的预设,即 #{userdetailsController.selected.username} 显示为空白。当我单击 Adduser 时,我收到以下错误(带有完整的 Stacktrace):

警告:StandardWrapperValve [Faces Servlet]:PWC1406:Servlet Faces Servlet 的 Servlet.service() 引发异常 javax.el.PropertyNotWritableException:/securedadmin/adminsetup.xhtml @146,110 value="":com.sun 中设置操作的非法语法。 faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:136) 在 javax.faces.component.UIInput.updateModel(UIInput.java:818) 在 javax.faces.component.UIInput.processUpdates(UIInput.java:735)在 javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242) 在 javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242) 在 org.primefaces.component.dialog.Dialog.processUpdates(Dialog.java :366) 在 javax.faces.component.UIComponentBase 的 javax.faces.component.UIForm.processUpdates(UIForm.java:281)。processUpdates(UIComponentBase.java:1242) at javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242) at org.primefaces.component.layout.Layout.processUpdates(Layout.java:252) at javax.faces.component .UIComponentBase.processUpdates(UIComponentBase.java:1242) 在 javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242) 在 javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1231) 在 com.sun。 faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:78) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java: 118) 在 javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 在 org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 在 org.apache.catalina.core.StandardPipeline 的 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) .doInvoke(StandardPipeline.java:655) 在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) 在 org. apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) at com.sun.enterprise.v3.services.impl.ContainerMapper$ AdapterCallable.call(ContainerMapper.java:317) 在 com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) 在 com.sun.grizzly.http。ProcessorTask.invokeAdapter(ProcessorTask.java:860) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) at com .sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) 在 com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104 ) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 在 com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 在 com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask. java:54) 在 com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 在 com.sun.grizzly。com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 上的 ContextTask.run(ContextTask.java:71) com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:第513章)

编辑:以下只是我愚蠢,我会尽快尝试其他建议,但这只是需要适当的 id。哎呀。

我还被告知他们每个人:

警告:无法在视图中找到 ID 为用户 ID 的组件。

谢谢。

4

2 回答 2

3
javax.el.PropertyNotWritableException: /securedadmin/adminsetup.xhtml @146,110 value="": Illegal Syntax for Set Operation 
    at com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:136) 
    at javax.faces.component.UIInput.updateModel(UIInput.java:818)
    ...

在第 146 行,/securedadmin/adminsetup.xhtml你的字符 110 有一个

<h:inputText value="" />

这个不对。正如异常消息所说,不可能对其执行 setter 方法操作。

要么删除value=""

<h:inputText />

或使用 getter/setter 将其绑定到 bean 属性,如下所示

<h:inputText value="#{bean.value}" />

理智的 JSF 教程的第 1 章对此进行了解释。我建议通过一个。

于 2013-02-11T17:21:09.083 回答
1

首先我看到了这部分:

onclick="addUser.close()"

我用 hide() 不关闭。

我在这里也看不到,但是您的对话框和数据表是单独的形式吗?您也可以使用 ViewScoped。

还有一件事。在数据表中,您将选定的行分配给 userdetailsController.selectedElement,在对话框中您使用了 userdetailsController.selected。做一样。

于 2013-02-11T16:15:23.267 回答