在select上显示所选数据表行的详细信息

时间:2013-02-11 15:55:07

标签: jsf primefaces datatable

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

但是我无法从所选行中获取信息。我已经尽可能地清理了代码并将其限制在相关部分 - 如果有任何需要添加或取出的话,请告诉我。

我已经在这个问题上看了一些答案,我无法让他们为我工作。我在行选择方法上尝试了commandbutton方法和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 =&#34;&#34;:设置操作的非法语法   com.sun.faces.facelets.el.TagValueExpression.setValue(TagValueExpression.java:136)     在javax.faces.component.UIInput.updateModel(UIInput.java:818)at   javax.faces.component.UIInput.processUpdates(UIInput.java:735)at   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.UIForm.processUpdates(UIForm.java:281)at   javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242)     在   javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242)     在   org.primefaces.component.layout.Layout.processUpdates(Layout.java:252)     在   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)     在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)at   org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)     在   org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)     在   org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)     在   org.apache.catalina.core.StandardPipeline.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)     在   org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)     在   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)     在   com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)     在   com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)     在   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.ContextTask.run(ContextTask.java:71)at   com.sun.grizzly.util.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:532)     在   com.sun.grizzly.util.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:513)     在java.lang.Thread.run(Thread.java:662)

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

我也被告知他们每个人:

  

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

感谢。

2 个答案:

答案 0 :(得分: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章中解释的。我建议通过一个。

答案 1 :(得分:1)

首先我看到了这一部分:

onclick="addUser.close()"

我用hide()没关闭。

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

还有一件事。在datatable中,您将所选行分配给userdetailsController.selectedElement,并在对话框中使用userdetailsController.selected。做同样的事。