servletで共通のインスタンスを作成する方法をおしえてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/04 13:54
2015/04/04 14:00
回答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総合スコア1339
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/05 07:30
2015/04/05 08:28
2015/04/05 11:06
0
>ただ、ページを読み出す順番によってはインスタンスが生成されてない事があるのですが
どのように対応するんですか?
サーブレットには事前ロード機能があるので、それと初期化メソッド(確かinit)を組み合わせれば行けるかと思います
事前ロード機能についてはこちらが参考になるかと思います
http://docs.oracle.com/cd/E18355_01/web.1013/B31859-01/invoke.htm#895480
投稿2015/04/05 11:27
総合スコア13
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
同一サーブレット(例えばLoginServlet)内で共通の(共有する)インスタンスということでしょうか?
それならstatic変数で解決できそうですね
それとも異なる複数のサーブレット間で共通のインスタンスということでしょうか?
この場合はコンテナのapplicationスコープを使う方法やstaticなフィールドとメソッドを持つファクトリークラスを使う方法などが考えられます
投稿2015/04/04 14:05
総合スコア13
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/05 07:33
2015/04/05 07:38
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。