度々の質問で申し訳ないです…。
「セッション管理」がどうしてもよく分かりません。
書籍やWeb上でいろんな説明を読んで頭では理解したつもりなんですが
実際使う段になるとつまづいてしまいます。
そこで質問です。
html → Servlret1 → JSP1 → Servlet1 → JSP2 → JSP3
このような遷移の中でセッション管理を行いたいと思っています。
今、JSP2までは無事にセッションオブジェクトに保存されたデータを
参照することができていますが、JSP2からJSP3に移るときに
nullが渡されてしまうのです。
一度、Servlet1 へ制御を戻さなければだめなのでしょうか?
具体的なコードを以下に掲載します。
よろしくお願いします。

========= Servlet1 でセッション開始
//セッションを得る
HttpSession thisSession = req.getSession(true);
//セッションに保存
req.getSession(false).setAttribute("Login","true");

========= JSP2 で受け取る
/* ここではちゃんと"true"が返ってきます。 */
//セッションオブジェクトから取り出す
String login = (String)request.getSession(false).getAttribute("Login");

========= JSP3 で受け取る
/* ここで null が帰ってきてしまいます。
String login = (String)request.getSession(false).getAttribute("Login");

A 回答 (3件)

No2の回答補足について。



間違っちゃいないと思います。
それでも可能なはずです。
formのアクションで飛ばす場合、他の方法だと、
action="..."で指定するアドレスの末尾に、セッションIDを
附加するのなんかがよく使われるんじゃないでしょうか。
http://....target.jsp;jsessionid=xxxx だったっけ。
最近使ってないから正確に覚えてないですが。

この回答への補足

http://hostname/servlet/MyServlet$sessionid=xxxx …
とかいうやつですね。
セッションIDが丸見えになってセキュリティ上問題があるからって、
クッキーに保存するんでしたっけ??
今一番頭が混乱してるのが「セッション」なので、これから
まだまだ勉強します。なかなか奥が深いです・・・。

補足日時:2002/03/11 15:15
    • good
    • 0

request.setAttribute(...)



したうえで、

<jsp:forward page="..." />

すれば受け渡しできます。

この回答への補足

ありがとうございます。
それは、文字列とか画像とかをクリックして次のページへ移動…
ってしたいときには使えないのですか?
結局、JSP2で<input type="submit" > を使って、ボタンを押したら
一度Servlet1に制御を移して、それからJSP3にforwardっていう
やり方にしてしまいました。

セッション管理は、<jsp:useBean />を使う方法に挑戦してみました。
あまりよく分かってないかもしれませんが、、、
簡単に言うと、値を受け取って変数に代入するメソッド(setHoge)と、
代入された値を返すメソッド(getHoge)を持つHoge.classを作って、
JSPで
<jsp:useBean id="hoge" scope="session" class="Hoge" />
と記述してから
hoge.setHoge("aaa");
とか
String Str = hoge.getHoge(); //"aaa"が返って来る
という使い方をする…ので合ってますか??
今のところ、これでうまくいってるのですが、
この方法が合ってるのかどうかがよく分からない状態です…。

補足日時:2002/03/08 13:00
    • good
    • 0

JSP2からJSP3に遷移する時に、ちゃんとリクエストをforwardする


コーディングをしていないのじゃないでしょーか?
(Servlet1→JSP2へのforwardと同じ手順が必要です。
 これしないと、セッションが切れます。)
そもそもJSPに対しては、属性データをJavaBeansに詰め込んで
jsp:useBeanタグでscore="session"を指定して取り出すのが
今時の定石かも。お試しあれ。

参考URL:http://www02.u-page.so-net.ne.jp/qa2/masa_o/tsjs …

この回答への補足

JSP2 → JSP3 の移動は、
"<a href=\"http://.../JSP3.jsp?id=" + userid + "\">■</a>"
こんな風にしちゃってるんですけど…。
「■」にJSP3.jspのリンクを貼っちゃってる、って言っていいのかな?
これじゃ、requestがforwardされないってことですね?

Tiny Samplesは読んでいたのですけど、どうにも理解できなくて…。
どこかで同じような推奨(jsp:useBeanを使うべし)がされていたのを見ましたが、
やはりこれが定石ですか。挑戦してみようかな…。

補足日時:2002/03/07 15:50
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QjspからServletを呼び、元のjspページに戻るにはどうしたらよいですか?

・jspページにあるボタンを押すとServletに値を渡す。
・Servletで処理をする。
・処理の結果を元のjspページに表示する。

というプログラムを作りたいと考えています。
jspページ→Servletで処理をする、という所までは出来たのですが
その後元のページに戻すというところで困っています。

jspページは複数(十数ページ)あり、Servletは1つです。
a.jsp→Servlet→a.jsp
b.jsp→Servlet→b.jsp
このように、どのjspページから呼ばれても、元のjspページに
戻したいのですが、どのようにすれば実現できるでしょうか?

Aベストアンサー

doGetメソッドなら
import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class サーブレット名 extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
try {
res.sendRedirect(new URI(req.getHeader("referer")).getPath());
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
}
(JDKやサーバーなどの環境、eclipse等を使用しているかなど、詳しく書いたほうがいいですよ^^!ロジック自体はもっといいものがあるかどうか検討してみてください。sendRedirectメソッドはリクエスト属性を保持しないので、必要な場合はRequestDispatcher#forwardメソッドの使用も考えられます。その場合はパスの記述が/アプリ名/ファイル名ではなく/ファイル名 になりますが(余談))

doGetメソッドなら
import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class サーブレット名 extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
try {
res.sendRedirect(new URI(req.getHeader("referer")).getPath());
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
}
(JDKやサーバーなどの環境、eclipse等を使用しているかなど、詳し...続きを読む

QServletからJSPに遷移させた後もServletに制御を戻したいんですが

Java初心者です。宜しくお願いします。
現在、ServletからJSPに対してIncludeまたはForward
した後にServlet側にて処理を継続させる方法が
ないか調べています。
Forwardは×かなというところ
まではわかったのですがIncludeで行った場合
Servlet → JSPに遷移させた後に呼び出し元の
Servletに制御を戻す事は可能でしょうか。
また、一般的な方法がありましたらご教授お願いします。

宜しくお願いします。

Aベストアンサー

なぜそうしたいか?
というのがわからないので、適切な回答になっているか分かりませんが、

サーブレット
リクエストを受け取る

(継続させたい)処理を行う

JSPを返す

となっているんですよね?(今は)

サーブレット         スレッド
リクエストを受け取る

スレッドを生成して開始させる→処理を行う
↓              ↓
JSPを返す         処理を継続して行う

とすれば、サーブレットはスレッドを起動・開始すればすぐ処理が戻ってきますので、JSPを返した後も処理が継続できるのでは?

ただし、サーバーのリソースなどを考慮して下さいね。

QJSPからServletへの値の引渡し

JSPからServletへパラメータを渡そうとしています。
JSP同士のやり取りのようにrequest.getParameter
でやろうとするとNullPointerExceptionが出てしまいます。
ひょっとして私って何も分かってないのかも…。

JSPで、
<input type=hidden name="nickname" value="pinky">
として渡すべき値を設定しました。
そして、PostでServletを呼び出します。
呼び出されたServlet側で、この"nickname"を受け取りたいのです。
必要な情報があれば仰って下さい。補足致します。
よろしくお願いします。

Aベストアンサー

 参考URLのように、サーブレットのソースでdoPost()メソッドを定義してその中でrequest.getParameter()を呼ぶだけです。

 getParameter()でNullPointerExceptionが出るという症状は、厳密にはどちらでしょうか。

(A) getParameter()からNullPointerExceptionがthrowされる。
→getParameter()の引数値がnullになっていませんか?

(B) getParameter()の返り値がnullになる。
→getParameter()の引数値は正しい(JSP/HTMLの<INPUT>タグのNAME属性値に等しい)ですか?

参考URL:http://www.atmarkit.co.jp/fjava/onepoint/svltjsp/svltjsp04.html

QWTP,JSP,Servlet

WTPを使って開発をしています。
設定まではうまくいきました。
一応環境をお知らせします。
・WindowsVista
・WTP
・Tomcat6.0
・Java6.0

○実現したい事
JSP画面のフォームから送信ボタンでServletを呼ぶ。

○困っていること
JSP画面からServletが呼べない。
どうも
<form method="post" action="com.Servlet">
のactionの指定が間違っているようです。

○ソース環境
JSP : ルート/WebContent/JSP画面
Servlet : ルート/src/com/Servlet.java
class : ルート/build/classes/com/Servlet.class

○エラー
HTTPステータス 404 - /ルート/com.Servlet

Actionの指定をいろいろと試したのですがダメでした。
Sevletの代わりにJSP画面と同じフォルダ内の他のJSPファイルを指定したらうまくいってます。

情報が足りなかったらすいません。
どうぞよろしくお願いします。

WTPを使って開発をしています。
設定まではうまくいきました。
一応環境をお知らせします。
・WindowsVista
・WTP
・Tomcat6.0
・Java6.0

○実現したい事
JSP画面のフォームから送信ボタンでServletを呼ぶ。

○困っていること
JSP画面からServletが呼べない。
どうも
<form method="post" action="com.Servlet">
のactionの指定が間違っているようです。

○ソース環境
JSP : ルート/WebContent/JSP画面
Servlet : ルート/src/com/Servlet.java
class : ルート/build/classes/com/Servlet.clas...続きを読む

Aベストアンサー

サーブレットを作成した際、web.xmlにサーブレットが自動登録される。その値がどうなっているか確認してみる。web.xmlには<servlet-mapping>というタグがあって、そこに<url-pattern>というのがある。これが、公開されるURIになる。これの値をactionに指定すればいい。

ちなみに、クラスファイルの配置場所は気にしなくていい。WTPはビルドされた生成物の配置場所が特殊で、一般的なサーブレットの作法とは異なっている。だから、これは逆に下手に触らないほうがいい。

QEclipseでServlet/JSP

エクリプス2.0.2を使っていますが、Servlet/JSPを使った開発でひとつ疑問があります。
ちなみに、
http://www.atmarkit.co.jp/fjava/rensai2/eclipse03/eclipse03.html
で各種設定いたしました。
JSPを作成するのは問題ないのですが、
Servletのクラスを作るときに、新規→クラスで、ソースフォルダがプロジェクト名か、j2srcのどちらかしか選択できません。コンパイルして、そのクラスをclassesに移動してやりましたが、それを実行するときに、
http://localhost:8080/myWeb/servlet/Hello
とすると、Helloクラスをダウンロードするような形になってしまうのです。URLはなんパターンか変えてやってみましたが、できません・・・。
どうすればうまくサーブレットを作って実行できるのでしょうか?
宜しくお願いします。

Aベストアンサー

どんなむちゃくちゃをやったとしても、
/WEB-INF/classes 以下に配置したクラスを
ダウンロードするようなことにはなりません。

ダウンロードが開始されてしまうのは、
環境のせいではなく、もしかしたらプログラム中の
response.setContentType の箇所に誤りがあるから
かもしれません。

そこの一文を見せてもらえませんか?


人気Q&Aランキング

おすすめ情報