前提・実現したいこと
AjaxでServletに通信を行いsetAttributeの内容を描画したいのですがエラーが出て困っています。
エラー理由は、最初に読み込むjspの中にクリック時に読み込むsetAttributeが入っているためだと推測されます。どのように改修すれば良いのか教えていただけませんか?
発生している問題・エラーメッセージ
org.apache.jasper.JasperException: An exception occurred processing JSP page [/WEB-INF/view/index.jsp] at line [81] Caused by: java.lang.NullPointerException
該当のソースコード
java
1/** 2 * 最初に呼び出される 3 */ 4public class HelloServlet extends HttpServlet { 5 6 private static final long serialVersionUID = 1L; 7 8 /** 9 * @see HttpServlet#HttpServlet() 10 */ 11 public HelloServlet() { 12 super(); 13 } 14 15 /** 16 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 17 */ 18 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 19 doPost(request, response); 20 } 21 22 /** 23 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 24 */ 25 protected void doPost(HttpServletRequest request, HttpServletResponse response) 26 throws ServletException, IOException { 27 try { 28 //DBに接続する AはDBの値 29 request.setAttribute("1","A") 30 // JSPにforward 31 String view = "/WEB-INF/view/index.jsp"; 32 RequestDispatcher dispatcher = request.getRequestDispatcher(view); 33 34 dispatcher.forward(request, response); 35 36 } catch (Exception e) { 37 e.printStackTrace(); 38 } 39 } 40 41}
jsp
1//DBのAの値を描画 2<td id=abcd><%request.getAttribute("1")%><td> 3 4$(function() { 5 $("#Search").click(function() { 6 // Ajax通信を開始する 7$.ajax({ 8type : "POST", 9url : "Test", 10success : function() { 11 console.log("成功"); 12//DBのAの値を消してBの値に置き換える*NullPointerExceptionエラーが出る 13$("#abcd").empty().append(<%request.getAttribute("2")%>) 14}, 15error : function() { 16console.log("失敗");} 17}) 18}); 19});
Java
1//Ajaxと連携するServlet 2public class HelloServlet2 extends HttpServlet { 3 4 private static final long serialVersionUID = 1L; 5 6 /** 7 * @see HttpServlet#HttpServlet() 8 */ 9 public HelloServlet() { 10 super(); 11 } 12 13 /** 14 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 15 */ 16 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 17 doPost(request, response); 18 } 19 20 /** 21 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 22 */ 23 protected void doPost(HttpServletRequest request, HttpServletResponse response) 24 throws ServletException, IOException { 25 try { 26 //DBに接続する BはDBの値 27 request.setAttribute("2","B") 28 29 } catch (Exception e) { 30 e.printStackTrace(); 31 } 32 } 33 34}
試したこと
Ajaxと通信するServletのsetAttribute内変数を最初に読み込むServletと同じにしてエラーを表示しないようにしましたが結局nullが出ており読み込めませんでした。
AjaxでServletと連携する場合setAttributeはしない方がよろしいのでしょうか?
### 追記
mts10806さんの指摘どうりJSONデータを使用することで解決できたため以下にコードを載せます
JavaScript
1$ .ajax({ type : "POST", 2 url : "Test", 3 dataType : "json", 4 success : function(data) { 5 6 $("#a") 7 8 for (j = 0; j < data.emp_list.length; j++) { 9 $("#abcd") 10 .append( 11 "<tr><td>" 12 + data.emp_list[j].emp_id 13 +"</td><td>" 14 + data.emp_list[j].emp_name 15 + "</td></tr>") 16 } 17 18 },
Java
1package todo.controller; 2 3import java.io.IOException; 4import java.io.PrintWriter; 5import java.sql.Connection; 6import java.sql.PreparedStatement; 7import java.sql.ResultSet; 8import java.sql.SQLException; 9import java.util.ArrayList; 10import java.util.HashMap; 11import java.util.Map; 12 13import javax.servlet.RequestDispatcher; 14import javax.servlet.ServletException; 15import javax.servlet.annotation.WebServlet; 16import javax.servlet.http.HttpServlet; 17import javax.servlet.http.HttpServletRequest; 18import javax.servlet.http.HttpServletResponse; 19 20import org.apache.jasper.tagplugins.jstl.core.Out; 21 22import com.fasterxml.jackson.databind.ObjectMapper; 23import com.fasterxml.jackson.core.JsonProcessingException; 24import com.fasterxml.jackson.databind.ObjectMapper; 25import todo.controller.db; 26 27/** 28 * Servlet implementation class HelloServlet 29 */ 30@WebServlet("/Test") 31public class Test extends HttpServlet { 32 33 static Connection connection = null; 34 static PreparedStatement preparedStatement = null; 35 static ResultSet resultSet = null; 36 ArrayList<Object> AllSearch_JSON = new ArrayList<Object>(); 37 private static final long serialVersionUID = 1L; 38 String all_json = null; 39 /** 40 * @see HttpServlet#HttpServlet() 41 */ 42 public Test() { 43 super(); 44 } 45 46 /** 47 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 48 */ 49 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 50 doPost(request, response); 51 } 52 53 /** 54 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 55 */ 56 protected void doPost(HttpServletRequest request, HttpServletResponse response) 57 throws ServletException, IOException { 58 try { 59 ObjectMapper mapper = new ObjectMapper(); 60 61 String json = mapper.writeValueAsString(emp.EmployeeList()); 62 response.setContentType("application/json;charset=UTF-8"); 63 PrintWriter pw = response.getWriter(); 64 pw.print("{"+"\"emp_list\":"+json+"}"); 65 } catch (Exception e) { 66 67 } 68 } 69}
json
1//作成したJSONデータ 2{ 3 "emp_list": [{ 4 "emp_id": 4, 5 "emp_name": "田中太郎" 6 }, { 7 "emp_id": 5, 8 "emp_name": "田中次郎" 9 }, { 10 "emp_id": 7, 11 "emp_name": "田中三郎" 12 }] 13}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/09 09:41
2019/07/09 11:53
2019/07/10 23:59
2019/07/11 00:17