質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

3回答

2496閲覧

servlet 共通インスタンス

HiroshiIwasaki

総合スコア16

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2015/04/04 13:07

servletで共通のインスタンスを作成する方法をおしえてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argius

2015/04/04 13:17

共通のインスタンスを何に使うのかを書いていただくと、より詳しい回答が得られると思います。
HiroshiIwasaki

2015/04/04 13:54

Serlvet1のdoGet()で共通のインスタンスの値を更新して、 Serlvet2のdoGet()でその結果を取得するという事がしたいのですが
argius

2015/04/04 14:00

もうひとつ教えてください。 Serlvet1をAさんが実行して、次にBさんが実行して、さらにもう一度Aさんが実行した場合は、そのインスタンスの値はどうなるイメージでしょうか。
guest

回答3

0

ベストアンサー

環境がJavaEEということであれば、CDIにより可能です。
共有したいオブジェクト(Class)をSessionScopedアノテーションで定義し、servlet側はオブジェクトを
Injectすれば良いです。以下はCounterClassを2つのservretで共有する例です。

環境は
JavaEE Api 7.0
glassfish 4.1
IDEはNetBeans8.0.2です。

lang

1package pkg; 2 3import java.io.Serializable; 4import javax.enterprise.context.SessionScoped; 5 6@SessionScoped 7public class Counter implements Serializable{ 8 9 private Integer c=0; 10 11 public void Counter() { 12 } 13 14 public void countup(){ 15 c+=1; 16 } 17 18 public Integer getC() { 19 return c; 20 } 21 22 public void setC(Integer c) { 23 this.c = c; 24 } 25 26}

lang

1package pkg; 2 3import java.io.IOException; 4import java.io.PrintWriter; 5 6import javax.inject.Inject; 7 8import javax.servlet.ServletException; 9import javax.servlet.annotation.WebServlet; 10import javax.servlet.http.HttpServlet; 11import javax.servlet.http.HttpServletRequest; 12import javax.servlet.http.HttpServletResponse; 13 14@WebServlet(name = "NewServlet1", urlPatterns = {"/NewServlet1"}) 15public class NewServlet1 extends HttpServlet { 16 17 @Inject 18 Counter counter; 19 20 protected void processRequest(HttpServletRequest request, HttpServletResponse response) 21 throws ServletException, IOException { 22 response.setContentType("text/html;charset=UTF-8"); 23 try (PrintWriter out = response.getWriter()) { 24 /* TODO output your page here. You may use following sample code. */ 25 out.println("<!DOCTYPE html>"); 26 out.println("<html>"); 27 out.println("<head>"); 28 out.println("<title>Servlet NewServlet1</title>"); 29 out.println("</head>"); 30 out.println("<body>"); 31 counter.countup(); 32 out.println("<h1>servlet1 countup Value in " + counter.getC().toString() + "</h1>"); 33 out.println("</body>"); 34 out.println("</html>"); 35 } 36 } 37 38 39 @Override 40 protected void doGet(HttpServletRequest request, HttpServletResponse response) 41 throws ServletException, IOException { 42 processRequest(request, response); 43 } 44 45 @Override 46 protected void doPost(HttpServletRequest request, HttpServletResponse response) 47 throws ServletException, IOException { 48 processRequest(request, response); 49 } 50 51 @Override 52 public String getServletInfo() { 53 return "Short description"; 54 }// </editor-fold> 55 56} 57

lang

1package pkg; 2 3import java.io.IOException; 4import java.io.PrintWriter; 5import javax.inject.Inject; 6import javax.servlet.ServletException; 7import javax.servlet.annotation.WebServlet; 8import javax.servlet.http.HttpServlet; 9import javax.servlet.http.HttpServletRequest; 10import javax.servlet.http.HttpServletResponse; 11 12@WebServlet(name = "NewServle2t", urlPatterns = {"/NewServlet2"}) 13public class NewServlet2 extends HttpServlet { 14 15 @Inject 16 Counter counter; 17 18 protected void processRequest(HttpServletRequest request, HttpServletResponse response) 19 throws ServletException, IOException { 20 response.setContentType("text/html;charset=UTF-8"); 21 try (PrintWriter out = response.getWriter()) { 22 23 out.println("<!DOCTYPE html>"); 24 out.println("<html>"); 25 out.println("<head>"); 26 out.println("<title>Servlet NewServlet2</title>"); 27 out.println("</head>"); 28 out.println("<body>"); 29 30 counter.countup(); 31 out.println("<h1>servlet2 countup Value in " + counter.getC().toString() + "</h1>"); 32 33 out.println("</body>"); 34 out.println("</html>"); 35 } 36 } 37 38 @Override 39 protected void doGet(HttpServletRequest request, HttpServletResponse response) 40 throws ServletException, IOException { 41 processRequest(request, response); 42 } 43 44 @Override 45 protected void doPost(HttpServletRequest request, HttpServletResponse response) 46 throws ServletException, IOException { 47 processRequest(request, response); 48 } 49 50 @Override 51 public String getServletInfo() { 52 return "Short description"; 53 }// </editor-fold> 54 55}

投稿2015/04/05 01:03

編集2015/04/05 01:14
BlueMoon

総合スコア1339

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HiroshiIwasaki

2015/04/05 07:30

ご回答ありがとうございます。 @SessionScoped,@Injectですか!!Tomcat7で対応可能か調べてみます。
BlueMoon

2015/04/05 11:06

Tomcat7にはCDIを利用できるプラグインが有るのですね。 失礼しました、コメント訂正いたします。
guest

0

>ただ、ページを読み出す順番によってはインスタンスが生成されてない事があるのですが
どのように対応するんですか?

サーブレットには事前ロード機能があるので、それと初期化メソッド(確かinit)を組み合わせれば行けるかと思います
事前ロード機能についてはこちらが参考になるかと思います
http://docs.oracle.com/cd/E18355_01/web.1013/B31859-01/invoke.htm#895480

投稿2015/04/05 11:27

Yahagi

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

同一サーブレット(例えばLoginServlet)内で共通の(共有する)インスタンスということでしょうか?
それならstatic変数で解決できそうですね

それとも異なる複数のサーブレット間で共通のインスタンスということでしょうか?
この場合はコンテナのapplicationスコープを使う方法やstaticなフィールドとメソッドを持つファクトリークラスを使う方法などが考えられます

投稿2015/04/04 14:05

Yahagi

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HiroshiIwasaki

2015/04/05 07:33

ご回答ありがとうございます。 applicationスコープで実現できました。
HiroshiIwasaki

2015/04/05 07:38

ただ、ページを読み出す順番によってはインスタンスが生成されてない事があるのですが どのように対応するんですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問