Ajax将数据附加到以前的数据?

时间:2016-07-12 15:54:33

标签: java jquery ajax gson

index.jsp

<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请求时,数据会附加到我从前一个ajax请求收到的数据中。我只想用新数据更新div,我想知道如何发送多个对象作为响应并操纵它们从中提取值。

1 个答案:

答案 0 :(得分:1)

Servlet是多线程的,这意味着Servlet容器将实例化少量实例,但是通过每个实例运行多个线程(每个请求一个)。因此,作为实例属性在Servlet类上定义的属性将在通过该实例执行的所有线程(请求)之间共享状态。

如果实例化一个类(在其上调用new),那么实例属性对该类中的所有方法都是可见的,它们的值是共享的。对于Servlet,servlet容器至少创建一个Servlet实例,然后出于性能原因,通过该servlet实例为每个传入请求执行1个线程。这意味着每个执行线程都能够看到实例属性中的值。在方法范围内移动属性意味着每个线程都有自己的副本。

将所有属性的声明从实例级别移动到doGet()方法中,然后将不再共享该状态。以这种方式在Servlet上共享状态通常是不好的做法。

此行为在此处的EE教程中进行了解释 - 请参阅17.3.2: https://docs.oracle.com/javaee/7/tutorial/servlets003.htm#BNAFO

此外,最好不要创建自己的JDBC连接,而是在servlet容器上定义数据源(如何执行此操作取决于您正在运行的内容),并让应用服务器为您管理连接。您只需在需要时从数据源中提取连接。

要回答问题的第二部分,您可以像这样构建json以在响应中包含多个属性:

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

如果这些属性中的任何一个本身具有属性,嵌套对象,那么只需创建另一个Json对象作为其中一个属性的值。