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

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

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

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

1757閲覧

AjaxでServletと通信する場合のsetAttributeの使い方

asakuta

総合スコア100

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2019/07/09 08:30

編集2019/07/11 02:45

前提・実現したいこと

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}

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

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

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

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

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

guest

回答1

0

ベストアンサー

setAttribute,getAttributeの第一引数はキーなので、単にキーがないだけかと。
「最初に呼び出される」サーブレットのほうでは1しかキーをセットしていないけどjspでは2も呼び出そうとしていますよね。

Ajaxからのレスポンスでhtmlを返すことって余程のことがない限りなくて、
前の質問にありますようにJSONで必要なデータだけ返すべきと思います。その際、jspは必要ありません。
返されたデータをJavaScriptでHTMLに埋め込みます。

いずれにしても、画面用とAjax用のサーブレットクラス名が同じだったり、jspを共有するのはバグの元です。

投稿2019/07/09 09:08

編集2019/07/09 09:09
m.ts10806

総合スコア80850

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

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

asakuta

2019/07/09 09:41

>setAttribute,getAttributeの第一引数はキーなので、単にキーがないだけかと。 >「最初に呼び出される」サーブレットのほうでは1しかキーをセットしていないけどjspでは2も呼び出そ >としていますよね。 ・てっきり2の方はクリック時のみ呼び出されると思っていました。 JSP側でクリック時のみ2を呼び出すにはどのようにすればすればよいのでしょうか? >Ajaxからのレスポンスでhtmlを返すことって余程のことがない限りなくて、 >前の質問にありますようにJSONで必要なデータだけ返すべきと思います。その際、jspは必要ありませ>ん。 >返されたデータをJavaScriptでHTMLに埋め込みます。 ・setAttributeでDBを表示する処理はすでに作成していたためとりあえず使い回せると思いJSONを使わずにコーディングしました。また、JSONをServlet側で変換する場合ライブラリの種類が一杯ありますがどれがおすすめですか? >いずれにしても、画面用とAjax用のサーブレットクラス名が同じだったり、jspを共有するのはバグの元>です。 ・すみません作成したプログラムは冗長部分が多かったため質問用にプログラムを新しく書いたため「Ajaxと連携するServlet」の方はコピペに頼ったためクラスが同じになってしまいました。
m.ts10806

2019/07/09 11:53

どれでも良いのでまずJSONデータを作れるようになりましょう。目的が達成できるならプロセスは問いません。 いずれにしてもオブジェクトの操作です。 >「Ajaxと連携するServlet」の方はコピペに頼ったためクラスが同じになってしまいました。 質問用に作り直すにしてもやはり「コピペで再現確認できる」が原則です。 本来はpackage部分も必要ですし、Ajaxのほうも出力もjspへの連携もないので実際はアウトです。 エスパーが必要な質問はあまり良い質問とは言えません。エスパーが当たらなかったときの時間が無駄すぎます。
asakuta

2019/07/10 23:59

返信遅くなりました。 時間はかかりましたが、JSONを使ってデータをやり取りするプログラムが完成しました。 ありがとうございました。
m.ts10806

2019/07/11 00:17

解決されたようで何よりです。 念のため、質問にどのようになったかコードを追記していただけますか? それによっておなじような問題を抱えた誰かの助けにもなるし 自身の備忘録にもなりますので
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問