2016-07-12 7 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받은 데이터에 부가되고 이전 아약스 요청에서. 난 그냥 div 새 데이터로 업데이 트하려는뿐만 아니라 응답으로 여러 개체를 보내고 그것에서 값을 추출하는 조작 방법을 알고 싶습니다.

+0

아무 것도 실제로 이해가되지 않습니다. 당신은 HTML로 json 응답을 처리하고'output.innerHTML = responseJson;을 할 때 append가 없으면 이전 html이 대체됩니다 – charlietfl

+0

@charlietfl 예 이전 html을 대체해야하지만 그 이유는 모르겠습니다 똑같다. –

+0

이것을 재현하는 데모를 만드십시오. 또한'show()'의'cat'도 정의되어 있지 않습니다. 브라우저 콘솔에서 오류가 발생하지 않습니까? 표시된 코드가 실패해야합니다. – charlietfl

답변

1

서블릿은 다중 스레드입니다. 즉, 서블릿 컨테이너는 적은 수의 인스턴스를 인스턴스화하지만 각 인스턴스를 통해 여러 스레드 (요청 당 하나)를 실행합니다. 따라서 Servlet 클래스에서 인스턴스 속성으로 정의 된 속성은 해당 인스턴스를 통해 실행되는 모든 스레드 (요청)간에 상태를 공유합니다.

클래스를 인스턴스화하면 (새 인스턴스를 호출 할 때) 인스턴스 속성은 해당 클래스의 모든 메서드에서 볼 수 있으며 값은 공유됩니다. 서블릿의 경우 서블릿 컨테이너는 최소한 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 
} 

를, 중첩 된 객체는, 그럼 그냥 생성 속성 중 하나의 값으로 다른 Json 객체.

+0

으로 업데이트되었습니다. 덕분에 작동했지만, 이유는 조금 더 설명 할 수 있습니까? –

+0

질문의 두 번째 부분에 나를 가르쳐 주시면 도움이 될 것입니다. –

+0

이 더 자세히 설명해 주셨습니다 - 도움이 될지 알려주시겠습니까? –

관련 문제