2015-05-17 4 views
2

Может ли кто-нибудь представить пример выполнения основных операций CRUD с использованием управляемого компонента с полем RichText с обратным концом, так что конечный результат будет таким же, как с использованием источника данных документа в стандартной разработке XPage.Использование Rich Text с управляемым Java компонентом в XPages

Следующий код явно неправильный или неполный, но я не могу найти документацию, чтобы принять его дальше.

Я знаю, что я еще ничего не перерабатывал.

Большое спасибо.

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

Управляемый компонент не может хранить объект Notes во время сериализации, поэтому частная переменная не будет работать. Вы можете сохранить RichText как обычный String. В вашем мероприятии SAVE есть немного больше работы. Самый простой/самый надежный способ - обработать RichText (который не Richtext, а HTML - нет RichText в Интернете) в качестве Mime и использовать классы Mime для сохранения – stwissel

+0

@stwissel Большое спасибо за вашу помощь. Очень мучительный путь, когда они движутся вокруг Java/Managed Beans в XPages, без какой-либо подробной документации о do's и don'ts.Да, я думал, что есть некоторые проблемы с сериализацией и объектами Notes, я столкнулся с проблемами сервера в моих усилиях. У меня нет опыта использования Mime, поэтому я думаю, что это мой следующий шаг. –

ответ

5

Во-первых, как сказал Стефан в своих комментариях RichTextItem-х нигде не найти в XPages. Domino может хранить «Rich Text» поля 2-мя способами:

  • как классический «RichTextItem», которые Клиент Notes обычно используют
  • Как мим/html, который является другой формат полностью, состоящий из lotus.domino .MimeEntity's

Любое поле «RichTextItem», которое вы получаете или изменяете через XPages и сохраняете, будет преобразовано в Mime. Если вы собираетесь что-то делать с отправкой/обработкой электронных писем, вам стоит узнать о Mime и понять, как все это работает.

Если вы хотите использовать inputRichText со встроенными изображениями, то я не думаю, что кто-нибудь сможет предоставить вам пример. Элемент управления inputRichText очень тесно связан с источником данных Domino Document. Возможно, вам удастся придумать решение, но это потребует создания собственного типа DataSource, создания DocumentAdapter, создания DocumentAdapterFactory, предоставления его через XspContributor и повторной реализации множества функций, которые находятся в DominoDocument , который сам по себе не был тривиальным.

Если вы только хотите, чтобы HTML-контент (без встроенных изображений или файлов), вы можете использовать следующее решение в предыдущем ответе на вопрос о переполнении стека. Bind an inputRichText to a Bean В этом ответе описывается, как вы можете привязать компонент к элементу управления inputRichText, используя класс MimeMultipart. Я никогда не использовал это решение, поэтому я не могу прокомментировать его эффективность, однако он имеет 7 upvotes, поэтому он выглядит хорошо. Вы хотите отключить значок панели инструментов редактора для загрузки изображений, чтобы пользователь не мог их загрузить (потому что они не смогут)

Угадайте, когда вы идете сохранить MimeMultipart в Документ, у вас будет 2 варианта.

  • сохранить его в виде строки
    • Чтобы спасти Я думаю, вы бы использовать getHTML в MimeMultipart в(), чтобы получить HTML как строку
    • Для загрузки вы можете создать MimeMultipart используя это статический метод MimeMultipart ,fromHTML (yourhtml)
  • сохранить его как MimeEntity
    • Чтобы сохранить создать MimeEntity (doc.createMimeEntity()) и на этом использование setContentFromText(), передавая в getHTML() с использованием NotesStream см не примеры помощи
    • Для загрузки, используя getContentAsText() в комбинации со статическим MimeMultipart.fromHTML (mimeEntity.getContentAsText())

к сожалению ни один из я e выше является всеобъемлющим, но по крайней мере у вас есть несколько возможностей для изучения. Обратите внимание, что вы также должны изучить настройки session.convertMime и как это работает - изучение Mime - это весело, нет?)

Альтернатива Альтернативой этому является использование гибридного подхода Document DataSource + bean. Связывание источника данных документа с элементом управления inputRichText, а затем привязка вашего компонента к другим элементам управления. Чтобы загрузить данные вашего бина, вы получите доступ к DominoDocument, используя переменную resolver. DominoDocument - это класс java, который обертывает класс «backend» lotus.domino.Document. Он выполняет кучу вещей, например, отслеживает, какие поля были изменены, и изменил ли кто-то другой документ после его загрузки. Вы можете получить доступ к базовому классу с помощью функции getDocument() DominoDocument, но если вы используете этот гибридный подход, не храните его напрямую, всегда сохраняйте его с помощью метода save() DominoDocument.

например. если источник данных документа «документ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(); 
    } 
} 

Тогда в некоторой другой функции в вашем компоненте можно использовать для загрузки, обратите внимание на сроки, когда это называется, вероятно, важно (возможно 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()). Это связано с тем, что метод сохранения отслеживает «последнюю измененную дату», и если вы сохраняете его с помощью внутреннего документа, он будет экономить один раз, а затем, если вы попытаетесь сохранить его с помощью DominoDocument, он потерпит неудачу, поскольку он будет думать, что Документ был изменен кем-то другим (поскольку последняя измененная дата не соответствует ранее известному значению). К сожалению, ни одно из параметров «параллелизма» не меняет это поведение.

Вышеприведенный код является руководством, я только написал его с верхней части головы, поэтому дайте мне знать, если с ним что-то возникнет. У меня будет более глубокий вид. Уверен, у вас появятся вопросы! :)

+0

Ничего себе спасибо, какой блестящий ответ Кэмерон. Меня интересуют оба решения, поскольку я использую эту конкретную разработку в качестве кривой обучения Java в XPages. Наверное, мне нужно застрять в Mime, так как у меня будут другие будущие приложения для меня. Поэтому на данный момент у меня нет вопросов, но я уверен, что вернусь! –

Смежные вопросы