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

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

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

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

Java

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

JavaScript

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

servlet

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

Q&A

解決済

1回答

5665閲覧

jsp画面での入力値チェックを行うServletファイルを作成したが、うまく働かない

yuki-o0413

総合スコア8

JSP

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

Java

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

JavaScript

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

servlet

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

0グッド

0クリップ

投稿2020/08/04 03:25

前提・実現したいこと

createInput.jspファイルで表示される画面にて、入力された内容をチャックし、値をcreateCoufirm.jspに受け渡すCreateConfirmServlet.javaファイルを作りたい。
入力項目、name、read、explainの項目は全角入力であり、また、カテゴリー選択で分類1が「開発用語」「運用用語」が選択されていたときは、分類2は必須選択になる。
条件が満たされていないときは、createInput.jspに画面が戻り、条件がOKであれば、createConfirm.jspに値が移されるようにしたい。
イメージ説明

発生している問題・エラーメッセージ

分類1で開発用語または運用用語を選択後、分類2で選択を行わない場合(異常系)、画面の遷移が行われず画面が固まってしまう。エクリプスで実行した結果はステータスコード500であった。
適切な分類選択をした場合、値が受け渡され、createConfirm.jspに値が受け渡されるが、入力文字が半角や記号入力でも値が受け渡されてしまう。

Java初心者です全角チェックの正規表現の使い方が間違えているのでしょうか?よろしくお願いします。

HTTPステータス 500 – Internal Server Error タイプ 例外報告 説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。 例外 java.lang.NullPointerException main.CreateConfirmServlet.doGet(CreateConfirmServlet.java:50) javax.servlet.http.HttpServlet.service(HttpServlet.java:634) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 注意 原因のすべてのスタックトレースは、サーバのログに記録されています Apache Tomcat/9.0.30

該当のソースコード

createInput.jsp

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<%@ page import="java.util.*" %> 4 5<!DOCTYPE html> 6<html> 7<head> 8<meta charset="UTF-8"> 9<title>登録入力画面</title> 10<link rel="stylesheet" href="css/glossary.css"> 11<script src="js/category.js"></script> 12<script src="js/validation_input.js"></script> 13</head> 14<body> 15<div id="container"> 16 17 <!-- ヘッダーの読み込み --> 18 <jsp:include page="common/header.jsp" flush="true"/> 19 20 <main> 21 <h2>新規登録</h2> 22 <hr/> 23 <form method="get" action="./CreateConfirmServlet"> 24 <div class = "create"> 25 <label id="h" for="name">見出し</label> 26 <input type="text" name="name" maxlength="50" required/><br><br> 27 </div> 28 <div class = "create"> 29 <label id="h" for="read">読み方</label> 30 <input type="text" name="read" maxlength="50"/><br><br> 31 </div> 32 <div class = "create"> 33 <label id="h" for="category1">分類1</label> 34 <select name="category1" id="category1" required> 35 <option value="">選択してください▼</option> 36 <option value="全般">全般</option> 37 <option value="開発用語">開発用語</option> 38 <option value="運用用語">運用用語</option> 39 </select><br><br> 40 </div> 41 <div class = "create"> 42 <label id="h" for="category2">分類2</label> 43 <select name="category2" id="category2" disabled> 44 </select><br><br> 45 </div> 46 <div class="create"> 47 <label id="h" for="explain">説明</label> 48 <textarea id="explain" name="explain" cols="49" rows="20" placeholder="入力してください。" required></textarea><br><br> 49 </div> 50 <div class="submit"> 51 <input type="submit" class="button1" value="登録"><br><br> 52 </div> 53 </form> 54 <br/> 55 </main> 56 57 <!-- フッターの読み込み --> 58 <jsp:include page="common/footer.jsp" flush="true"/> 59 60</div> 61</body> 62</html>

category.js

