1


まず、私の質問を読んでくれてありがとう.. 私はサーブレットのプログラミングの初心者で、この問題を思いつきました: 私の webApplication では、異なるユーザーが同じ変数にアクセスできます。My webApplication をうまく構築できていない気がするので、紹介します。私のJSPページでは、サーブレットを呼び出して何らかのプロセスを実行したい場合、常に次の方法で呼び出します。

<a href="MyServlet?check">Some Html Code</a>
<a href="MyServlet?show">Some Html Code</a>

私がこの方法を選んだのは、JSP からサーブレットにパラメーターを渡したかったからです (この場合は「チェック」、サーブレットに「やあ、ユーザーがチェック ボタンをクリックしました」と通知するため) - (この方法を使用できますか別の方法?)とにかく!だから、MyServlet で私はこれを書いています:

MyServlet

import javax.servlet.http.HttpServlet
//i import and many others..

public class MyServlet extends HttpServlet{
    private int count1; //these are the variables that see all the users
    private String Title;

    protected void processRequest(HttpServletRequest request, HttpServletResponse
           response)throws ServletException, IOException {

           if(request.getQueryString().equals("check")){
                 //do some stuff and then put a value (its not random) in the count1
                 count1 = 10; //lets say this value its 10 for a user1.
                 request.setAttribute("count", count1);           
                 RequestDispatcher disp = getServletContext().getRequestDispatcher("/page1.jsp");
                 disp.forward(request, response);
           }
           else if (request.getQueryString().equals("show")){
                 //do some stuff and then put a value in the count1
                 title = "title"; //same here
                 request.setAttribute("title", title);
                 RequestDispatcher disp = getServletContext().getRequestDispatcher("/page2.jsp");
                 disp.forward(request, response);
           }
     }

そのため、MyServlet では、jsp 内のすべてのリンクに対して if-else ステートメントをネストしました。冒頭で述べたように、アプリケーション内のすべてのユーザーは同じ変数にアクセスできます。したがって、user1 がボタンをクリックした後に変数 count1 が値 10 を取得し、別の user2 が同じボタンをクリックして変数が別の値 (たとえば 20) を取得した場合、user1 の値も 20 になります...

IメソッドprocessRequest内に変数の定義を入れようとしましたが、最初に変数を初期化する必要があります。使用するIDE環境として、これらの変数を使用する行で変数が初期化されていない可能性があることを警告します.しかし、私は変数を初期化したくありません。なぜなら、サーブレットを呼び出すたびにすべての変数が初期化され、以前の値が失われるからです..

私は何をすべきか?どうもありがとう!

4

2 に答える 2

2

ほとんどのサーブレット コンテナには、すべてのユーザーのすべてのリクエストを処理するサーブレット クラスの単一のインスタンスがあります。

ユーザーごとに変数が必要な場合は、HTTP セッションを作成し、そこに変数を保存する必要があります。何かのようなもの

HttpSession session = request.getSession(true);
Integer count = (Integer) session.getAttribute("count");
if (count == null) {
    count = Integer.valueOf(10);
}
// Do stuff with count
session.setAttribute("count", count);
于 2013-08-30T08:36:11.827 に答える
2

サーブレット エンジンは、単一のサーブレット インスタンス (スレッド アンセーフ) を作成し、Web アプリケーションの全期間にわたって保持します。

これは、サーブレット レベルで設定されたすべてのプロパティが、これらの機能にアクセスするすべてのスレッド (呼び出し、ユーザーなど) 間で共有されることを意味します。

したがって、リクエストまたはセッションの値を処理するためにサーブレット属性を設定しないでください。

また、GET 経由でパラメーターを送信するには、キー/値のコレクションとして通知する必要があります。

このようにして、リクエストの getParameter() メソッドを介してこれらのパラメーターにアクセスできます。

したがって、コードに適用します。

<a href="MyServlet?action=check">Some Html Code</a>
<a href="MyServlet?action=show">Some Html Code</a>

ここで、「アクション」というパラメーターをサーブレットに送信しています。取得するには:

public class MyServlet extends HttpServlet{

   //removed instance level properties

    protected void processRequest(HttpServletRequest request, HttpServletResponse
           response)throws ServletException, IOException {

           String action=request.getParameter("action");
           //add some validation code here on the "action" value
           if(action.equals("check")){
                 //do some stuff and then put a value (its not random) in the count1
                 int count1 = 10; //lets say this value its 10 for a user1.
                 request.setAttribute("count", count1);           
                 RequestDispatcher disp = getServletContext().getRequestDispatcher("/page1.jsp");
                 disp.forward(request, response);
           }
           else if (action.equals("show")){
                 //do some stuff and then put a value in the count1
                 String title = "title"; //same here
                 request.setAttribute("title", title);
                 RequestDispatcher disp = getServletContext().getRequestDispatcher("/page2.jsp");
                 disp.forward(request, response);
           }
     }

以上です。

于 2013-08-30T08:32:05.137 に答える