2016-07-12 4 views
3

index.jsp前のデータにデータを追加するAjax?

<input type="text" onfocusout="show(this.value)" /> 
<div id="output"></div> 
<script type="text/javascript"> 

    function show(cat) 
    { 
     var output = document.getElementById("output"); 

     $.ajax({ 
      type:"get", 
      url:"fetchdata", 
      data:"cat="+cat, 
      success:function(responseJson){ 
       output.innerHTML = responseJson; 
      } 
     }); 
    } 

fetchdata.java

public class fetchdata extends HttpServlet { 
    Connection con =null; 
    PreparedStatement ps = null; 
    ResultSet rs = null; 
    ArrayList<String> pname = new ArrayList(); 
    ArrayList<String> iname = new ArrayList(); 
    ArrayList<String> cname = new ArrayList(); 
    ArrayList<Double> price = new ArrayList(); 

@Override 
protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 

    String cat = request.getParameter("cat"); 
    PrintWriter out= response.getWriter(); 

    try { 

     Class.forName("com.mysql.jdbc.Driver"); 
     con= DriverManager.getConnection("jdbc:mysql://localhost:3306/dealtime","root","root"); 
     ps = con.prepareStatement("Select images.product_name,image_name,company_name,price " 
       + "from images,products where images.product_name = products.product_name AND " 
       + " category_name = ?"); 

     ps.setString(1,cat); 
     rs=ps.executeQuery();   
     while(rs.next()) 
     { 
      pname.add(rs.getString("product_name")); 
      iname.add(rs.getString("image_name")); 
      cname.add(rs.getString("company_name")); 
      price.add(rs.getDouble("price")); 
     } 

     String json =new Gson().toJson(pname); 

     response.setContentType("application/json"); 
     out.println(json); 

    } catch (ClassNotFoundException | SQLException ex) { 
     Logger.getLogger(fetchdata.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

}

上記のコードが正常に動作しているが、複数のAJAXリクエストが行われたときにデータがIは、受信したデータに付加されています以前のAjaxリクエストからdivを新しいデータのみで更新したいだけでなく、複数のオブジェクトをレスポンスとして送信し、そのオブジェクトから値を抽出する方法を知りたいと考えています。

+0

これは実際には意味がありません。あなたはjsonレスポンスをhtmlとして扱い、 'output.innerHTML = responseJson;を実行するとappendがない場合、前のhtmlが置換されます – charlietfl

+0

@charlietflはい以前のhtmlを置き換える必要がありますが、なぜそれがしないのかわかりません同じ。 –

+0

これを再現するデモを作成します。 'show()'の 'cat'も定義されていません。ブラウザのコンソールでエラーが発生していませんか?表示されたコードは失敗するはずです – charlietfl

答えて

1

サーブレットはマルチスレッド化されているため、サーブレットコンテナは少数のインスタンスをインスタンス化しますが、各インスタンスを通じて複数のスレッド(要求ごとに1つ)を実行します。サーブレットクラスでインスタンスプロパティとして定義されたプロパティは、そのインスタンスを通じて実行されるすべてのスレッド(要求)間で状態を共有します。

クラスをインスタンス化して(newを呼び出す)、インスタンスプロパティはそのクラスのすべてのメソッドに表示され、その値は共有されます。サーブレットの場合、サーブレットコンテナはサーブレットのインスタンスを最低1つ作成します。そのため、パフォーマンス上の理由から、サーブレットのインスタンスを介して受信要求ごとに1つのスレッドが実行されます。これは、実行中の各スレッドがインスタンスプロパティの値を参照できることを意味します。メソッドのスコープ内でプロパティを移動すると、各スレッドに独自のコピーがあることを意味します。

すべてのプロパティの宣言をインスタンスレベルからdoGet()メソッド内に移動すると、状態は共有されなくなります。このようにサーブレット上で状態を共有することは、通常、悪い習慣です。

この動作は、ここでEEのチュートリアルで説明されて - 17.3.2を参照してください。 https://docs.oracle.com/javaee/7/tutorial/servlets003.htm#BNAFO

をまた、むしろ独自のJDBC接続を作成するよりも、それは(あなたがどのようにサーブレットコンテナ上でデータソースを定義するのがベストプラクティスですそれはあなたが実行しているものに依存します)、アプリケーションサーバーがあなたのために接続を管理できるようにします。必要に応じて、データソースから接続をプルするだけです。

質問の後半部分に答えるために、あなたが応答で複数のプロパティを含めるには、このようなあなたのJSONを構築することができます

{ 
    "pname" : "pname value", 
    "iname" : "iname value" 
    //etc 
} 

これらのプロパティのいずれかの場合は、それ自体がプロパティ、ネストされたオブジェクトを持って、そしてちょうど作成プロパティの1つの値として別のJsonオブジェクト

+0

それはうまくいきましたが、理由を少し説明してください。 –

+0

質問の2番目の部分に私を教えてもらえれば助かります –

+0

はもう少し詳しく述べました - これが助けてくれたら教えてください。 –

関連する問題