Управляемый компонент в области запроса продолжает создаваться

Вот такая странная ситуация, над которой я борюсь. У меня есть 3 страницы, назовем их A, B и C. Каждая страница имеет свой собственный Managed Bean в области запроса: MB1, MB2 и MB3 соответственно. Когда я вхожу в A, создается MB1. Из A я вызываю window.showModalDialog, чтобы открыть B, и каждый раз, когда B создается его открытый MB2. Странность начинается, когда я вызываю страницу C из B с помощью window.showModalDialog, и MB3 создается один раз. Такое поведение сводит меня с ума, потому что я делал подобные вещи, и это происходит впервые.

Я также должен сказать, что MB1 и MB2 имеют аннотацию @KeepAlive (аналогично использованию компонента тега a4j:keepAlive, а MB3 — это чистый управляемый компонент.

Я открыт для любых идей по решению проблемы. В настоящее время я работаю с JSF 1.2, RichFaces 3.3.3 и JBoss EAP 5.1.

Спасибо за ваше время и извините за мой плохой английский!

РЕДАКТИРОВАТЬ 1: Исходный код для страниц A, B и C:

страница А:

<!-- The js function which calls page B -->
<script type="text/javascript">
function buscaDeposito() {
    var blnResultado = false;
    var sUrl = 'pageB.jsf';
    var oDatos = new Object();
    var args = 'dialogHeight: 450px; dialogWidth: 700px; edge: Raised; center: Yes; help: No; resizable: No; status: No';
    if (window.showModalDialog(sUrl, oDatos, args)) {
        blnResultado = true;
        document.getElementById('frmFormaCobroLiqDocCartera:txtNroDeposito').value = oDatos.ReturnValue;
    }
    return blnResultado;
}
</script>
<!-- HTML/JSF fragment of page A -->
<table class="tabla" width="100%">
    <tr>
        <td style="width: 25%; text-align: right">
            <h:outputText>Nro. de depósito no identificado</h:outputText>
        </td>
        <td style="width: 20%">
            <h:inputText id="txtNroDeposito" styleClass="inputText" style="width: 100%"
                readonly="true"
                value="#{formaCobroLiqDocCartera.numeroDepositoNoIdentificado}" />
        </td>
        <td>
            <a4j:commandLink id="lnkBuscaDNIDeposito"
                onclick="if (!buscaDeposito()) return false;"
                action="#{formaCobroLiqDocCartera.cargaDatosDeposito}"
                reRender="pnlDeposito" limitToList="true">
                <h:graphicImage value="/Resource/iconos/buscar-con-ayuda.png"
                    styleClass="pic" title="Buscar" />
            </a4j:commandLink>
        </td>
    </tr>
</table>

страница Б:

<script type="text/javascript">
    window.returnValue = false;
    // The js function which calls pageC
    function veDetalleDeposito() {
        //The function depositoSeleccionado checks if at least one 
        //radio button has been selected in the dataTable.
        if (!depositoSeleccionado()) {
            alert('Debe seleccionar un depósito.');
        } else {
            var sUrl = 'pageC.jsf';
            var oDatos = new Object();
            var args = 'dialogHeight: 280px; dialogWidth: 400px; edge: Raised; center: Yes; help: No; resizable: No; status: No';
            window.showModalDialog(sUrl, oDatos, args);
        }
    }
</script>
<!-- The call to pageC in the oncomplete javascript because I must set a session
    variable with the value of the selected row. -->
<a4j:commandLink id="lnkVeDetalle" oncomplete="veDetalleDeposito()">
    <h:graphicImage value="/Resource/iconos/visualizar-registro.png" styleClass="pic"
        title="Ver detalle de depósito" />
</a4j:commandLink>
<rich:dataTable id="dtDepositos" width="100%" headerClass="cabeceraDataTable"
    binding="#{listaDepositoNoIdentificado.hdtDepositos}" rows="15"
    value="#{listaDepositoNoIdentificado.lstDepositos}" var="deposito">
    <rich:column width="5%" style="text-align:center">
        <f:facet name="header">
            <h:outputText value="Seleccione" />
        </f:facet>
        <h:selectOneRadio onclick="dataTableSelectOneRadio(this)"
            valueChangeListener="#{listaDepositoNoIdentificado.setSelectedItem}">
            <f:selectItem itemValue="null" />
        </h:selectOneRadio>
    </rich:column>
    <!-- more columns here... -->
</rich:dataTable>

страница C (простая страница jsf, которая ничего не делает):

<h:form style="font-family: sans-serif;">
    <h2 class="tituloPagina">Detalle del Depósito No Identificado</h2>
    <fieldset>
        <legend class="legenda">Detalle del Depósito No Identificado</legend>
        <table>
            <tr>
                <td>Tipo:</td>
                <td>
                    <h:outputText value="#{detalleDeposito.deposito.tipo}" />
                </td>
            </tr>
            <tr>
                <td>Número:</td>
                <td>
                    <h:outputText value="#{detalleDeposito.deposito.codigoDni}" />
                </td>
            </tr>
            <!-- more data to present to the users. -->
        </table>
    </fieldset>
</h:form>

лица-config.xml:

<managed-bean>
    <managed-bean-name>formaCobroLiqDocCartera</managed-bean-name>
    <managed-bean-class>com.abaco.presentacion.managedbean.PFormaCobroLiqDocCartera</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
    <managed-bean-name>listaDepositoNoIdentificado</managed-bean-name>
    <managed-bean-class>com.abaco.presentacion.managedbean.PListaDepositoNoIdentificado</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
    <managed-bean-name>detalleDeposito</managed-bean-name>
    <managed-bean-class>com.abaco.presentacion.managedbean.PDetalleDeposito</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

Если вам нужно что-то еще, чтобы проверить проблему, просто попросите об этом, и я опубликую это, как только смогу. Кстати, извините, что ничего не написал за последние 8 часов, когда я спал =(.

РЕДАКТИРОВАТЬ 2: Я рассмотрел эту проблему в других веб-обозревателях, и в результате проблема возникла только в злобном IE8 :(. Есть идеи, что делать, чтобы предотвратить это странное поведение?


person Luiggi Mendoza    schedule 01.02.2012    source источник
comment
Не могли бы вы поделиться исходным кодом?   -  person Adrian Mitev    schedule 02.02.2012
comment
Откуда вы знаете, что MB3 создается только один раз?   -  person prajeesh kumar    schedule 05.02.2012
comment
@prajeeshkumar Потому что, когда я перехожу на страницу 3, отображается та же информация. В конструкторе MB3 я добавляю эту логику, чтобы получить некоторые данные из переменной сеанса, которая установлена ​​в MB2. Кроме того, я меняю эту переменную сеанса в MB2, когда выбираю переключатель и до того, как страница B показывает страницу C или закрывается этой кнопкой Select (которая не была опубликована в коде страницы B) и возвращается к MB1, где информация отображается правильно.   -  person Luiggi Mendoza    schedule 05.02.2012


Ответы (1)


После серфинга в Интернете я нашел эту статью, которая мне помогла. Я следовал этой конфигурации, и теперь мои страницы A, B и C работают.

РЕДАКТИРОВАТЬ: Моя проблема была просто в конфигурации IE 8. Но была еще одна проблема с PageXBean с тегом RichFaces 3.3.3 @KeepAlive. Когда я открыл pageX.jsp с помощью функции showDialog js, в первый раз она работала хорошо, но со второго раза она показывала ошибку, и конструктор управляемого компонента даже не вызывался. Это сводило меня с ума, потому что я понятия не имел об этом, пока мой коллега не высказался. Я покажу вам проблему в деталях:

лица-config.xml:

<managed-bean>
    <managed-bean-name>pageX</managed-bean-name>
    <managed-bean-class>com.abaco.presentacion.managedbean.PageXBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

Класс бобов:

@KeepAlive(ajaxOnly=false)
public class PageXBean {
    //some attributes...
    public PageXBean() {
        ClassX oClassX = new ClassX();
        //set data into oClassX ...
        try {
            FacesContext objFC = FacesContext.getCurrentInstance();
            Object request = objFC.getExternalContext().getRequest();
            HttpServletRequest objServletRequest = (HttpServletRequest)request;
            HttpSession objSesion = objServletRequest.getSession();
            objSesion.setAttribute(UConstants.SessionVars.CLASS_X, oClassX);
        } catch (Exception objEx) {
            System.out.println("Problema al registrar variable de sesión: " +
                objEx.getMessage());
      }
    }
    //more methods and stuff...
}

Итак, сначала проблем не было, НО дело в том, что значение CLASS_X было таким же, как и у управляемого компонента:

public class UConstants {
    public static class SessionVars {
        public static String CLASS_X = "pageX";
    }
}

В этом был корень наших проблем. Когда он изменил значение на CLASS_X = "pageX2" все стало нормально работать.

Надеюсь, это кому-нибудь поможет.

person Luiggi Mendoza    schedule 06.02.2012
comment
Как именно это решит проблему для всех остальных посетителей сайта? Собираетесь ли вы показать какое-то предупреждающее сообщение о том, что они должны изменить настройки своего браузера, чтобы заставить ваш сайт работать? - person BalusC; 07.02.2012
comment
@BalusC извините за редактирование моего вопроса спустя столько времени. В браузере не было предупреждения, просто странное поведение, но это была конфигурация IE8. Я описал основную проблему и решение. - person Luiggi Mendoza; 16.02.2012