質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

Q&A

解決済

1回答

2996閲覧

サーブレットからjson形式のデータをレスポンスしたい

kokok

総合スコア145

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

0グッド

0クリップ

投稿2019/09/30 05:10

編集2019/10/01 07:47

java

1package servlet; 2 3import java.io.IOException; 4import java.io.PrintWriter; 5import java.util.ArrayList; 6import java.util.HashMap; 7import java.util.List; 8import java.util.Map; 9 10import javax.servlet.RequestDispatcher; 11import javax.servlet.ServletException; 12import javax.servlet.annotation.WebServlet; 13import javax.servlet.http.HttpServlet; 14import javax.servlet.http.HttpServletRequest; 15import javax.servlet.http.HttpServletResponse; 16 17import com.fasterxml.jackson.databind.ObjectMapper; 18 19import dao.USER_DB; 20import model.UserDTO; 21 22 23@WebServlet("/Userlist") 24public class Userlist extends HttpServlet { 25 private static final long serialVersionUID = 1L; 26 27 public Userlist() { 28 super(); 29 } 30 31 32 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 33 34 35 } 36 37 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 38 39 request.setCharacterEncoding("UTF-8"); 40 41 //ajaxのパラメータルリクエストを取得(中身"user") 42 String button = request.getParameter("one"); 43 44 if( button.equals("user")) { 45 46 try { 47 48 //ユーザ情報をデータベースから取得するクラス 49 USER_DB user_db = new USER_DB(); 50 51 //ユーザid と ユーザ名の値がセットさせたdtoクラスが格納させた配列を取得 52 ArrayList<UserDTO> userlist = (ArrayList<UserDTO>) user_db.getUser(); 53 54 55 ArrayList<Integer> userId = new ArrayList<Integer>(); 56 List<String> userName = new ArrayList<String>(); 57 58 for(int i = 0; i < userlist.size(); i++) { 59 60 userName.add(userlist.get(i).getName()); 61 } 62 63 64 ObjectMapper mapper = new ObjectMapper(); 65 66 Map<Integer, String> resMap = new HashMap<>(); 67 68 69 for(int i = 0; i < userName.size(); i++) { 70 71 resMap.put(userId.get(i),userName.get(i)); 72 } 73 74 75 String resJson = mapper.writeValueAsString(resMap); 76 77 response.setContentType("application/json"); 78 response.setHeader("Cache-Control", "nocache"); 79 response.setCharacterEncoding("utf-8"); 80 81 82 PrintWriter out = response.getWriter(); 83 out.print(resJson); 84 85 out.close(); 86 87 } catch(Exception e) { 88 e.printStackTrace(); 89 } 90 } 91 92 } 93} 94 95

上記のコードを実行すると  catch(Exception e)  されてしまいます。

調べても、原因が分からず解決出来なかったのでアドバイス頂けると助かります。

