1

Javaを学び始めたばかりですが、Javaサーバーの作成に問題があります。

HTMLにはフォームが必要であり、JavaScript witchはそのフォームを毎秒送信します(POSTメソッドによる)。フォームには、ユーザーIDの値を含む非表示フィールドが必要です。サーバーはリクエストでユーザーIDを探す必要があります。新しいユーザーに新しいIDを提供し、訪問したユーザーにIDを表示する必要があります。

各フォームの送信後、碑文は次のように変更されます:null、2、null、2、null、2....コードは次のとおりです。

public class ServerConnect extends AbstractHandler{
         private AtomicInteger ids = new AtomicInteger(0);    
         private String userId;

         public void handle(String target,
         Request baseRequest,
         HttpServletRequest request,
         HttpServletResponse response)    throws IOException, ServletException
         {

             response.setContentType("text/html;charset=utf-8");
             response.setStatus(HttpServletResponse.SC_OK);
             baseRequest.setHandled(true);
             response.getWriter().println(PageGenerator.generateForm(userId));
             userId = request.getParameter("userId");

             if (userId == null){
                 ids.getAndIncrement();
                 userId = ids.toString();
             }        
          }

         public static void main(String[] args) throws Exception {

               Server server = new Server(8080);
               server.setHandler(new ServerConnect());
               server.start();
               server.join();
        }
}

public class PageGenerator {

    public static String generateForm(String val){
        String htmlCode = null;

        htmlCode = "...
             <script>
                function reload(){ 
                   document.forms['MainForm'].submit();
                }
                setTimeout("reload()", 1000); 
             </script>    
             .... + val + ...
             <form id='MainForm' method = 'POST'>
                 <input type = "hidden" name = "userId" value = \""+ val + \""> 
             <form>
                             ...       
    return htmlCode;
    }    

}

ユーザーIDが2に等しい理由と、ユーザーがIDを取得した後、値がnullに変更され、次に2に変更される理由がわかりません。

4

1 に答える 1

3

userIdが解決される前にページをレンダリングしているようです。あなたがPageGenerator.generateForm(userId)チェックする前にあなたは持っていますif(userId == null)

また、これは(ただし単一の不可分操作)AtomicLong.getAndIncrement()と同様の複合操作であることを理解する必要があります。i++

したがって、次のようなコードが必要です。

if (userId == null){
     userId = ids.getAndIncrement();
} 

最後に、ライフサイクルについてはわかりませんAbstractHandlerが、クラスの新しいインスタンスが1つおきにJettyによってインスタンス化されていると想定するのが妥当です。ids「インスタンス」フィールドとしてスコープされているため、新しいリクエストで破棄されます(したがって、効果的にリセットされます)。

Jettyのスレッドモデルに関する回答をここで編集します: Jetty Architecture

これを修正するには、複数のリクエストに耐えられるように、idsとして宣言する必要があります(したがって、効果的に「シングルトン」IDジェネレーターにする必要があります)。static finalおもちゃのアプリケーションには問題ありませんが、本番コードで必ずしも行う必要はありません。

于 2012-09-25T16:23:11.053 に答える