2012-02-01 2 views
-1

私が戦っているこの奇妙な状況があります。私は3つのページを持っています。それぞれA、B、Cと呼んでいます。すべてのページには、それぞれMB1、MB2、MB3というリクエストスコープの管理Beanがあります。 Aに入力すると、MB1が作成されます。 Aから、window.showModalDialogを呼び出してBを開き、Bを開くたびにMB2を開きます。私がページCをwindow.showModalDialogでBから呼び出し、MB3がに一度作成されると、奇妙さが始まります。このようなことをやっていて、これが起こったのは初めてです。リクエストスコープ内のマネージドビーンは作成されます

私はまた、a4j:keepAliveタグコンポーネントを使用するのと同様の(MB1とMB2は@KeepAlive注釈を持っていると言わなければならない、とMB3はきれいに管理Beanです。

私は問題を解決するために、任意のアイデアを開いています。私は現在、JSF 1.2、RichFacesの3.3.3とJBoss EAP 5.1で働いているあなたの時間と私の悪い英語のため申し訳ありませんのために

おかげで

EDIT 1:。!ページA、BおよびCのソースコードは、 :

ページA:

<!-- 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> 

ページB:

<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 :(。この奇妙な行動を防ぐために何をすべきか任意のアイデア?

+0

ソースコードを共有できますか? –

+0

MB3が1回だけ作成されることをどのように知っていますか? –

+0

@prajeeshkumar 3ページに行くと、同じ情報が表示されるので、 MB3のコンストラクタでは、このロジックを追加してMB2に設定されたセッション変数からデータを取得します。さらに、ラジオボタンを選択してpageBを表示する前に、このセッション変数をMB2で変更します。このselectボタン(pageBコードには投稿されていません)によって閉じられ、情報が正しく表示されるMB1に戻ります。 –

答えて

0

ウェブでサーフィンをした後、私はその構成を踏襲し、今、私のページにA、B、Cが動作します。私を助けてくれたthis articleを発見した。

編集:私の問題はちょうどIE 8の設定でしたが、RichFaces 3.3.3 @KeepAliveタグでPageXBeanに別の問題がありました.js関数でpageX.jspを開いたとき、fi最初はうまくいきましたが、2回目以降はエラーが表示され、マネージドBeanコンストラクタも呼び出されませんでした。これは私の同僚がポイントを与えたまで、それについての手がかりがなかったので私を狂って運転していました。私はあなたの深さの問題を紹介します:

のfaces-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... 
} 

だから、最初fiewでそこには問題はなかったが、事CLASS_Xの値がマネージドBeanと同じであるということでした。

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

これは私たちの問題の根本原因でした。値をCLASS_X = "pageX2"に変更すると、すべて正常に機能し始めました。

これは誰にも役立ちます。

+0

他のすべてのウェブサイト訪問者にとってこの問題をどの程度正確に解決できますか?あなたはあなたのウェブサイトを稼働させるためにブラウザの設定を変更しなければならないという警告メッセージを表示しますか? – BalusC

+0

@BalusC今回は結局私の質問を編集して申し訳ありません。ブラウザに警告はありませんでしたが、ちょっと変わった動作でしたがIE8の設定でした。私は大きな問題とその解決方法を説明しました。 –

関連する問題