Атрибуты чтения/записи в составном компоненте

Я пишу составной компонент JSF datepicker, который поддерживается средством выбора даты jquery-ui (у меня нет возможности использовать библиотеки компонентов)

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

Один из атрибутов, предоставляемых моим компонентом, называется «значение». Я ожидаю, что пользователь компонента предоставит здесь ссылку на el, например. #{myCarBean.selectedCar}

Что я заметил, так это то, что компонент только когда-либо читает значение атрибута. Сеттер никогда не вызывается.

Мне удалось обойти это, представив этот метод как clientBehaviour. Но теперь у меня есть actionListener, который вызывается через это clientBehaviour (для установки значения), а также атрибут «value», который считывает значение из #{cc.attrs.values}.

Как я могу иметь один атрибут, который может читать/записывать атрибут «значение» в базовый управляемый компонент, предоставленный страницей использования?

Вот код:

<ui:component xmlns="http://www.w3.org/1999/xhtml" xmlns:util="http://discovery.co.za/mytags" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:cc="http://java.sun.com/jsf/composite">
<cc:interface componentType="modal">
    <cc:attribute name="value" type="java.util.Date" shortDescription="An El expression representing the managed bean field to which the selected date will be wired."></cc:attribute>
    <cc:attribute name="minYear" type="java.lang.Integer" shortDescription="An El expression representing a managed bean field which should return an Integer indicating the year component of the minDate"></cc:attribute>
    <cc:attribute name="minMonth" type="java.lang.Integer" shortDescription="An El expression representing a managed bean field which should return an Integer indicating the month component of the minDate.(January is 0)"></cc:attribute>
    <cc:attribute name="minDay" type="java.lang.Integer" shortDescription="An El expression representing a managed bean field which should return an Integer indicating the day component of the minDate."></cc:attribute>
    <cc:attribute name="maxYear" type="java.lang.Integer" shortDescription="An El expression representing a managed bean field which should return an Integer indicating the year component of the maxDate"></cc:attribute>
    <cc:attribute name="maxMonth" type="java.lang.Integer" shortDescription="An El expression representing a managed bean field which should return an Integer indicating the month component of the maxDate"></cc:attribute>
    <cc:attribute name="maxDay" type="java.lang.Integer" shortDescription="An El expression representing a managed bean field which should return an Integer indicating the day component of the maxDate"></cc:attribute>
    <cc:attribute name="render" type="java.lang.String" />

    <cc:clientBehavior name="change" targets="#{cc.clientId}:dateInput" event="change" />
</cc:interface>
<cc:implementation>
    <div id="#{cc.clientId}">
        <h:inputText id="dateInput" value="#{cc.attrs.value}" styleClass="jquery-datepicker"
            onclick="modifyDatePickerOptions('#{cc.attrs.clientId}', #{cc.attrs.minYear}, #{cc.attrs.minMonth}, #{cc.attrs.minDay}, #{cc.attrs.maxYear}, #{cc.attrs.maxMonth}, #{cc.attrs.maxDay} );">
            <f:ajax execute="@form"  event="change"  render="#{cc.attrs.render}" />
        </h:inputText>

    </div>
</cc:implementation>

And the using page :

<h:form id="datePickerForm">
            <my:datepicker  render=":datePickerForm:datePickerAjax" value="#{datePickerBean.selectedDate}" minYear="1999" minMonth="0" minDay="1" maxYear="2019" maxMonth="0" maxDay="1">
                <f:ajax  event="change" listener="#{datePickerBean.selectedDate}" />
            </my:datepicker>
            <h:panelGroup id="datePickerAjax" layout="block">
            <br />
                <b><h:outputText value="You selected : #{datePickerBean.selectedDate}" rendered="#{datePickerBean.selectedDate != null}" /></b>
            </h:panelGroup>
        </h:form>

person Duran Wesley Harris    schedule 31.03.2017    source источник
comment
Из любопытства, почему бы и нет: (у меня нет возможности использовать библиотеки компонентов)   -  person Kukeltje    schedule 10.04.2017
comment
@Kukeltje: Архитекторы проекта чувствовали, что они не хотят зависеть от библиотек компонентов, поскольку всегда появляются новые и лучшие библиотеки компонентов, и они не хотят накладных расходов на миграцию. Так что я ограничен мохаррой 2.1. По крайней мере, они позволили мне использовать Omnifaces.   -  person Duran Wesley Harris    schedule 11.04.2017
comment
Таким образом, даже с простыми компонентами, такими как автозаполнение, они не хотят использовать, например. PrimeFaces, но нужна нестандартная сложность, например stackoverflow.com/questions/42834630/? хорошо... Удачи им с таблицами данных, фильтрацией, сортировкой, пейджингом, древовидными таблицами и другими компонентами ;-)   -  person Kukeltje    schedule 11.04.2017
comment
Странное решение, я знаю. Тем более, что другие наши приложения уже работают на PrimeFaces... так почему бы не еще одно?   -  person Duran Wesley Harris    schedule 12.04.2017


Ответы (1)


Вам нужно добавить конвертер в поле inputText. Для этого вы можете вложить тег <f:convertDateTime/> в свой inputText. См. convertDateTime для всех доступные атрибуты.

person axemoi    schedule 10.04.2017
comment
Спасибо, да, я должен сделать это. ManagedBean, на котором установлена ​​дата, фактически объявляет дату как строку (хотя в интерфейсе компонента атрибут value объявлен как java.util.Date). Я не уверен, почему это работает. - person Duran Wesley Harris; 11.04.2017