セッションタイムアウト時、その旨のページを表示すること考えてい
ます。表示方法をご存知の方、もしくは別のアプローチをご存知の方、
御教授下さい。

(1)セッションタイムアウトの検知はHttpSessionBindingListenerを使用。
(2)セッションタイムアウトしたときに表示するページは、用意している
  sessiontimeout.htmlにRequestDispatcherを用い、ディスパッチ。
(3)ディスパッチ処理は、セッションタイムアウト時に呼ばれる
  valueUnbound(...)メソッドに記述。
<問題点>
 RequestDispatcherを用いてディスパッチするときのメソッドは引数にHttpServletRequest,HttpServletResponseが必要です。
 これをvalueUnbound(...)メソッド内で行う場合、
上記2つの引数をどのように取得すればよいのでしょうか?
--------------------------------------------------------------------

public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {

HttpSession s = req.getSession(false);

if(s == null) {
   s = req.getSession(true);
   s.setAttribute("listener", this);
  }
}

 //中略

//HttpSessionBindingListener
public void valueUnbound(HttpSessionBindingEvent event) {
  System.out.println("valueUnBound");

//セッションタイムアウト時、sessiontimeout.htmlを表示
  ServletConfig config = this.getServletConfig();
  ServletContext context = config.getServletContext();
  RequestDispatcher rd =
    context.getRequestDispatcher("/sessiontimeout.html");
  rd.forward(req,res);
  //HttpServletReqest,HttpServletResponseをどう取得する?---
}

このQ&Aに関連する最新のQ&A

A 回答 (1件)

やったことが無いので想像で書きます。



servlet 自体を session に setAttribute する、ってことは、その servlet が
持つ属性もセッションに保持されているんじゃないかと想像します。

マニュアルを読む限り HttpSessionBindingListener.valueUnbound() は、セッション
から unbound されようとしているときに呼出されるように思えます。つまり、
このメソッドが呼ばれるときには、まだ unbound されていない、と。

なので、servlet の属性として request などを保存しておけば良いんじゃないで
しょうか?

public class MyServlet extends HttpServlet implements HttpSessionBindingListener {

HttpServletRequest req_;
HttpServletResponse res_;

