2015-05-17 18 views
2

任何人都可以提供如何使用託管bean執行基本CRUD操作以及後端RichText字段的示例,因此最終結果與使用文檔數據源在標準的XPage開發中。在XPages中對Java受管bean使用RTF內容

下面的代碼顯然是錯誤的或不完整的,但我找不到任何文檔來進一步。

我知道我還沒有回收任何東西。

非常感謝。

public class RichTextTest implements Serializable { 
private static final long serialVersionUID = 1L; 
private String plainItem; 
private RichTextItem richItem; 
private String unid; 


public RichTextTest()throws NotesException { 

String docID = ExtLibUtil.readParameter(FacesContext.getCurrentInstance(),"key"); 
if (StringUtil.isNotEmpty(docID)){load(docID);}} 

public void load(String ID) throws NotesException{ 
Document doc = null; 
setUnid(ID); 

doc = ExtLibUtil.getCurrentDatabase().getDocumentByUNID(ID); 
setPlainItem(doc.getItemValueString("PlainTextField")); 
setRichItem ((RichTextItem) doc.getFirstItem("RichTextField")); 

} 

public void save() throws NotesException{ 

    Database database = ExtLibUtil.getCurrentDatabase(); 
    Document doc = database.getDocumentByUNID(getUnid()); 
    doc.replaceItemValue("PlainTextField", getPlainItem()); 
    doc.replaceItemValue("RichTextField",getRichItem()); 
    doc.save(); 


} 



public String getPlainItem() { 
    return plainItem; 
} 
public void setPlainItem(String plainItem) { 
    this.plainItem = plainItem; 
} 
public RichTextItem getRichItem() { 
    return richItem; 
} 
public void setRichItem(RichTextItem richItem) { 
    this.richItem = richItem; 
} 
public void setUnid(String unid) { 
    this.unid = unid; 
} 
public String getUnid() { 
    return unid; 
} 

而且在XPage上

<xp:inputText value="#{richTextTest.plainItem}" id="plainTextField1">  </xp:inputText> 
<xp:br></xp:br> 
<xp:inputRichText value="#{richTextTest.richItem}" id="richTextField1"></xp:inputRichText> 
<xp:br></xp:br> 
<xp:button value="Save" id="button1"><xp:eventHandler event="onclick" submit="true" refreshMode="complete"> 
<xp:this.action> 
    <xp:executeScript script="#{richTextTest.save}"></xp:executeScript> 
</xp:this.action></xp:eventHandler></xp:button> 
+1

託管bean在序列化過程中無法保存Notes對象,所以私有變量將不起作用。您可以將RichText作爲普通字符串存儲。在你的SAVE活動中,還有更多的工作。最簡單/最省心的方法是將RichText(不是Richtext,但是HTML - 網上沒有RichText)作爲Mime處理,並使用Mime類來保存 – stwissel

+0

@stwissel非常感謝您的幫助。在XPages中,Java/Managed Beans是一個非常艱難的途徑,沒有任何關於do和not的詳細文檔。是的,我認爲在序列化和Notes對象上存在一些問題,我在努力中遇到了一些問題。我沒有使用Mime的經驗,所以我想這是我的下一步。 –

回答

5

首先爲斯蒂芬在他的評論說,RichTextItem的無處XPages中被發現。 Domino可以存儲「富文本」字段2種方式:

  • 經典的「RichTextItem」的Notes客戶端通常會使用
  • 作爲MIME/HTML這是另一種格式完全,由lotus.domino中的.MimeEntity的

您通過XPages訪問/修改並保存的任何「RichTextItem」字段都將轉換爲Mime。如果您打算對發送/處理電子郵件做任何事情,那麼瞭解Mime並理解它是如何工作是非常值得的。

如果您正在尋找將inputRichText與嵌入式圖像結合使用的方法,那麼我認爲任何人都不會爲您提供示例。 inputRichText控件非常緊密地綁定到Domino Document數據源。 可能會提出一個解決方案,但它會涉及到創建自己的DataSource類型,創建DocumentAdapter,創建DocumentAdapterFactory,通過XspContributor提供它並重新實現DominoDocument中的許多功能,這本身並不重要。

如果你只是想要允許HTML內容(沒有嵌入的圖像或文件),那麼你可能能夠在以前解決的堆棧溢出問題中使用以下解決方案。 Bind an inputRichText to a Bean 本答案描述瞭如何使用MimeMultipart類將bean綁定到inputRichText控件。我從來沒有使用這個解決方案,所以我不能評論它的有效性,但它有7個upvotes,所以看起來不錯。 你想禁用編輯器的工具欄圖標上傳圖像,以便用戶不認爲他們可以上傳(因爲他們將無法)

在猜測,當你去保存MimeMultipart到文檔,你會有2個選項。使用它

