Как я могу создать повторно используемое представление, используя JSF - PullRequest
4 голосов
/ 13 января 2012

Вот сценарий - я хочу создать представление, которое можно использовать из ряда других представлений для создания и редактирования объекта определенного типа.

Мое приложение имеет адресную сущность, которая может совместно использоваться другими сущностями.В представлении, которое поддерживает сущность, я бы хотел кнопку / ссылку, которая переходит к представлению редактирования адреса для адреса, связанного с этой сущностью.Другое представление, которое обрабатывает другой объект, также должно иметь возможность перейти к представлению редактирования адреса с его адресом.Представление адреса затем вернется к вызывающему представлению после завершения редактирования.

Моя проблема в том, что я не могу найти способ передать адресную сущность из первого представления в представление адреса.

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

Я использую JSF2.1 (MyFaces / PrimeFaces) и CDI (OpenWebBeans) и CODI.

Я уверен, что мне не хватает чего-то простого.(Простой относительно терминов JSF / CDI!)

Ответы [ 3 ]

2 голосов
/ 15 января 2012

Я думаю, что нашел решение.

Поскольку я использую CODI, я могу использовать аннотацию ConversationGroup. Я создал интерфейс emtpy AddressConversation, затем добавил его ко всем компонентам поддержки, которые должны отображать представление address/addressEdit.xhtml, а также компоненту поддержки для представления addressEdit.

Я также использую конфигурацию представления CODI, поэтому мои методы действия возвращают ViewConfig объекты производного класса.

@Named
@ConversationScoped
@ConversationGroup(AddressConversation.class)
public class AddressView implements Serializable
{
    private Class<? extends Views> fromView;
    private Address editAddress;
    private Address returnAddress;

    // Getters/setters etc...

    public Class<? extends Views> cancelEdit()
    {
        returnAddress = null;

        return fromView;
    }
}

Так что в представлении вызова у меня есть (PrimeFaces commandLink)

<p:commandLink value="#{enquiryView.addressLinkText}" action="#{enquiryView.editAddress()}" immediate="true"/>

и в компоненте поддержки EnquiryView Я могу @Inject экземпляр AddressView в правильной группе диалога, затем установить адрес и возвращать свойства представления при вызове метода действия.

@Named
@ConversationScoped
@ConversationGroup(AddressConversation.class)
public class EnquiryView implements Serializable
{
    @Inject @ConversationGroup(AddressConversation.class) private AddressView addrView;

    public Class<? extends Views> editAddress()
    {
        addrView.setAddress(editEnq.getAddress());
        addrView.setFromView(Views.Enquiry.EnquiryEdit.class);
        return Views.Address.AddressEdit.class;
    }
}

Я также могу наблюдать навигацию в EnquiryView и обновлять объект запроса, когда адрес был «сохранен» в представлении редактирования адреса.

protected void onViewConfigNav(@Observes PreViewConfigNavigateEvent navigateEvent)
{
    if (navigateEvent.getFromView() == Views.Address.AddressEdit.class && 
            navigateEvent.getToView() == Views.Enquiry.EnquiryEdit.class)
    {
        onEditAddressReturn();
    }
}

private void onEditAddressReturn()
{
    if (addrView.getReturnAddress() != null) {
        // Save pressed
        editEnq.setAddress(addrView.getReturnAddress());
    }
}
1 голос
/ 13 января 2012

Просто передайте идентификатор адреса в качестве параметра запроса и получите целевое представление для преобразования, проверки и установки его в компоненте с помощью <f:viewParam>.

Например,

<h:link value="Edit address" outcome="addresses/edit">
    <f:param name="id" value="#{address.id}" />
</h:link>

, а затем вaddresses/edit.xhtml

<f:metadata>
    <f:viewParam id="id" name="id" value="#{editAddressBacking.address}"
        converter="#{addressConverter}" converterMessage="Bad request. Unknown address."
        required="true" requiredMessage="Bad request. Please use a link from within the system." />
</f:metadata>
<h:message for="id" />

<h:form rendered="#{not empty editAddressBacking.address}">
    <h:inputText value="#{editAddressBacking.address.street}" />
    ...
</h:form>

Чтобы вернуться на исходную страницу, вы можете передать другой параметр запроса.

<h:link value="Edit address" outcome="addresses/edit">
    <f:param name="id" value="#{address.id}" />
    <f:param name="from" value="#{view.viewId}" />
</h:link>

(где #{view} - неявный объектссылаясь на текущий UIViewRoot)

и установить его также на <f:viewParam>, так что вы можете в методе submit bean-компонента редактирования адреса просто вернуться к нему:

public String save() {
    // ...

    return from + "?faces-redirect=true";
}

См. Также:

0 голосов
/ 13 ноября 2012

Если вы хотите, чтобы другой объект устанавливался, когда адрес в порядке, просто дайте процессам адресов EL-имя компонента, который вы хотите установить:

<f:param name="targetBeanSetter" value="enquiryBean.adress" />

И в Java:

public String executeAndBack() {
    int last = this.targetBeanSetter.lastIndexOf('.');
    String base = this.targetBeanSetter.substring(0, last);
    String property = this.targetBeanSetter.substring(last + 1);
    Object yourEntityToSet = FacesContext.getCurrentInstance().getELContext().getELResolver().getValue(context.getELContext(), null, base);
    try {
            PropertyUtils.setSimpleProperty(yourEntityToSet, property, constructeurHolder.getConstructeur());
        } catch (Throwable e) {
            throw new RuntimeException(e.getMessage());
        }
    return from + "?faces-redirect=true";
}

Если вам нужен только доступ к выбранному адресу, без создания связанных объектов, когда вы вернетесь на первую страницу, просто введите в EnquiryView, используя

@ManagedProperty(value="{address}")
Address adress;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...