2016-05-02 6 views
0

以前はこの記事に関連していた別の質問を削除してしまいました。廃止され、別の問題がありました。以下の答えは他の答えよりもはっきりしており、これは他の誰かが同様の混乱を起こすのに役立つと私は信じています。AJAXリクエストのヌルまたは空のJSONオブジェクト

本質的に私はクライアントサイドJSから来るJavaのStringを使いたいと思っています。 JSのアラートは正常に動作しますが、私のJSONオブジェクトはサーブレットでnullまたは空です。 SQLクエリを実行できるように、実際にはサーブレットに渡される文字列が1つだけ必要ですが、多くの問題があります。

ありがとうございました!

htmlファイル

 <div class="jumbotron" id="jumboframe"> 
      <h1>Enter your URL below</h1> 
      <input class="txtUrl" type="text" id="txtUrl" value="...." onfocus="if(this.value == '....') { this.value = ''; }"/> 
      <p><a class="btn btn-lg submitButton" href="testpage.html" onclick="getURL()" role="button">Start searching!</a></p> 
     </div> 

     <script> 
      function getURL() { 
       var urlString = document.getElementById("txtUrl").value; 
       var params = {url: urlString}; 


      $.ajax({ 
        type: "POST", 
        url: "testpage.html", 
        contentType: "application/json", 
        dataType: "text", // "JSON" here doesn't call alerts below 
        data: { 
         'url': urlString 
        }, 

        success: function(data) { 
         alert("did it!"); 
         alert(JSON.stringify(params)); 
         alert(JSON.stringify(data)); 
        } 
       }); 
      } 
     </script> 

Javaサーブレット

public class JavaServlet extends HttpServlet { 

private static final long serialVersionUID = 1L; 

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 

    doPost(request, response); 
} 
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { 

    PrintWriter out = response.getWriter(); 

    StringBuilder builder = new StringBuilder(); 
    BufferedReader reader = request.getReader(); 
    String line; 
    while ((line = reader.readLine()) != null) { 
     builder.append(line); 
    } 

    out.println(builder.toString()); 
    String url = request.getParameter("url"); 
    Map<String, String[]> map = request.getParameterMap(); // empty {} 
    out.println(map.toString()); // null 
    out.println(url); // null 

web.xmlの

<servlet> 
     <servlet-name>JavaServlet</servlet-name> 
     <servlet-class>path.to.my.JavaServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>JavaServlet</servlet-name> 
    <url-pattern>/testpage.html</url-pattern> 
    </servlet-mapping> 

おかげで再び

+1

このヘルプを願っています(http://stackoverflow.com/questions/1548782/retrieving-json-object-literal-from-httpservletrequest)POSTデータを使ってStringBuilderを正しく作成しています。他に何ができるかを知るにはリンクを見てください。 –

答えて

1

あなたは要求データからJSONを取得したい場合は、あなたはそれを渡す必要がありますStringとして、そして、このようになりますあなたのhtml

<div class="jumbotron" id="jumboframe"> 
      <h1>Enter your URL below</h1> 
      <input class="txtUrl" type="text" id="txtUrl" value="...." onfocus="if(this.value == '....') { this.value = ''; }"/> 
      <p><a class="btn btn-lg submitButton" href="#" onclick="getURL()" role="button">Start searching!</a></p> 
     </div> 

     <script> 
      function getURL() { 
       var urlString = document.getElementById("txtUrl").value; 
       var params = {url: urlString}; 

       var jsonDataStr = JSON.stringify(params); // Here you get the json String 
      $.ajax({ 
        type: "POST", 
        url: "JavaServlet.do", 
        contentType: "application/json", 
        dataType: "text", // "JSON" here doesn't call alerts below * Because the servlet thrown an error, you should handle it * 
        data: jsonDataStr, 
        success: function(data) { 
         alert("Your URL is " + data); // **get the response text** 
         alert("Handle it"); 
        }, 
        error: function(data) { // Handle the error 
         alert(data.error().getResponseHeader()); 
        } 
       }); 
      } 
     </script> 

今、JavaServletは文字列としてJSONを受け取ることになります(私はJavaServlet.doへのサーブレットのパスを変更した)、あなたは(それを解析する必要がありますGsonのようなサードパーティのライブラリを使用してください)。

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { 

    PrintWriter out = response.getWriter(); 

    StringBuilder builder = new StringBuilder(); 
    BufferedReader reader = request.getReader(); 
    String line; 
    while ((line = reader.readLine()) != null) { 
     builder.append(line); 
    } 

    String jsonString = builder.toString(); // get the json from client 
    UrlDto urlDto = new Gson().fromJson(UrlDto.class,jsonString); // parse you json to Java object 
    String yourUrl = urlDto.getUrl(); 
    out.print(yourUrl); // **Set the response text** 
    out.close();   

WEB.XMLとUrlDto

class UrlDto { 
    private String url; 
    // G&S ... 
} 

    <servlet> 
     <servlet-name>JavaServlet</servlet-name> 
     <servlet-class>servlet.JavaServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>JavaServlet</servlet-name> 
     <url-pattern>/JavaServlet.do</url-pattern> 
    </servlet-mapping> 

私はあなたが[HttpServletRequestを取得からJSONオブジェクトリテラル]の可能性のある重複

+0

ありがとうございました!サーブレットのurlパターンを変更する点を聞かせてもよろしいですか?これまでは空白のhtmlファイルを指定していましたが、postgresqlで文字列が処理されて照会された後、最終的に応答が表示されます。 –

+0

私は、あなたがそのポイントの後に作成した "yourUrl"文字列変数をどのように扱うかを確信していません。サーブレットと同じパッケージ内のクラスから新しいオブジェクトを初期化しましたが、メソッド呼び出しや何らかのタイプの印刷ステートメントから何も取得しません –

+0

URLパターンは少し混乱していたので変更しました。非同期呼び出しを行っているので、ページをリダイレクトするときに応答が利用できないことに注意してください。 成功とエラーは、ajax呼び出しの成功ハンドラとエラーハンドラによって処理される必要があります。 編集を参照してください。サーブレットは応答テキストを設定し、ajaxコールは成功ハンドラの 'data'としてそれを受け取ります。 –

関連する問題