  • 將它保存爲一個字符串
    • 爲了節省我想你會使用MimeMultipart的的getHTML()函數來獲取HTML作爲字符串
    • 加載您可以創建MimeMultipart的是靜態方法MimeMultipart的。fromHTML(yourhtml)
  • 保存它作爲一個MimeEntity
    • 要保存創建MimeEntity(doc.createMimeEntity()),並在使用setContentFromText(),使用成NotesStream看到getHTML通過()在幫助
    • 例子要加載,使用getContentAsText()結合靜態MimeMultipart.fromHTML(mimeEntity.getContentAsText())

對不起無理論值的以上是全面的,但至少你有一些探索的途徑。注意你也應該看看session.convertMime設置和它的工作原理 - 學習Mime很有趣,不是嗎? :)

替代 所有這些的替代方法是採用Document DataSource + bean的混合方法。將文檔數據源綁定到inputRichText控件,然後將您的bean綁定到其他控件。 要載入您的bean的數據,您將使用變量解析器訪問DominoDocument。 DominoDocument是一個包裝'backend'lotus.domino.Document類的java類。它會處理一些內容,例如跟蹤哪些字段已更改,以及是否有人在您加載文檔後修改了文檔。您可以使用DominoDocument的getDocument()函數訪問後端類,但是如果您使用這種混合方法,請不要直接保存後端文檔,而應始終通過DominoDocument的save()方法進行保存。

例如如果你的文檔的數據來源是「文檔1」,讓自己的私人功能

private DominoDocument getDominoDocument() { 
    Object o = ExtLibUtil.resolveVariable(FacesContext.getCurrentInstance(), "document1"); 

    if (o == null) return null; 

    if (o instanceof DominoDocument) { 
     return (DominoDocument)o; 
    } else if (o instanceof DominoDocumentData) { 
     return ((DominoDocumentData)o).getDocument(); 
    } 
} 

然後在你的bean一些其他的功能,你可以用它來裝載,請記住,當這個叫的時機可能是重要的(也許postOpenDocument ?)

public void loadFromDominoDocument() { 
    DominoDocument ddoc = getDominoDocument(); 

    this.someBeanVar = ddoc.getItemValueString("someBeanVar"); 
    this.anotherBeanVar = ddoc.getItemValueString("anotherBeanVar"); 

} 

反過來說,你將有一些其他函數更新到Domino值與多米諾骨牌文件。

public void updateDominoDocument() { 

    DominoDocument ddoc = getDominoDocument(); 

    ddoc.replaceItemValue("someBeanVar",this.someBeanVar); 
    ddoc.replaceItemValue("anotherBeanVar", this.anotherBeanVar); 

} 

注:我沒有做任何節省的是,如果你使用這種混合模式則請注意,你必須做的所有使用「DominoDocument」類儲蓄(無論是save()方法在bean或標準文檔保存操作 - 調用save()方法)。 這是因爲save方法跟蹤'上次修改日期',並且如果使用後端文檔進行保存,則它將保存一次,然後如果嘗試使用DominoDocument進行保存,則會失敗,因爲它會認爲該文檔已被其他人修改(因爲最後修改日期與其先前已知的值不匹配)。不幸的是,'併發'設置都沒有改變這種行爲。

上面的代碼是一個指導,我只寫從我的頭頂部,所以讓我知道如果有任何問題,我會有一個更深入的瞭解。我相信你會有一些問題! :)

+0

哇謝謝卡梅隆的一個輝煌的迴應。我對這兩種解決方案都感興趣,因爲我正在使用此特定開發作爲XPage中Java的學習曲線。我想我應該先插入Mime,因爲它會爲我提供其他未來的應用程序。所以我目前沒有任何問題,但我相信我會回來的! –