- PR -

メニュ画面の2重表示

投稿者投稿内容
Mxfull
大ベテラン
会議室デビュー日: 2006/02/15
投稿数: 146
投稿日時: 2006-03-02 15:42
t_yamoさん、簡単なPGで再現できました。PGは下記です。

frame.jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<f:view>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

</head>
<frameset rows="90,*">
<frame name="C" src="faces/pages/header.jsp" frameborder="1"/>
<frameset cols="154,*">
<frame name="A" src="faces/pages/menu.jsp" frameborder="1"/>
<frame name="B" src="faces/pages/main.jsp" frameborder="1"/>
</frameset>
</html>
</f:view>

menu.jsp
<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

<html>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE></TITLE>

</HEAD>
<body link="Black" vlink="Black" alink="Purple">
<f:view>
<h:form target="B">
<table>
<tr>
<td>
<table class="font4" cellspacing="0">
<tr>
<td>

<h:commandLink target="B" action="success1">
<h:outputText value="menu1" />
</h:commandLink>
</td>
</tr>
<tr>
<td>
<h:commandLink target="B" action="success2">
<h:outputText value="menu2" />
</h:commandLink>
</td>
</tr>
<tr>
<td>
<h:commandLink target="B" action="success3">
<h:outputText value="menu3" />
</h:commandLink>
</td>
</tr>
<tr>
<td>
<h:commandLink target="B" action="success4">
<h:outputText value="menu4" />
</h:commandLink>
</td>
</tr>
<tr>
<td>
<h:commandLink target="B" action="success5">
<h:outputText value="menu5" />
</h:commandLink>
</td>
</tr>
<tr>
<td>
<h:commandLink target="B" action="success6">
<h:outputText value="menu6" />
</h:commandLink>
</td>
</tr>
<tr>
<td>
<h:commandLink target="B" action="success7">
<h:outputText value="menu7" />
</h:commandLink>
</td>
</tr>

</table>
</td>
</tr>
<tr>
<td>
<table align="center" class="font5" width="260px">
<tr>
<td>
<h:commandLink target="B" action="success8">
<h:outputText value="menu8" />
</h:commandLink>

</td>
</tr>
<tr>
<td>
<h:commandLink target="B" action="success9">
<h:outputText value="menu9" />
</h:commandLink>
</td>
</tr>
<tr>
<td>
<h:commandLink target="B" action="success10">
<h:outputText value="menu10" />
</h:commandLink>
</td>
</tr>
<tr>
<td>
<h:commandLink target="B" action="success11">
<h:outputText value="menu11" />
</h:commandLink>
</td>
</tr>
<tr>
<td>
<h:commandLink target="B" action="success12">
<h:outputText value="menu12" />
</h:commandLink>
</td>
</tr>
<tr>
<td>
<h:commandLink target="B" action="success13">
<h:outputText value="menu13" />
</h:commandLink>
</td>
</tr>
<tr>
<td>
<h:commandLink target="B" action="success14">
<h:outputText value="menu14" />
</h:commandLink>
</td>
</tr>
<tr>
<td>
<h:commandLink target="B" action="success15">
<h:outputText value="menu15" />
</h:commandLink>
</td>
</tr>

</table>
</td>
</tr>
</table>
</h:form>
</f:view>
</body>
</html>

test1.jsp
<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE></TITLE>

</head>
<body >

<f:view>
<h:form target="B">
<h:outputText value="welcome to our house one!"/>
</h:form>
</f:view>
</body>
</html>

faces-config.xml
<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
<navigation-rule>
<from-view-id>/pages/menu.jsp</from-view-id>
<navigation-case>
<from-outcome>success1</from-outcome>
<to-view-id>/pages/test1.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>success2</from-outcome>
<to-view-id>/pages/test2.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>success3</from-outcome>
<to-view-id>/pages/test3.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>success4</from-outcome>
<to-view-id>/pages/test4.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>success5</from-outcome>
<to-view-id>/pages/test5.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>success6</from-outcome>
<to-view-id>/pages/test6.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>success7</from-outcome>
<to-view-id>/pages/test7.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>success8</from-outcome>
<to-view-id>/pages/test8.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>success9</from-outcome>
<to-view-id>/pages/test9.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>success10</from-outcome>
<to-view-id>/pages/test10.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>success11</from-outcome>
<to-view-id>/pages/test11.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>success12</from-outcome>
<to-view-id>/pages/test12.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>success13</from-outcome>
<to-view-id>/pages/test13.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>success14</from-outcome>
<to-view-id>/pages/test14.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>success15</from-outcome>
<to-view-id>/pages/test15.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>
Mxfull
大ベテラン
会議室デビュー日: 2006/02/15
投稿数: 146
投稿日時: 2006-03-02 15:50
t_yamoさん、上記のPGには画面用のJSPはご確認の時にtest1.jspと
似ているtest2.jsp〜test14.jspを別別に作ってください。同じのtest1.jspを
使えば再現できないようです。この簡単なPGにはJavaBeanは使っておりません。

