- PR -

JSPinclude,paramアクションにおけるトラブルについて

1
投稿者投稿内容
shimtes
常連さん
会議室デビュー日: 2004/09/09
投稿数: 40
投稿日時: 2004-10-20 09:52
Tomcat4.1.27を利用しています。

サーブレット→A.jsp(B.jsp)のA.jspからB.jspをインクルードしている形で、
B.jspのサーブレットへのリンクから再度元のサーブレットを呼ぶと、B.jspの
部分が表示されない現象が発生しております。
jspを分割せずにB.jspの内容をA.jspに含めた状態では問題なく動作致します。

少しでもお気づきの点がありましたらアドバイスをよろしくお願いします。

★A.jsp
<%@ page language="java" contentType="text/html;charset=MS932" pageEncoding="Shift_JIS" %>

<%
String user_perms = (String)session.getAttribute("user_perms");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/htm14/loose.dtd">
<html>
<meta http-equiv="Content-Type" content="text/html; charset=MS932">
<meta http-equiv="Content-Style-Type" content="text/css">
<head>
<title>タイトル</title>
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body>
<%-- レフトメニュー --%>
<jsp:include page="leftmenu.jsp" flush="true" >
<jsp:param name="user_perms" value="<%=user_perms %>" />
</jsp:include>
</body>
</html>

★B.jsp
<%@ page language="java" contentType="text/html;charset=MS932" pageEncoding="Shift_JIS" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/htm14/loose.dtd">
<%
int intPrm=Integer.parseInt(request.getParameter("user_perms"));
%>
<ul>
<li><a href='サーブレットにリンク'>サーブレット</a></li>
</ul>
matobaa
常連さん
会議室デビュー日: 2002/12/26
投稿数: 21
投稿日時: 2004-10-20 10:53
もしかして最近一部でアツい Bug#31201:JSP includeで文字化け がらみか? と思って検証してみました。

なんのことはない。B.jsp (=leftmenu.jsp) の parseInt でコケてるだけっぽいです。$CATALINA_HOME/conf/localhost_log*.txt になにやらどろどろ出てきてます。A.jsp で、String user_perms = "999"; にしておけば問題なく表示されました。
当方の検証環境は Tomcat4.1.30 + JDK1.5です。

もしよかったら、上記バグエントリに投票(vote for this bug)してくださいませ。
バグ追跡システムに新規アカウントを登録(だれでもできます)すれば、一人3票まで投票できます。投票数が多ければ解決される可能性が上がります。

# String param = "999" と、かみ合わない表現をしていた部分を修正しました

[ メッセージ編集済み 編集者: matobaa 編集日時 2004-10-20 17:04 ]
shimtes
常連さん
会議室デビュー日: 2004/09/09
投稿数: 40
投稿日時: 2004-10-20 14:26
matobaaさん、アドバイスありがとうございます。

検証までして頂いて申し訳ありません。
paramの内容が問題ということですね。
何故同じセッションの値を取得して現象が異なるのか調べてみます。

投票についてはご協力させて頂きます。
shimtes
常連さん
会議室デビュー日: 2004/09/09
投稿数: 40
投稿日時: 2004-10-20 14:57
確認してみました。

matobaaさんのアドバイスより
A.jspのuser_permsの値とB.jspの渡されたuser_permsの値を表示してみました。
最初:A.jsp 7、B.jsp 7
リンククリック:A.jsp 7、B.jsp null

B.jspが表示されないのはmatobaaさんのご指摘の通り、nullが渡っていたことでしたが、
念のためA.jspで
String user_perms ="7";
と指定しましたが、やはりリンクをクリックした際はnullが渡りました。
したがって、リンクをクリックした際は何故かparamアクションがうまく動作していない
ような状況です。

記述方法、テスト方法その他アドバイスがありましたらよろしくお願いします。
matobaa
常連さん
会議室デビュー日: 2002/12/26
投稿数: 21
投稿日時: 2004-10-20 18:23
Tomcat 4.1.27を導入してみましたが、正常に動作しているように見えます。
B.jsp から、A.jsp へリンク(サーブレットを通さず)した場合と
B.jsp から、A.jsp へFormでPOST(同じくサーブレットを通さず)した場合を
確認しましたが、問題なく動作しています。

B.jspは以下のような感じで:
<a href='A.jsp'>サーブレット<%=intPrm%></a>
<form action="A.jsp" method="POST">
<input type="text" name="user_perms" value="<%=intPrm%>" />
<input type="submit" />
</form>

これ以上は、サーブレットやリダイレクトの動作などが絡んでくるので、再現できそうにありません……。情報レスですが、とりいそぎ動作報告まで。

request に getParameter と getAttribute があるのが気になります。
jsp:param ってどっち使うんだったっけ? というのは、まだ調べていません。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-10-20 19:24
引用:

request に getParameter と getAttribute があるのが気になります。
jsp:param ってどっち使うんだったっけ? というのは、まだ調べていません。


getParameterでいいと思います。おそらくインクルードされるJSPへのパスにパラメータを
付加してPageContext#include呼び出しているだけでしょう。

ちなみに、
JSPから生成されたソースの該当部分はどうなっているでしょうか?
インクルードするほうとされるほうで同名のパラメータを使っていますが名前を変えたら
どうなりますか?
shimtes
常連さん
会議室デビュー日: 2004/09/09
投稿数: 40
投稿日時: 2004-10-20 22:12
matobaaさん、ukさんアドバイスありがとうございます。

matobaaさん、何度もテストまでして頂きありがとうございます。

ukさん
>インクルードするほうとされるほうで同名のパラメータを使っていますが名前を
>変えたらどうなりますか?

現象は同じでした。user_permsをtestに変えてみました。

>JSPから生成されたソースの該当部分はどうなっているでしょうか?

上記の状態での該当部分です。
JspRuntimeLibrary.include(request, response, "leftmenu.jsp" + "?" + "test=" + java.net.URLEncoder.encode("" + user_perms), out, true);

参考になるか分かりませんが、サーブレットへのリンクでも別のサーブレットへの
リンクの場合は正常に表示されます。

Aサーブレット→A.jsp−B.jsp
Bサーブレット→C.jsp−B.jsp
B.jspのAサーブレットへのリンクをクリックすると現象発生
B.jspのBサーブレットへのリンクをクリックしても現象は発生しない
A.jsp,C.jspのB.jsp関係の記述は同一です。

お気づきの点がありましたらアドバイスをお願いします。
1

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