在XPage中使用Rich Text和Java Managed Bean

时间:2015-05-17 11:59:59

标签: xpages

任何人都可以提供一个如何使用托管bean执行基本CRUD操作的示例,其中包含后端RichText字段,因此最终结果与在标准XPage开发中使用文档数据源相同。

以下代码显然是错误的或不完整的,但我找不到任何文档可以进一步了解。

我知道我还没有回收任何东西。

非常感谢。

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 个答案:

答案 0 :(得分:5)

首先,正如斯蒂芬在评论中所说,RichTextItem在XPages中无处可寻。 Domino可以通过两种方式存储“Rich Text”字段:

  • 作为Notes客户端通常使用的经典“RichTextItem”
  • 作为Mime / Html完全是另一种格式,由lotus.domino.MimeEntity的
  • 组成

您通过XPage访问/修改并保存的任何“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保存到Document时,您将有2个选项。

  • 将其另存为字符串
    • 要保存,我想你会使用MimeMultipart的getHTML()函数将HTML作为字符串
    • 要加载,您可以使用它的静态方法MimeMultipart.fromHTML(yourhtml)创建MimeMultipart
  • 将其另存为MimeEntity
    • 要保存创建MimeEntity(doc.createMimeEntity())并使用setContentFromText(),使用NotesStream传入getHTML(),请参阅帮助中的示例
    • 使用getContentAsText()和静态MimeMultipart.fromHTML(mimeEntity.getContentAsText())加载

对不起以上所有内容都不全面,但至少你有一些途径可以探索。请注意,您还应该查看session.convertMime设置及其工作原理 - 学习Mime很有趣,不是吗? :)

<强>替代 所有这一切的替代方案是采用Document DataSource + bean的混合方法。将文档Data Source绑定到inputRichText控件,然后将bean绑定到其他控件。 要加载bean的数据,您可以使用变量解析器访问DominoDocument。 DominoDocument是一个包装'后端'lotus.domino.Document类的java类。它会执行许多操作,例如跟踪哪些字段已更改以及是否有其他人在您加载文档后修改了文档。您可以使用DominoDocument的getDocument()函数访问后端类,但如果您使用此混合方法,请不要直接保存后端文档,始终通过DominoDocument的save()方法保存。

e.g。如果您的文档数据源是'document1',请将自己设为私有函数

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");

}

相反,您将有一些其他函数可以使用bean值更新到domino文档。

public void updateDominoDocument() {

    DominoDocument ddoc = getDominoDocument();

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

}

注意:我还没有进行任何保存,如果你使用这个混合模型,那么请注意你必须使用'DominoDocument'类(bean中的save()方法或标准文档保存动作进行所有保存) - 调用save()方法)。 这是因为save方法跟踪“上次修改日期”,如果使用后端文档保存,它将保存一次,然后如果您尝试使用DominoDocument保存,它将失败,因为它会认为文档已被其他人修改(因为最后修改日期与之前已知的值不匹配)。不幸的是,“并发”设置都没有改变这种行为。

上面的代码是一个指南,我只是从头顶写的,所以让我知道如果有任何问题,我会有更深入的了解。我相信你会有一些问题! :)