2012-03-13 1 views
2

私は開発者の一人のためにこのsquestionをお願いします。自分自身を詳細に見ていない。管理されたBeansとTabContainer

単純なマネージドBean(=連絡先)があると仮定します。このBeanには、連絡先firstNameを取得するメソッドがあります。

私はのXPageを開いて、私たちは同じタイプ(接触)オープンの複数のドキュメントを持つようにタブコンテナを使用し、当社のアプリケーションではcomputedTextフィールド#{} contact.firstName

にBeanをバインドすることができます。 コンテナでBeanを使用するにはどうすればよいですか?

のfaces-config.xmlに:

<managed-bean> 
    <managed-bean-name>person</managed-bean-name> 
    <managed-bean-class>com.package.Person</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
</managed-bean> 

のJava Beanクラス:

public class Person implements Serializable { 

    private String strDocumentID; 
    private Document docData; 

    private String strFirstName; 
    private String strLastName; 

    private static final long serialVersionUID = 2934723410254681213L; 

    public Person() { 

     //setting the DocumentUniqueID of the current in a tab opened document 
     //attention: there could be more than one open tab, all with different documents 
     //and even different document types; and it is possible to switch back and forth between tabs 

     //DocumentId = ???; 

     //Setting the values from the stored document to the object 
     //setValues(); 

    } 

    private void setValues() { 
     try { 
      Session session=NotesContext.getCurrent().getCurrentSession(); 
      Database currdb=session.getCurrentDatabase(); 
      docData=currdb.getDocumentByUNID(DocumentId); 

      setStrFirstName(docData.getItemValueString("FirstName")); 
      setStrLastName(docData.getItemValueString("LastName")); 
     } catch (NotesException e) { 
      throw new FacesException("Could not open document for documentId "+ DocumentId, e); 
     } 

    } 

    public Document getDataDocument() { 
     return docData; 
    } 

    public void setDataDocument(Document docData) { 
     this.docData = docData; 
    } 

    public String getDocumentId() { 
     return DocumentId; 
    } 

    public void setDocumentId(String documentId) { 
     DocumentId = documentId; 
    } 

    public String getStrFirstName() { 
     return strFirstName;   
    } 

    public void setStrFirstName(String strFirstName) { 
     this.strFirstName = strFirstName; 
    } 

    public String getStrLastName() { 
     return strLastName; 
    } 

    public void setStrLastName(String strLastName) { 
     this.strLastName = strLastName; 
    } 

} 

カスタムコントロール、計算フィールドを持つ:だから

person.strFirstName 

、問題があるのコンストラクタPersonクラス。文書がタブで開かれたときに、そしてこのタブに戻るたびに開いた文書への「リンク」を取得する必要があります。これは、マネージドBean自体が行うべきであるため、データソースを使用しないためです。

このように、問題の理解を深めるのに役立ちました。 そうでない場合は、もう一度お尋ねください。

+0

この質問にはさらに詳しい情報が必要だと思います。 何を試しましたか? computedTextフィールドをタブコンテナに配置しましたか?あなたは何をしようとしているのですか?任意のエラー? –

+1

連絡先ごとに、tabContainerに新しいtabPaneを開きます。各tabPaneは連絡先からすべての項目を保持しています(firstnameはほんの一例です)これまでは、基礎となる文書のIDを持つデータソースがありました。これまでのところ動作します。管理対象のBeanでデータソースを置き換える必要があります。私の開発者は、コンストラクターでIDを渡すことができないと私に言った。 –

+0

マネージドBeanとfaces-configのコードと、このマネージドBeanがデータを取得している場所を投稿できますか?コードが間違った仕方で動いているように、その音は聞こえる。連絡先を表すマネージドBeanを持っているのではなく、xpageからのデータが入力されます。これは、連絡先データを単独で取得し、ビューまたは何かから取得した連絡先オブジェクトのリストを返すマネージドBeanである必要がありますが、それは単なるワイルドの推薦者です。 – jjtbsomhorst

答えて

3

私のアドバイス: マップインターフェイスを実装する別のメタBeanを作成してください。 getterを変更してデータBeanをインスタンス化して戻します。その後、かもしれ結合:

meta[someparamwithunid].field

して保存すると、次のようになります。

このよう

meta[someparamwithunid].setValues()

:ビュースコープを持つ

public class People implments java.util.Map { 
    Map<String,Person> people = new HashMap<String,Person>(); 
    public Person get(String unid) { 
    if people.keySet().contains(unid) { 
    return people.get(unid) 
    } else { 
    // make instance and store it in people map, return it 
    } 
// implement other methods 
} 

私は並行処理で問題がないと思います。

1

フランチェクは正しい方向を指します。リクエストBeanはPerson Beanではなく、People Beanです。次に、

#{people[index].name} 

のような式を特定の人物に使用することができます。管理対象のBeanになる人は、UNIDまたはタブ番号のいずれかになります。私は後の方が簡単に実装できることを知っています。既存の人を読み込むにはloadPerson(index)= UNID関数が必要です。式言語の使用に関する詳細は、 Sun Oracle JSF documentationまたは一部ではCourse materialsです。 希望に役立ちます。

+0

これは、pople beanを構築し、この情報をすべてメモリに保存するためには、最初にすべての連絡文書を読む必要がありますか?それとも完全に間違っているのですか? –

+1

いいえ、「怠惰な」ローディングBeanを持つことができます。コントロールが人を検索したいときはいつでも、それはそのデータを検索し、検索された連絡先をマップに配置します。誰かが連絡先を再度取得したいときはいつでも、連絡先を取得したビューが変更されている場合はそのビューをチェックします。もしそうなら、データを再度検索し、連絡先を返す。キャッシュされていない連絡先オブジェクトを返さない場合。 – jjtbsomhorst

1

このbeanがrequestScopeで動作するかどうかはわかりません。なぜなら、おそらくタブコンテナの部分的なリフレッシュが多いからです(多分上位レベルのスコープに変更してみてください)。

+0

あなたが私の代謝物またはロバートの人豆にコメントしたかどうかはわかりません。メタデータについては、フィールドがポストされたデータ(非表示のタブ)に存在しない場合は、リクエストスコープのBeanのデータが緩くなる可能性があるため、ビューのスコープを変更するように言及していませんでした。 –