1 var CATE2_LIST = [ 2 { id : 0, type: "all", label : "選択して下さい▼", value : ""}, 3 { id : 1, type: "dev", label : "設計", value : "設計" }, 4 { id : 2, type: "dev", label : "実装", value : "実装"}, 5 { id : 3, type: "dev", label : "試験", value : "試験"}, 6 { id : 4, type: "op", label : "運用", value : "運用"}, 7 { id : 5, type: "op", label : "保守", value : "保守"} 8 ]; 9 10 window.addEventListener("load", function() { 11 var 12 updateCategory2 = function ( options ) { 13 var select = document.getElementById("category2"); 14 var enabled = !!options; 15 16 select.disabled = false; // 子要素変更のため 17 select.innerHTML = ""; // 一旦空にする。 18 19 (options || CATE2_LIST.slice(0,1)).forEach(function( item ) { 20 var opt = document.createElement("option"); 21 if( item.id ) opt.id = item.id; 22 opt.value = item.value; 23 opt.textContent = item.label || item.value; 24 25 select.appendChild( opt ); 26 }); 27 select.disabled = !enabled; // 結果に応じて変更 28 }, 29 30 changeCategory = function ( evt ) { 31 var list; // undefined 32 switch( evt.target.value ) { 33 case "開発用語": 34 list = CATE2_LIST.filter( i=>i.type=="dev"||i.type=="all" ); 35 break; 36 case "運用用語": 37 list = CATE2_LIST.filter( i=>i.type=="op"||i.type=="all" ); 38 break; 39 } 40 updateCategory2( list ); 41 } 42 ; 43 44 document.getElementById("category1") 45 .addEventListener("change", changeCategory); 46 }, !1);

CreateConfirm.java

1package main; 2 3import java.io.IOException; 4 5import javax.servlet.ServletException; 6import javax.servlet.annotation.WebServlet; 7import javax.servlet.http.HttpServlet; 8import javax.servlet.http.HttpServletRequest; 9import javax.servlet.http.HttpServletResponse; 10 11/** 12 * Servlet implementation class CreateConfirmServlet 13 */ 14@WebServlet("/CreateConfirmServlet") 15public class CreateConfirmServlet extends HttpServlet { 16 private static final long serialVersionUID = 1L; 17 18 /** 19 * @see HttpServlet#HttpServlet() 20 */ 21 public CreateConfirmServlet() { 22 super(); 23 // TODO Auto-generated constructor stub 24 } 25 26 /** 27 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 28 */ 29 protected void doGet(HttpServletRequest request, HttpServletResponse response) 30 throws ServletException, IOException { 31 // TODO Auto-generated method stub 32 response.setContentType("text/html; charset=UTF-8"); 33 request.setCharacterEncoding("UTF-8"); 34 // get the value from the request 35 String cName = request.getParameter("name"); 36 String cRead = request.getParameter("read"); 37 String cCat1 = request.getParameter("category1"); 38 String cCat2 = request.getParameter("category2"); 39 String cEx = request.getParameter("explain"); 40 41 if (!cName.matches("^[^-~。-゚]*$")) { 42 request.getRequestDispatcher("/createInput.jsp").forward(request, response); 43 } else if (!cRead.matches("^[^-~。-゚]*$")) { 44 request.getRequestDispatcher("/createInput.jsp").forward(request, response); 45 } else if (!cEx.matches("^[^-~。-゚]*$")) { 46 request.getRequestDispatcher("/createInput.jsp").forward(request, response); 47 } else if (cCat1 == "") { 48 request.getRequestDispatcher("/createInput.jsp").forward(request, response); 49 } else if (cCat1.equals("開発用語")) { 50 if (cCat2.equals("")) { 51 request.getRequestDispatcher("/createInput.jsp").forward(request, response); 52 } 53 } else if (cCat1.equals("運用用語")) { 54 if (cCat2.equals("")) { 55 request.getRequestDispatcher("/createInput.jsp").forward(request, response); 56 } 57 } 58 request.setAttribute("name", cName); 59 request.setAttribute("read", cRead); 60 request.setAttribute("category1", cCat1); 61 request.setAttribute("category2", cCat2); 62 request.setAttribute("explain", cEx); 63 64 getServletConfig().getServletContext().getRequestDispatcher("/createConfirm.jsp").forward(request, 65 response); 66 } 67 68 /** 69 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 70 */ 71 protected void doPost(HttpServletRequest request, HttpServletResponse response) 72 throws ServletException, IOException { 73 // TODO Auto-generated method stub 74 doGet(request, response); 75 } 76 77} 78

補足情報(FW/ツールのバージョンなど)

eclipse version 4.16.0.v20200604-0951
java version "14.0.1"
tomcat9

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

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

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

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

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

guest

回答1

0

ベストアンサー

ご提示の例外のメッセージを読むと

java.lang.NullPointerException
main.CreateConfirmServlet.doGet(CreateConfirmServlet.java:50)

となっていて、CreateConfirmServlet.javaの#50行目は

} else if (cCat1.equals("開発用語")) {

50行目 if (cCat2.equals("")) {
request.getRequestDispatcher("/createInput.jsp").forward(request, response);
}

if (if (cCat2.equals("")) です。その値をgetParameter() メソッドで取得している箇所は、String cCat2 = request.getParameter("category2"); ですが、フォームのJSPを見ると、

HTML

1<select name="category2" id="category2" disabled> 2 </select><br><br>

のように、disabledです。"category2"のフォームのパラメータ値が渡されていないので、nullになっているのではないでしょうか。

投稿2020/08/04 03:38

dodox86

総合スコア9256

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

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

yuki-o0413

2020/08/05 08:47

助言いただきありがとうございます! ”Category2”の箇所ですが、nullになっていてパラメータが渡されていないのではという点、なるほどと思い、CreateConfirmServlet.javaの#50行目付近を以下のように変更しました。 } else if (cCat1.equals("開発用語")) { if (cCat2 == null) { request.getRequestDispatcher("/createInput.jsp").forward(request, response); } else if(cCat2.equals("")) { request.getRequestDispatcher("/createInput.jsp").forward(request, response); } } else if (cCat1.equals("運用用語")) { if (cCat2 == null) { request.getRequestDispatcher("/createInput.jsp").forward(request, response); } else if(cCat2.equals("")) { request.getRequestDispatcher("/createInput.jsp").forward(request, response); } } コード修正後テストをすると、結果は期待通りではありませんでしたが、ステータスコード500にならないようになりました。 以下テスト結果です ・エクリプスで表示を行った場合、文字入力半角(異常系)、分類選択は正常系で入力→createConfirm.jsp画面に遷移(NG:文字の全角かのチェックが効いていない) ・エクリプスで表示を行い、文字入力半角(異常系)、分類選択は異常系で入力 →createInput.jsp画面に戻る(OK) ・ブラウザ(Google Chrome or EI)で表示、文字入力半角(異常系)、分類選択は正常系 →createConfirm.jsp画面に遷移(NG:入力文字の全角かのチェックが効いていない) ・ブラウザ(Google Chrome or EI)で表示、文字入力半角(異常系)、分類選択は異常系 →画面が真っ白になりフリーズ(NG:質問記載時と症状同じ) ※【コンソール】重大: サーブレット [main.CreateConfirmServlet] のServlet.service()が例外を投げました [水 8月 05 17:39:32 JST 2020] エラー画面は出なくなりましたが、期待通りにまだ動かない状態です。 <現在の問題点> ・入力文字のバリデーションチェックが効かない(正常系は全角であることで、全角ではなかったら、ホーム画面に切り替わる)。 ※分類選択が正常であれば、入力項目がなんでもチェックを通って次の画面に行ってしまう。 ・分類選択で、異常系の時(分類1で”開発用語”または”運用用語”を選択しているときに、分類2で選択を行わないとき)はホーム画面に戻ることを想定しているが、ブラウザの動作では分類選択で異常系の時、画面が白くなりフリーズしてしまう。 ※ブラウザのキャッシュはクリアにしてテストを行っています。 IF分の書き方、正規表現の書き方にまだ問題があるのかもしれません。引き続き調査してみます。
dodox86

2020/08/05 09:31

> Servlet.service()が例外を投げました [水 8月 05 17:39:32 JST 2020] 「例外を投げました」と報告されているのですから、そういったものを確認するのが先決です。そうでない場合、ロジックからの推測でしかなく、遠回りです。デバッガーを使うのが1番として、そうでない場合は各ロジック部分(ステップ)中に何らかのprint出力を挟み、それぞれのオブジェクトが正しい値になっているかを確認します。エラーが出力されている場合、WEBサーバーのエラーログファイルに出力されている場合もあります。 正規表現で確認するときに、オブジェクトが無効(nullとか)になっているのではないですか? 逐一確認してみてください。また、そのチェック部分以外は動いているのであれば、チェック部分だけの問題です。WEB画面の遷移が問題なのか、正規表現の問題なのか、分岐の問題なのか、切り分けましょう。
yuki-o0413

2020/08/06 00:19

原因調査の方法を教えていただき、ありがとうございます。 デバッグのやり方からもう一度確認し、やってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問