gpt4 book ai didi

xpages - 在XPages中将富文本与Java托管Bean结合使用

转载 作者:行者123 更新时间:2023-12-01 14:31:23 24 4
gpt4 key购买 nike

谁能提供一个示例,说明如何使用带有后端RichText字段的托管bean进行基本的CRUD操作,因此最终结果与在标准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>

最佳答案

首先,正如Stephan在评论中所说,RichTextItem在XPages中找不到。 Domino可以通过两种方式存储“富文本”字段:

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

    您通过XPages访问和修改并保存的任何“RichTextItem”字段都将转换为Mime。如果您打算对发送/处理电子邮件做任何事情,那么非常值得学习有关Mime并了解其工作原理。

    如果您希望将inputRichText与嵌入式图像一起使用,那么我认为没有人能够为您提供示例。 inputRichText控件与Domino文档数据源紧密绑定。
    可能可以提出一个解决方案,但这将涉及创建您自己的数据源类型,创建DocumentAdapter,创建DocumentAdapterFactory,通过XspContributor提供它以及重新实现DominoDocument中的许多功能,这本身并不简单。

    如果您只希望允许HTML内容(没有嵌入的图像或文件),则可以在先前回答的堆栈溢出问题中使用以下解决方案。
    Bind an inputRichText to a Bean
    此答案描述了如何使用MimeMultipart类将bean绑定到inputRichText控件。我从未使用过这种解决方案,因此我无法评论它的有效性,但是它有7种支持,所以看起来不错。
    您可能要禁用编辑器的工具栏图标来上传图像,以使用户不认为他们可以上传(因为他们将无法上传)

    猜测一下,当您将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的数据,您可以使用变量resolver访问DominoDocument。
    DominoDocument是一个Java类,包装了“后端” Lotus.domino.Document类。它完成了很多工作,例如跟踪自您加载文档以来哪些字段已更改以及是否有人修改了文档。您可以使用DominoDocument的getDocument()函数访问后端类,但是,如果使用这种混合方法,请不要直接保存后端文档,而应始终通过DominoDocument的save()方法进行保存。

    例如如果您的文档数据源是'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值更新到多米诺骨牌文档。
    public void updateDominoDocument() {

    DominoDocument ddoc = getDominoDocument();

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

    }

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

    上面的代码是一个指南,我只是从头开始编写的,因此,如果有任何问题,请告诉我,我将进行更深入的介绍。我敢肯定你会有一些问题! :)

    关于xpages - 在XPages中将富文本与Java托管Bean结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30286748/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com