0

私は netbeans 7.2 と primefaces 3.4 を使用しています。データベース、データベースからのエンティティ クラス、およびエンティティ クラスからの jsf ページを作成しました。私は今、データベースの1つからの情報を含むデータテーブルを表示するページを設定しようとしています - Userdetails - (完了) 行をクリックすると、ダイアログが開き、一連のプリセットオプションを追加できますそのユーザーが他のテーブルに追加される前に編集されます。

ただし、選択した行から情報を表示するのに問題があります。コードを可能な限りクリーンアップし、関連する部分だけに制限しました。何か追加または削除する必要がある場合は、教えてください.

この質問に関するいくつかの回答を既に見ましたが、それらを機能させることができませんでした。行選択アプローチで、コマンドボタンアプローチと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: サーブレット 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.UIForm.processUpdates(UIForm.java:281) で javax.faces.component.UIComponentBase.org.primefaces.component.layout.Layout.processUpdates(Layout.java:252) で javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1242) で javax.faces.component で processUpdates(UIComponentBase.java:1242) com.sun. faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:78) com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java: 118) 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) 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) 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.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) java.lang.Thread.run(Thread.java:662) で

編集:以下は私が愚かだっただけです。すぐに他の提案を試しますが、これは適切なIDを要求するためのものでした。おっとっと。

また、それぞれについて次のように言われています。

警告: ID userid を持つコンポーネントがビューに見つかりません。

ありがとう。

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="" />

これは正しくないです。例外メッセージが示すように、セッター メソッド操作を実行することはできません。

を削除するか、value=""

<h:inputText />

または、そのようにゲッター/セッターを使用してBeanプロパティにバインドします

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

これは、健全な JSF チュートリアルの第 1 章で説明されています。1つ通過することをお勧めします。

于 2013-02-11T17:21:09.083 に答える
1

最初に見たのは次の部分です。

onclick="addUser.close()"

hide() を閉じずに使用しました。

また、ここには表示されませんが、ダイアログとデータテーブルは別の形式ですか? また、ViewScoped も使用できます。

もう一つ。datatable では、選択した行を userdetailsController.selectedElement に割り当て、ダイアログでは userdetailsController.selected を使用しました。同じにします。

于 2013-02-11T16:15:23.267 に答える