 public void doPost(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, IOException {

  req_ = req;
  res_ = res;

  …
 }

 public void valueUnbound(HttpSessionBindingEvent event) {
  /*
  ここで、
  ((MyServlet)event.getSession().getAttribute("listener")).req_;
  で、保存した request が取得できるんじゃないか、と。
  */
 }
}

全くの思い付きなので、上手くいったら教えて下さい。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

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

Qclass Test_A {  main(){}}の実行順序は?

public class Test_A {
public static void main(){

int a = 0;
int b = 1;

}
}
例えば上のようなサンプルで何故 main()がクラスTest_A の中に挟まっているのでしょうか?実行順序としては main()が終了したら、クラスTest_A の方はどうなるのでしょうか? main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。よろしくお願いします。 

Aベストアンサー

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時には、Test_Aクラスのインスタンスは生成されません。
質問のコードでは変数a,bに値が代入され、それで終わりです。

Javaでは、(正確にはJavaVMは)実行するclassファイルにある、
String[]引数を持ったvoid mainメソッドを実行する仕様になっています。
しかし、mainメソッドを実行するときには何のインスタンスも生成されていないので、
何かのインスタンスのメソッドを実行することはできません。
なので、staticなメソッドでないとJavaVMが実行できないのです。
さらに、JavaVMからアクセス可能なスコープを与える必要があるので、
publicである必要もあるのです。

あとは、そのmainメソッドに指定されたコードを実行し、mainメソッドの最後まで処理が進んだら
そこでJavaVMが終了し、プログラムも終了します。

※細かい話ですが、main()からプログラムは始まりません。
正確に言うと、引数なしのmain()メソッドは他のメソッドと何ら代わりがありません。
プログラムを始めるには、
アクセススコープがpublicで、staticな戻り値のなく、引数にString配列を取るmainメソッド
であることが必要です。つまり、
public static void main(String[] args)
とするのが通常です。
試しに質問のコードをjavaコマンドで実行すると、NoClassDefFoundErrorが出るはずです。

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時...続きを読む

Q"try{}catch(){}"文で"close()"はどのように書けばよいのでしょうか。

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プログラム1
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


●プログラム2
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


なお、私の環境は以下の通りです。
OS: Microsoft Windows XP Professional SP2
開発環境:Eclipse 3.2.2
java: java version "1.4.2_13"

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プロ...続きを読む

Aベストアンサー

>私のこの考え方は正しいのでしょうか。
正しいです。質問者さんが書かれているやり方が一般的です。
念のため書いておきますが、outをtryの外で宣言しないとコンパイルが通りません。

まぁ、あくまでデザインパターンを学ぶための本ですから、細かなコーディングについて気にする必要はないでしょう(疑問を持つことは良いことですが)。

QJavaScriptで【window.google={kHL:"ja"};】という記述はどういう意味?

JavaScriptで【window.google={kHL:"ja"};】という記述はどういう意味?


YOUTUBE日本語版
http://jp.youtube.com/
のHTMLソースを見ていたら、



<script type="text/javascript">
    window.google={kHL:"ja"};
</script>


という記述を目にしたのですがこれはどういう意味あいというか目的のものなのでしょうか?


教えていただければ幸いです。

Aベストアンサー

これは、window.googleに'kHL'というキー(値は'ja')を持つ連想配列を
作成しています。

JavaScriptでの連想配列は

var 変数名 = {
キー : '値',
キー : '値',
:,
キー : '値'
};

というような感じで作成します。
キーはダブルクォートまたはシングルクォートで囲まなくても
いいようです。

参考URL:http://javascriptist.net/docs/basic_hash.html,http://www.openspc2.org/JavaScript/kouza2007/array/hash/index.html

QRequestDispatcher.forwardメソッドで遷移する際のURL

お世話になります。
JSP/サーブレットを使用してwebアプリケーションを作成しています。

タイトルの通りRequestDispatcher.forwardメソッドで遷移する際のURL
についてうまくいかず、原因がわからない為質問させて頂きます。
ご教授宜しくお願い致します。
Aproject/jsp/login.jsp
Aproject/jsp/top.jsp
Aproject/WEB-INF/src/servlet/Login.java
という3つのファイルを使用しています。

login.jspにて<form action="../Login" method="post">で
Login.javaサーブレットにIDとパスワードを渡し、
サーブレットで認証を行ったあと
RequestDispatcher.forwardメソッドにて以下のように
遷移するようになっています。
RequestDispatcher rd = request.getRequestDispatcher("./jsp/top.jsp");
rd.forward(request, response);

遷移はうまくいくのですが、top.jspが表示される時のURLが
http://localhost:8080/Aproject/jsp/top.jspとなるはずが、
http://localhost:8080/Aproject/Login
となってしまいます。
web.xmlの記述は
<servlet>
<servlet-name>Login</servlet-name>
<servlet-class>servlet.Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Login</servlet-name>
<url-pattern>/Login</url-pattern>
</servlet-mapping>
としています。
forwardメソッドではなく、sendRedirectメソッドを使用した場合
http://localhost:8080/Aproject/jsp/top.jsp
とうまくいきます。

どのような原因が考えられますでしょうか?
宜しくお願い致します。

お世話になります。
JSP/サーブレットを使用してwebアプリケーションを作成しています。

タイトルの通りRequestDispatcher.forwardメソッドで遷移する際のURL
についてうまくいかず、原因がわからない為質問させて頂きます。
ご教授宜しくお願い致します。
Aproject/jsp/login.jsp
Aproject/jsp/top.jsp
Aproject/WEB-INF/src/servlet/Login.java
という3つのファイルを使用しています。

login.jspにて<form action="../Login" method="post">で
Login.javaサーブレットにIDとパスワードを渡し、
...続きを読む

Aベストアンサー

そういう仕様です。
RequestDispatcherはリクエスト(URL)から実体のデータ(JSP)を隠匿します。

Qpublic static void main (String args[])

基本すぎて申し訳ありませんが、
public static void main (String args[])とはどういう意味を持っていますか?
教えてください。。

Aベストアンサー

staticとかの意味はNo1の方の説明以外にありません。

mainは最初に実行されるメソッドという説明がされますので、「クラスを実行する時の引数とは?」と引っかかっているのかもしれませんね。
これはコマンドライン引数と呼ばれます。

たとえば、次のプログラム

public class ArgsTest{
  public static void main(String[] args){
    System.out.println(args.length);
    for(int i = 0 ; i < args.length ; i++){
      System.out.println(args[i]);
    }
  }
}

これを
>java ArgsTest abcde fghij(エンター)
として実行するとabcdeとfghijが引数となります。

ちなみに、mainはpublicでstaticなメソッドなので、
public class ArgsTest2{
  public static void main(String args[]){
    tamesi();
  }
  void tamesi(){
    String[] test = {"abcde","fghij"};
    ArgsTest.main(test);
  }
}
のように、外部のクラスからクラス名.mainで呼び出せます。(この2つのプログラムは、私が悩んだ時に試しにつくったものです)

ちなみにargsはarguments(=引数)の略で、mainの引数として、よく使われます。
argvのほうはargument valueの略です。C言語を使っていた人の中にはargvを使う人がいるかもしれません。

staticとかの意味はNo1の方の説明以外にありません。

mainは最初に実行されるメソッドという説明がされますので、「クラスを実行する時の引数とは?」と引っかかっているのかもしれませんね。
これはコマンドライン引数と呼ばれます。

たとえば、次のプログラム

public class ArgsTest{
  public static void main(String[] args){
    System.out.println(args.length);
    for(int i = 0 ; i < args.length ; i++){
      System.out.println(args[i]);
    }
  }
}

...続きを読む


人気Q&Aランキング

おすすめ情報