- PR -

JSP、サーブレットのセッションについて(Struts使用)

1
投稿者投稿内容
たまこ
常連さん
会議室デビュー日: 2005/01/12
投稿数: 25
投稿日時: 2005-01-12 21:24
はじめまして。
Javaを始めて1ヶ月弱のたまこと申します。
現在、WEBで人事情報を管理する簡単なプログラムを作っています。

ログイン画面でユーザIDとPasswordを入力すると、フレームを使った画面に遷移します。
Strutsを使用していますので、アクションクラスでセッションの設定(ユーザID)をし、
次の画面のアクションクラスでセッション情報(ユーザID)の取得をするように作成しています。
しかし、デバッグをしてみると、次の画面のアクションクラスでユーザIDが取得できません。
なぜ取得できないか、全く見当がつきません・・・。

処理の流れは以下のような感じです。
-------------------------------------------------------------------
Login.jsp(ログイン画面)

PostDataForm(ActionFormBean set、get、Validateチェックなど)

PostDataAction(ActionClass セッションの確保)
↓success
main.jsp(次画面のframeset frame分割だけしてます。
     2つのframeの一方が、LoginDataForm.doに遷移するよう設定してます。)

LoginDataForm(ActionFormBean 特に何もしてません)

LoginDataAction(ActionClass セッション情報を取得)

logind.jsp(セッション情報で取得したユーザIDを表示)
---------------------------------------------------------------

PostDataActionのソース(一部省略)です。
public final class PostDataAction extends Action {
public ActionForward execute (ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res){

ServletContext context = getServlet().getServletContext();
PostDataForm postDataForm = (PostDataForm)form;

//ユーザ情報の保持
UserData currentUser = UserDataFactory.getInstance(req);
if (!currentUser.isAuthenticated()) {
currentUser.setUserId(postDataForm.getUserID());
try {
UserAuthenticator.checkLogin(currentUser, postDataForm.getUserPass());
}
catch (AuthenticationException ae) {
// 失敗した場合
}

if (!currentUser.isAuthenticated()) {
// ログイン失敗
}

// 以降、成功した場合の処理
}
//session確保
HttpSession session = req.getSession(true);
req.setAttribute("userData", currentUser);
List messages = (List)context.getAttribute("PKG.messages");
if (messages == null) {
messages = new LinkedList();
context.setAttribute("PKG.messages",messages);
session.setAttribute("user",messages);
}
messages.add(0, form);
List unmodifiable = Collections.unmodifiableList(messages);

return (mapping.findForward("success"));
}
}
---------------------------------------------------------------------
LoginDataActionのソース(一部省略)です。

public final class LoginDataAction extends Action {
public ActionForward execute (ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res){

HttpSession ses = req.getSession(false);
String userData = (String)ses.getAttribute("userData");
↑↑↑userDataがnullになってしまう↑↑↑
ses.setAttribute("userData", userData);

//ユーザ情報の保持
UserData currentUser = UserDataFactory.getInstance(req);
req.setAttribute("userData", currentUser);
return (mapping.findForward("success"));

}
}

----------------------------------------------------------------------
環境は以下の通りです。
サーバ環境:SuseLinux、j2sdk-1.4.2_05、Tomcat5.0、struts1.2.4
開発環境:WindowsXP、eclipse

以上、些細なことでも構いませんので、お知恵をお貸しください。
よろしくお願いします。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2005-01-12 21:37
永井です。

落ち着きましょう。setしている箇所は

引用:
コード:

req.setAttribute("userData", currentUser);
(省略させていただきまし)
session.setAttribute("user",messages);




となっています。
requestにセットしたキーでsessionから取り出そうとしても何も出てきません。
#あと、本当に受け渡ししたいのはUserDataオブジェクトなのかStringオブジェクトなのかも落ち着いて考えましょう

[ メッセージ編集済み 編集者: 永井和彦 編集日時 2005-01-12 21:40 ]
たまこ
常連さん
会議室デビュー日: 2005/01/12
投稿数: 25
投稿日時: 2005-01-14 01:45
>永井様
お返事をくださり、どうもありがとうございました。
お陰様で解決するに至りました。
お恥ずかしながら、ソースの30%が本のコピー、
60%が先輩のソースのコピーで、
何も理解せずに上辺だけを見ていた結果のミスでした。

その後、ソースへコメントを付加しつつ、処理の流れを追ってみると、
段々と何をしているのかが見えてきました。
やはり一字一句追って理解していかないとダメですね。。

本当に助かりました。どうもありがとうございました。
今後またお世話になることがあると思いますが、
どうぞよろしくお願いします。
1

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