2017-03-10 14 views
1

私は動的なWebプロジェクトを持っており、リモートサーバー上のmysqlデータベースでデータを送信したいと考えています。 だから、私は、ファイルlibraryPersistentBean.javaにこのコードを使用してREST APIを持っている:Java rest APIを使用したjavascriptでのポストリクエストは機能しません

public void addDemande(DemandeInscription demande) { 
     Connection con = null; 
      String url = "jdbc:mysql://my-ip:3306/my-database-name?useSSL=false"; 
      String driver = "com.mysql.jdbc.Driver"; 

      String userName = "my-username"; 
      String password = "my-password"; 
     // List<DemandeInscription> demandes = new ArrayList<DemandeInscription>(); 
      try { 

      Class.forName(driver).newInstance(); 
      con = DriverManager.getConnection(url , userName, password); 

      PreparedStatement st = 
      con.prepareStatement("insert into demandeInscription(name, city, address, food, type, email) values(?, ?, ?, ?, ?, ?)"); 
      st.setString(1,demande.getName()); 
      st.setString(2,demande.getCity()); 
      st.setString(3,demande.getAddress()); 
      st.setString(4,demande.getFood()); 
      st.setString(5,demande.getType()); 
      st.setString(6,demande.getEmail()); 


      // int result = st.executeUpdate();     

      } catch (SQLException ex) { 
      ex.printStackTrace(); 
      } catch (InstantiationException ex) { 
      ex.printStackTrace(); 
      } catch (IllegalAccessException ex) { 
      ex.printStackTrace(); 
      } catch (ClassNotFoundException ex) { 
      ex.printStackTrace(); 
      }  

    } 

私はここに、この関数を呼び出す:

@POST 
@Produces(MediaType.TEXT_HTML) 
@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
public void post(@FormParam("name") String name, @FormParam("city") String city, @FormParam("address") String address, @FormParam("food") String food, 
     @FormParam("type") String type, @FormParam("email") String email) throws IOException { 

    DemandeInscription demande = new DemandeInscription(name, city, address, food, type, email); 
    LibraryPersistentBean libraryPersistentBean = new LibraryPersistentBean(); 
    libraryPersistentBean.addDemande(demande); 



} 

そして、私のjavascriptのファイル、私が持っている:

function sendInscription(){ 
    var name = document.getElementById("name").value; 
    var city = document.getElementById("city").value; 
    var address = document.getElementById("address").value; 
    var food = document.getElementById("food").value; 
    var type = document.getElementById("type").value; 
    var email = document.getElementById("email").value; 

    var xhr = new XMLHttpRequest(); 
    xhr.open('POST', 'rest/demandes'); 
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 

    xhr.onreadystatechange = function() { 
     if(xhr.readyState == 4 && xhr.status == 200) { 
      alert(xhr.responseText); 
     } 
    } 
    xhr.send('name=' + name + '&city=' + city + '&address=' + address + '&food=' + food + '&type=' + type + '&email=' + email); 

}  

私はエラーはありませんが、テストの後、私はデータベースに何も持っていません。 なぜ動作しないのか考えていますか?

+0

あなたのコードがpostメソッドに到達するとは思わない。 xhr.openに完全なURLパスを指定する必要があります。 –

+0

リクエストをサーバーに送信したときにデバッグして何が得られているかを確認します。 –

+0

私はすでに完全なURLを試していて、何も変わりません。 – Adrien

答えて

1

コメントするには十分なポイントがありませんが、一見するとst.executeUpdate()コマンドはコメントアウトされています。 conn.commit();も行う必要があります。最後に、addDemandeメソッドの最後にconn.close();が必要になるため、接続がリークすることはありません。好ましくは、conn.close();finally句に入れる必要があります。これが正しい方向に向けるのを助けてくれることを願っています。

更新:

は、だからここにコミットし、適切な接続を閉じるように変更してお使いaddDemande(...)メソッドです。

public void addDemande(DemandeInscription demande) { 
    Connection conn = null; 
    String url = "jdbc:mysql://my-ip:3306/my-database-name?useSSL=false"; 
    String driver = "com.mysql.jdbc.Driver"; 

    String userName = "my-username"; 
    String password = "my-password"; 
    // List<DemandeInscription> demandes = new ArrayList<DemandeInscription>(); 
    try { 

     Class.forName(driver).newInstance(); 
     conn = DriverManager.getConnection(url, userName, password); 

     PreparedStatement st = conn 
       .prepareStatement("insert into demandeInscription(name, city, address, food, type, email) values(?, ?, ?, ?, ?, ?)"); 
     st.setString(1, demande.getName()); 
     st.setString(2, demande.getCity()); 
     st.setString(3, demande.getAddress()); 
     st.setString(4, demande.getFood()); 
     st.setString(5, demande.getType()); 
     st.setString(6, demande.getEmail()); 

     // Turn off auto-commit 
     conn.setAutoCommit(false); 

     // Uncommented this statement that actually does the update 
     int result = st.executeUpdate(); 

     // Commit the change 
     conn.commit(); 

     // Release the resource 
     st.close(); 

    } catch (SQLException ex) { 
     ex.printStackTrace(); 
    } catch (InstantiationException ex) { 
     ex.printStackTrace(); 
    } catch (IllegalAccessException ex) { 
     ex.printStackTrace(); 
    } catch (ClassNotFoundException ex) { 
     ex.printStackTrace(); 
    } finally { 
     if (conn != null) { 
      conn.close(); 
     } 
    } 
} 
+0

これらの機能(コミット、クローズ、executeUpdate)をどこに置く必要があるか教えてください – Adrien

+0

私は提案された変更を表示するために私の答えを更新しました。 –

+0

はい、動作します。 'st.executeUpdate()'行のコメントを外す必要がありました。ありがとう! – Adrien

関連する問題