--追記--
コンソールエラー内容
重大: Servlet.service() for servlet [servlet.Userlist] in context with path [/webkensyu] threw exception [サーブレットの実行により例外を投げました] with root cause [月

javaでjsonを扱うために必要なことをネットで調べてみました。
自分なりに理解して書いてみたのですが、 コンソールエラーが何のエラーか分からず、対処出来ずにいます。

--追記2--

jquery

1$('#user_list2').on('click',function(){ 2 3 var val= $('#user_list').val(); 4 5 $.ajax({ 6 7 url:"Userlist", 8 type:"POST", 9 cache:false, 10 data:{'user':val}, 11 // dataType:"json", 12 success: function(data){ 13 userlist = data; 14 $("#test1").text(userlist); 15 }, 16 error : function(XMLHttpRequest, textStatus, errorThrown) { 17 alert("エラーが発生しました:" + textStatus +":\n" + errorThrown); 18 } 19 }); 20 21}); 22

実行するとjquery の error : functionで

エラーが発生しました:error:
Not Found
とアラートされます。

--追記3--

Chromeコンソールには
POST http://localhost:8080/webkensyu/Userlist 500 (Internal Server Error)
send @ jquery.min.js:2
ajax @ jquery.min.js:2
(anonymous) @ kensyu.js:12
dispatch @ jquery.min.js:2
v.handle @ jquery.min.js:2
とエラーが出てしまいます。

実行するとjquery の error : functionで

エラーが発生しました:error:
internal Server Error
とアラートされます。
--追記4--
修正後コード

java

1package servlet; 2import java.io.IOException; 3import java.io.PrintWriter; 4import java.util.ArrayList; 5import java.util.HashMap; 6import java.util.List; 7import java.util.Map; 8 9import javax.servlet.ServletException; 10import javax.servlet.annotation.WebServlet; 11import javax.servlet.http.HttpServlet; 12import javax.servlet.http.HttpServletRequest; 13import javax.servlet.http.HttpServletResponse; 14 15import com.fasterxml.jackson.databind.ObjectMapper; 16 17import dao.USER_DB; 18import model.UserDTO; 19 20 21@WebServlet("/Userlist") 22public class Userlist extends HttpServlet { 23 private static final long serialVersionUID = 1L; 24 25 public Userlist() { 26 super(); 27 } 28 29 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 30 31 } 32 33 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 34 35 try { 36 request.setCharacterEncoding("UTF-8"); 37 38 //ajaxのパラメータルリクエストを取得(中身"user") 39String button = request.getParameter("one"); 40 41//if( button.equals("user")) { 42 43 44 45 //ユーザ情報をデータベースから取得するクラス 46 USER_DB user_db = new USER_DB(); 47 48 //ユーザid と ユーザ名の値がセットさせたdtoクラスが格納させた配列を取得 49 ArrayList<UserDTO> userlist = (ArrayList<UserDTO>) user_db.getUser(); 50 51 52 List<Integer> userId = new ArrayList<Integer>(); 53 List<String> userName = new ArrayList<String>(); 54 55 56 //ユーザIdを<Integer>型のListに入れ直し 57 for(int i = 0; i < userlist.size(); i++) { 58 59 userId.add(userlist.get(i).getId()); 60 } 61 62 //ユーザNameを<String>型のListに入れ直し 63 for(int i = 0; i < userlist.size(); i++) { 64 65 userName.add(userlist.get(i).getName()); 66 } 67 68 69 70 Map<String, String> userlists = new HashMap<>(); 71 72 //MapのキーにユーザId, 値のNameをセット 73 for(int i= 0; i < userlist.size(); i++) { 74 75 userlists.put(String.valueOf(userId.get(i)), userName.get(i)); 76 } 77 78 // JSONObject obj = new JSONObject(userlists); 79 80 String json = new ObjectMapper().writeValueAsString(userlists); 81 System.out.println(json); 82 PrintWriter out = response.getWriter(); 83 out.print(json); 84 85 // Gson gson = new Gson(); 86 // String json = gson.toJson(userName.get(0)); 87 88 89 // PrintWriter out = response.getWriter(); 90 // out.print(obj); 91 92 93 94 // Map<String, Object> map = new HashMap<>(); 95 // map.put("name", "Taro Tanaka"); 96 // map.put("age", 30); 97 98 //JSONObject obj = new JSONObject(map); 99 100 // PrintWriter out = response.getWriter(); 101 // out.print(obj); 102 103 //out.close(); 104 105 } catch(Exception e) { 106 e.printStackTrace(); 107 } 108} 109 110} 111

修正後のコードを実行すると 

jquery.min.js:2 POST http://localhost:8080/webkensyu/Userlist 500 (Internal Server Error)

とエラーが出てしまいます。

PrintWriter out = response.getWriter();
out.print(json);
で、mapをjsonに変換したデータを文字列としてストリームに出力しています。

例えば  String aaa = "aaa";

PrintWriter out = response.getWriter();
out.print(aaa);

このような例だと上手くjqueryの方で受けっとってconsoleなどに出力できます。

原因が全然分からなかったので、アドバイス頂けると助かります。

--追記5--
ObjectMapper ObjectMapper = new ObjectMapper();

でインスタンス化させようとするとエラーになっているようです。
調べても解決出来なかったのでアドバイス頂けると助かります。

--追記6--

情報: Server version: Apache Tomcat/7.0.88 [火 10 01 16:43:27 JST 2019]
情報: Server built: May 7 2018 11:12:57 UTC [火 10 01 16:43:27 JST 2019]
情報: Server number: 7.0.88.0 [火 10 01 16:43:27 JST 2019]
情報: OS Name: Windows 8.1 [火 10 01 16:43:27 JST 2019]
情報: OS Version: 6.3 [火 10 01 16:43:27 JST 2019]
情報: Architecture: amd64 [火 10 01 16:43:27 JST 2019]
情報: Java Home: C:\pleiades\java\7\jre [火 10 01 16:43:27 JST 2019]
情報: JVM Version: 1.7.0_80-b15 [火 10 01 16:43:27 JST 2019]
情報: JVM Vendor: Oracle Corporation [火 10 01 16:43:27 JST 2019]
情報: CATALINA_BASE: Dwtp.deploy=C:\pleiades\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps [火 10 01 16:43:27 JST 2019]
情報: Command line argument: -Djava.endorsed.dirs=C:\pleiades\tomcat\7\endorsed [火 10 01 16:43:27 JST 2019]
情報: Command line argument: -Dfile.encoding=UTF-8 [火 10 01 16:43:27 JST 2019]
情報: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\pleiades\java\7\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/pleiades/eclipse/jre/bin/../jre/bin/server;C:/pleiades/eclipse/jre/bin/../jre/bin;C:/pleiades/eclipse/jre/bin/../jre/lib/amd64;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\skoga\Program Files (x86)\VMware\VMware vSphere CLI\Perl\site\bin;C:\skoga\Program Files (x86)\VMware\VMware vSphere CLI\Perl\bin;c:\Program Files (x86)\Intel\iCLS Client;c:\Program Files\Intel\iCLS Client;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\Program Files (x86)\Intel\OpenCL SDK\3.0\bin\x86;C:\Program Files (x86)\Intel\OpenCL SDK\3.0\bin\x64;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program \Local\atom\bin;C:\pleiades\eclipse;;. [火 10 01 16:43:27 JST 2019]
情報: サービス Catalina を起動します [火 10 01 16:43:27 JST 2019]
情報: Starting Servlet Engine: Apache Tomcat/7.0.88 [火 10 01 16:43:27 JST 2019]
情報: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. [火 10 01 16:43:30 JST 2019]
情報: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. [火 10 01 16:43:32 JST 2019]
情報: Starting ProtocolHandler ["http-bio-8080"] [火 10 01 16:43:32 JST 2019]
情報: Starting ProtocolHandler ["ajp-bio-8009"] [火 10 01 16:43:32 JST 2019]
情報: Server startup in 4651 ms [火 10 01 16:43:32 JST 2019]
重大: Servlet.service() for servlet [servlet.Userlist] in context with path [/webkensyu] threw exception [サーブレットの実行により例外を投げました] with root cause [火 10 01 16:43:35 JST 2019]

内部サーバ起動時のコンソール情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/09/30 06:07

で、catchで捕捉されたエラーは何でしょうか
m.ts10806

2019/09/30 06:08

また、何をどう調べて何を試したのでしょうか
m.ts10806

2019/09/30 07:36

printStackTrace の結果はコンソールに出てないですか? メッセージだけほしければ getMessage() をprintしてみてください
kokok

2019/09/30 08:09

printStackTraceの結果は何も表示されないです。 e.getMessage()としてみましたが、表示されませんでした。 jqueryの方は大事な情報だったとおもうのですが、書いていませんでした。すいません。追記2で質問編集を行いました。
m.ts10806

2019/09/30 08:13

サーブレット側で例外をキャッチできてないということは、そもそもtryに入ってないということですね。 スコープをifの中ではなくdoPost冒頭からにしてみるとどうなりますか?これで出ないとなるとリクエスト自体失敗しているということになります
kokok

2019/09/30 08:32

何も出ませんでした。ということは、jQueryの方に問題があるということでしょうか?
m.ts10806

2019/10/01 02:52

(なぜ質問乱立させるんだろう) 質問を編集すれば「アクティブ」のタブに上がってくるので新しく質問たてる必要はありません。むしろマナー的にNGです。新しくたてた方を削除依頼を出しておいてください。 「なにも出ませんでした」はどこをどう確認されてますか? コードも対応後のものをご提示くださいね。
kokok

2019/10/01 03:07

すみません。削除依頼しておきました。 eclipseのコンソール?と Chromeのコンソールを確認しました。
m.ts10806

2019/10/01 04:04

catchに入ったかどうかの確認はされてないわけですよね? デバッグモードでステップ実行するとどこを通ってましたか?
kokok

2019/10/01 04:26

catchまで入ってませんでした。 String json = new ObjectMapper().writeValueAsString(userlists); で処理が止まってしまいます。
guest

回答1

0

ベストアンサー

JavaWebアプリケーションの仕様として、動作に必要なライブラリは WEB-INF/lib の中に jarファイルを配置する必要があります。

利用されているjackson-core.jar や jackson-databind.jar はビルドパスに追加されていると思うのですが、動的Webアプリケーションとしてプロジェクトが作られているかと思いますので、その場合はWEB-INF/lib に入れるだけで、自動的にビルドパスへ追加され、サーバに搭載されます。

投稿2019/10/27 13:50

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokok

2019/10/29 06:58

回答ありがとうございます。 とても参考になりました。 WEB-INF/lib の中に jarファイルを配置したところ、上手くjson形式での受け渡しが出来ました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問