web-dev-qa-db-ja.com

サーブレットからJSONを返す

これは非常に基本的な要求と応答のテストです。ブラウザはjQuery $ .ajax APIを使用して「hello from browser」をサーブレットに送信し、サーブレットはこのメッセージを受信し、org.json.simpleライブラリを使用してJSONオブジェクトを作成し、メッセージ「hello from server」を含むJSON応答をブラウザに送り返します。

私はこれをlocalhostで実行していますが、IPアドレスが123.123.12.123で、プラットフォームがUbuntuで、サーバーがTomcat 6.0で、Eclipse IDEで実行されていると想定しています。

テスト1. Eclipseからサーバーを起動し、Firefoxを開いて http:// localhost:8080/myproject/test.jsp と入力します。サーブレットがメッセージを受信し、ブラウザーが応答を受信し、テストに合格しました。

テスト2.サーバーはUbuntuのEclipseでまだ実行中です。VirtualBoxからWindows 7ゲストマシンを起動し、Windows 7のFirefoxブラウザーを起動します http://123.123.12.123:8080/myproject/test.jsp 、期待どおりに動作し、テストに合格しました。

テスト3.サーバーはUbuntuのEclipseでまだ実行されています。InternetExplorer 9ブラウザーを開き、アドレスを指定します http://123.123.12.123:8080/myproject/test.jsp 、 何も起こりません。 デバッグは私に与えます

応答HTTP/1.1 200 OK

応答本文{"message": "hello from server"}

Test.jspは

 <%@ page language = "Java" contentType = "text/html; charset = UTF-8" 
 pageEncoding = "UTF-8"%> 
 <!DOCTYPE html公開 "-// W3C // DTD HTML 4.01 Transitional // EN" "http://www.w3.org/TR/html4/loose.dtd"> 
 <html> 
 < head> 
 <meta http-equiv = "Content-Type" content = "text/html; charset = UTF-8"> 
 <title>ここにタイトルを挿入</ title> 
 </ head> 
 <script src = "// ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js" type = "text/javascript"> </ script> 
 <script type = "text/javascript" src = "release/js/libs/json2.js"> </ script> 
 <script> 
 $(ドキュメント)。 ready(function(){
 var request =({"message": 'Hello from browser'}); 
 var jsonobj = JSON.stringify(request); 
 $。 ajax({
 data:{para:jsonobj}、
 dataType: 'json'、
 url: './TestServlet',
 type:' POST ' 、
成功:function(jsonObj){
 alert(jsonObj.message); 
}、
エラー:function(){
 alert( 'Ajax readyState:' + xhr.readyState + '\ nstatus:' + xhr.status + '' + err); 
} 
} ); 
}); 
 </ script> 
 <body> 
 </ body> 
 </ html> 

サーブレットコードは

 import Java.io.IOException; 
 import Java.io.PrintWriter; 
 
 import javax.servlet.ServletException; 
 import javax.servlet .http.HttpServlet; 
 import javax.servlet.http.HttpServletRequest; 
 import javax.servlet.http.HttpServletResponse; 
 
 import org.json.simple。 JSONObject; 
 import org.json.simple.JSONValue; 
 
/** 
 *サーブレット実装クラスTestServlet 
 */
パブリッククラスTestServletはHttpServletを拡張します{
 private static final long serialVersionUID = 1L; 
 
 /**
 * @see HttpServlet#HttpServlet()
 */
 public TestServlet(){
 super(); 
} 
 
 /**
 * @HttpServletを参照#doGet(HttpServletRequest request、HttpServletResponse response)
 */
 protected void doGet(HttpServletRequest request、HttpServletResponse response)throws ServletException、IOException {
 // TO DO自動生成されたメソッドスタブ
} 
 
 /**
 * @see HttpServlet#doPost(HttpServletRequest request、HttpServletResponse response)
 */
 protected void doPost(HttpServletRequest request、HttpServletResponse response)がServletException、IOException {
 
 request.setCharacterEncoding( "utf8"); 
 response.setCharacterEncoding( "utf8 "); 
 response.setContentType(" application/json "); 
 PrintWriter out = response.getWriter(); 
 JSONObject jsonObj =(JSONObject)JSONValue.parse(request.getParameter( "para"))​​; 
 System.out.println(jsonObj.get( "message")); 
 JSONObject obj = new JSONObject(); 
 obj.put( "message"、 "hello from server"); 
 out.print(obj); 
 
} 
 
} 

更新:

変更により詳細を確認した後

エラー:function(){
 alert( 'Ajax readyState:' + xhr.readyState + '\ nstatus:' + xhr.status + '' + err); 
} 

エラー:function(xhr、err){
 alert( 'Ajax readyState:' + xhr.readyState + '\ nstatus:' + xhr.status + '' + err); 
} 

アラートのreadyState:0とstatus:0を受け取りました。しかし、{"message": "hello from server"}が応答本文に表示され、応答ヘッダーは

 Key Value 
 Response HTTP/1.1 200 OK 
14
user200340

私も同じ問題を抱えていました。 Firefoxでは正常に機能しましたが、IEでは機能しませんでした...この投稿を読んで、私の問題は「Content-Type」に関連していることがわかりました。問題はそのIEが 'charset = UTF8'に問題があるようです。しかし、 'charset = UTF-8'(ダッシュ付き)を使用する場合、それは機能します!Content-Typeその後、次のようになります。application/ json; charset = UTF-8

3
user2190382
<% 
     Gson gs = new Gson();
     BeanHelpBH bh = new BeanHelpBH();
     List<Baihatmoi> lst = bh.getTenbaihatbyName("Ao moi ca mau");
    String bha = gs.toJson(lst);
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    out.print(bha);
    out.flush();


%>

  script : 
        <script>
             $(document).ready(function(){
               $.get('jsontest.jsp',function(data){
            [enter image description here][1] console.log(data);

              });

           });
        </script>
0
phuongmychi

gsonを使用すると、json応答を送信できます

@WebServlet(urlPatterns = {"/ jsonResponse"})パブリッククラスJsonResponseがHttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("application/json");
    response.setCharacterEncoding("utf-8");
    Student student = new Student(12, "Ram Kumar", "Male", "1234565678");
    Subject subject1 = new Subject(1, "Computer Fundamentals");
    Subject subject2 = new Subject(2, "Computer Graphics");
    Subject subject3 = new Subject(3, "Data Structures");
    Set subjects = new HashSet();
    subjects.add(subject1);
    subjects.add(subject2);
    subjects.add(subject3);
    student.setSubjects(subjects);
    Address address = new Address(1, "Street 23 NN West ", "Bhilai", "Chhattisgarh", "India");
    student.setAddress(address);
    Gson gson = new Gson();
    String jsonData = gson.toJson(student);
    PrintWriter out = response.getWriter();
    try {
        out.println(jsonData);
    } finally {
        out.close();
    }

}

}

詳細 Javaのサーブレットからのjson応答

0
xrcwrn