大変なご迷惑をおかけします、宜しくお願いいたします。
_________________
t_yamo
常連さん
会議室デビュー日: 2006/02/16
投稿数: 21
投稿日時: 2006-03-02 16:30
うを。力作ですね。
ひとまずこれから動かしてみます。

先のメニュー項目7個/8個のときにもちょっと気になったのですが、Mxfullさんが使用しているJSF実装はMyFacesではなく別の実装でしょうか。
使用している実装とバージョンを記して頂けると助かります。
また、web.xmlの「javax.faces.STATE_SAVING_METHOD」は「server」でしょうか。

と言うのも、7個/8個のときは合計15ページ、今回も15ページなのですが、SunのJSF-RI_1.1_01の実装では「javax.faces.STATE_SAVING_METHOD」を「server」にしたときにデフォルトではコンポーネントツリーを15個まで保持するようにしています(おそらく他社製のJSF実装もJSF-RI_1.1_01とほぼ同じです)。
このコンポーネントツリーの保持数が影響してくるのは「ブラウザの戻りボタンを押す」とか「別フレームにウィンドウを表示する」です。
コンポーネントツリーの保持数を超えてアクセスした場合に「アクションが動いていないように見える(=実際にはリクエスト元のページが再表示されている)」という現象が発生します。

……と、ここまで書いて今回の現象がバッチリ上の挙動で説明できることに気がつきました。
フレームを分割している場合は「javax.faces.STATE_SAVING_METHOD」を「client」にする必要があります。

以下のスレッドの「2005-11-21 16:58」の書き込みに今回の現象のしくみがざくざくっと記されています(スレッドはMyFaces1.0.9に関しての記述ですが、MyFaces1.0.9とSun JSF-RI_1.1_01との違いは前者が1ページ、後者が15ページ保持するというところです)。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=26105&forum=12&start=8


[ メッセージ編集済み 編集者: t_yamo 編集日時 2006-03-02 16:32 ]
t_yamo
常連さん
会議室デビュー日: 2006/02/16
投稿数: 21
投稿日時: 2006-03-02 16:55
手元にあったのがMyFaces1.1.0でしたので、これでMxfullさんのコードを実験してみました。

「javax.faces.STATE_SAVING_METHOD」を「server」にして順番にメニューをクリックしてみたところ、右フレームに「welcome to our house one!」という画面とメニュー画面が交互に表示されました。
このケースではMyFaces1.1.0を使っているため、15ページ単位ではなく1ページ単位で今回の現象が発生しており、先の予想どおりの挙動となりました。

次に「javax.faces.STATE_SAVING_METHOD」を「client」にして順番にメニューをクリックしてみたところ、右フレームには常に「welcome to our house one!」という画面が表示され、今回の現象は発生しませんでした。
これも先の予想通りの挙動であり、問題が解消されていると考えられます。


[ メッセージ編集済み 編集者: t_yamo 編集日時 2006-03-02 16:57 ]
Mxfull
大ベテラン
会議室デビュー日: 2006/02/15
投稿数: 146
投稿日時: 2006-03-02 19:21
t_yamoさん,
大変なお手数をおかけしまして、有難うございます。
今からご確認いたします。
その結果を掲示板に発表します。
再び、有難うございます。
Mxfull
大ベテラン
会議室デビュー日: 2006/02/15
投稿数: 146
投稿日時: 2006-03-02 20:11
t_yamoさん、仰った通りでweb.xmlの設定を変更して
今回の現象は出てきていません。
長く悩んできている問題はご協力を得られて、一瞬に
解決されました。本当に有難うございました。
今後とも宜しくお願いいたします。

_________________

スキルアップ/キャリアアップ(JOB@IT)