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]
内部サーバ起動時のコンソール情報
回答1件
あなたの回答
tips
プレビュー