Nano Hash - криптовалюты, майнинг, программирование

Использование форматированного текста с управляемым компонентом Java в XPages

Может ли кто-нибудь привести пример выполнения основных операций 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>
17.05.2015

  • Управляемый компонент не может содержать объект Notes во время сериализации, поэтому приватная переменная не будет работать. Вы можете сохранить RichText как обычную строку. В вашем событии SAVE немного больше работы. Самый простой/наиболее безопасный способ - рассматривать RichText (который не является Richtext, а HTML - в Интернете нет RichText) как Mime и использовать классы Mime для сохранения 17.05.2015
  • @stwissel Большое спасибо за вашу помощь. Очень мучительный путь ознакомления с Java/управляемыми компонентами в XPages без какой-либо подробной документации о том, что можно и чего нельзя делать. Да, я думал, что есть некоторые проблемы с сериализацией и объектами Notes, я столкнулся с серверными проблемами в своих усилиях. У меня нет опыта использования Mime, поэтому я думаю, что это мой следующий шаг. 18.05.2015

Ответы:


1

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

  • Как классический 'RichTextItem', который обычно использует клиент Notes
  • Как Mime/Html, который является совершенно другим форматом, состоящим из Lotus.domino.MimeEntity

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

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

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

Полагаю, когда вы собираетесь сохранить MimeMultipart в документ, у вас будет 2 варианта.

  • Save it as a String
    • To save I think you would use the MimeMultipart's getHTML() function to get the HTML as string
    • Для загрузки вы можете создать MimeMultipart, используя его статический метод MimeMultipart.fromHTML(yourhtml)
  • Save it as a MimeEntity
    • To save create a MimeEntity (doc.createMimeEntity()) and on that use setContentFromText(), passing in the getHTML() using a NotesStream see examples in help
    • Для загрузки используйте getContentAsText() в сочетании со статическим MimeMultipart.fromHTML(mimeEntity.getContentAsText())

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

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

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

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

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

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..