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

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

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

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JSP

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

Java

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

servlet

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

Q&A

解決済

2回答

2913閲覧

Servlet-JSPとBeanを使って計算する

tatakauneko3

総合スコア4

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JSP

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

Java

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

servlet

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

0グッド

0クリップ

投稿2021/08/11 14:01

タイトル通りですが、JSPで数字を入力→Servletで結果を算出→Beanに格納→JSP(get)で出力。
という順番で計算を行うコードを作ろうとしています。

その際に、トップ画面は表示出来ましたが次のようなエラーが出て内容が分からず解決できませんでした。.Javaので2ファイル作成中にはエラー表示はありませんでした。勉強不足で申し訳ございませんが、宜しくお願い致します。

<使用ソフト>
eclipse Version: Oxygen.3a Release (4.7.3a)
Apache Tomcat/8.0.50

【エラーコード】 HTTPステータス 500 - For input string: "" type 例外レポート メッセージ For input string: "" 説明 The server encountered an internal error that prevented it from fulfilling this request. 例外 java.lang.NumberFormatException: For input string: "" java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) java.lang.Integer.parseInt(Integer.java:592) java.lang.Integer.parseInt(Integer.java:615) ex.Question04Servlet.doPost(Question04Servlet.java:38) javax.servlet.http.HttpServlet.service(HttpServlet.java:648) javax.servlet.http.HttpServlet.service(HttpServlet.java:729) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 注意 原因のすべてのスタックトレースは、Apache Tomcat/8.0.50のログに記録されています Apache Tomcat/8.0.50

JSP

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 5<%-- Java Beanクラスを使う --%> 6<jsp:useBean id="formBean" scope="session" class="ex.Question04FormBean" /> 7 8<html> 9<head> 10<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 11<title>練習問題</title> 12</head> 13<body> 14 15 <h1>Beanを使う</h1> 16 <br> 17 <hr> 18 <br> 19 <form method="POST" action="/question4/sample"> 20 <table border="1"> 21 <tr> 22 <td>数字1</td> 23 <td><input type="text" name="inputData1" value=""></td> 24 </tr> 25 <tr> 26 <td>数字2</td> 27 <td><input type="text" name="inputData2" value=""></td> 28 </tr> 29 </table> 30 <br> 31 <hr> 32 <br> <input type="submit" value="計算"> 33 </form> 34 35 <p><font color="red"><jsp:getProperty property="msg" name="formBean"/></font></p> 36</body> 37</html>

Java

1//Servlet 2package ex; 3 4import java.io.IOException; 5 6import javax.servlet.RequestDispatcher; 7import javax.servlet.ServletException; 8import javax.servlet.http.HttpServlet; 9import javax.servlet.http.HttpServletRequest; 10import javax.servlet.http.HttpServletResponse; 11 12public class Question04Servlet extends HttpServlet { 13 14 public void doPost(HttpServletRequest request, HttpServletResponse response) 15 throws IOException, ServletException { 16 17 // レスポンスの為のコンテンツタイプの設定。クライアントにどのようなデータを送るのかを指定 18 response.setContentType("text/html; charset=utf-8"); 19 // リクエストのエンコードの設定。リクエスト・パラメータ読み込み時の文字コードを明示 20 request.setCharacterEncoding("utf-8"); 21 22 //Beanクラスのインスタンス生成 23 Question04FormBean q4 = new Question04FormBean(); 24 25 //リクエストからパラメータの取得 26 String inputData1 = request.getParameter("inputData1"); 27 String inputData2 = request.getParameter("inputData2"); 28 String msg = "入力に不備があります。整数を入力してください。"; 29 30 //入力チェック(「null」或いは、空文字チェック) 31 if (null == inputData1 || "".equals(inputData1)) { 32 //入力値がない場合 33 q4.setMsg(msg); 34 } else if (null == inputData2 || "".equals(inputData2)) { 35 //入力値がある場合 36 q4.setMsg(msg); 37 } 38 39 //整数に変換 40 int number1 = Integer.parseInt(inputData1); 41 int number2 = Integer.parseInt(inputData2); 42 43 //足算を実施 44 int sum = number1 + number2; 45 msg = String.valueOf(sum); 46 q4.setMsg(msg); 47 48 //リクエストに「msg」をキーに値をセット 49 request.setAttribute("msg", msg); 50 } 51 52} 53

Java

1//Bean 2package ex; 3 4public class Question04FormBean { 5 private String msg; 6 7 public String getMsg() { 8 return msg; 9 } 10 public void setMsg(String msg) { 11 this.msg = msg; 12 } 13} 14

xml

1//web.xmlファイル 2 3<?xml version="1.0" encoding="UTF-8"?> 4<web-app xmlns="http://java.sun.com/xml/ns/javaee" 5 xmlns:xsi="http://www.w3c.org/2001/XMLSchema-instannce" 6 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee/ 7 web-app_2_4.xsd" version="2.4"> 8 9 <display-name>ServletSample</display-name> 10 <welcome-file-list> 11 <welcome-file>ex/input.jsp</welcome-file> 12 </welcome-file-list> 13 14 <servlet> 15 <servlet-name>test</servlet-name> 16 <servlet-class>ex.Question04Servlet</servlet-class> 17 </servlet> 18 19 <servlet-mapping> 20 <servlet-name>test</servlet-name> 21 <url-pattern>/sample</url-pattern> 22 </servlet-mapping> 23 24</web-app>

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

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

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

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

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

guest

回答2

0

ベストアンサー

タイトル通りですが

計算式にBean使用してないです。本当にタイトル通りですか?

JSPで数字を入力→Servletで結果を算出→Beanに格納→JSP(get)で出力。

postしているようです。想定通りの画面遷移していますか?
あと、jspはどのタイミングで出してます?

トップ画面は表示出来ましたが次のようなエラーが出て内容が分からず解決できませんでした

エラーログ(例外のスタックトレース)では、例外クラス(とそのメッセージ)と出力場所(自分で書いたクラスとメソッドの場所)を読み取れれば、内容は把握できるかと思います。
例外クラスをネット検索すると、例外の意味が見えてきます。

その上で、
・数値入力したはずなのに、何故かブランクになってしまって、困っています。
なのか、
・なぜか意図しない例外が出てしまっている。
なのか、その他か、
が明確になっていると、問題を解決しやすくなるかと思います。

とりあえず、説明通りにJavaとjsp修正してみたので、
やりたい事に沿っているかご確認ください。

Java

1//Servlet 2package ex; 3 4import java.io.IOException; 5import java.util.regex.Matcher; 6import java.util.regex.Pattern; 7 8import javax.servlet.ServletException; 9import javax.servlet.http.HttpServlet; 10import javax.servlet.http.HttpServletRequest; 11import javax.servlet.http.HttpServletResponse; 12 13public class Question04Servlet extends HttpServlet { 14 15 // 数値チェック用 16 private static String REGEX_NUMBER = "^[0-9]+$"; 17 18 public void doGet(HttpServletRequest request, HttpServletResponse response) 19 throws IOException, ServletException { 20 21 // レスポンスの為のコンテンツタイプの設定。クライアントにどのようなデータを送るのかを指定 22 response.setContentType("text/html; charset=utf-8"); 23 // リクエストのエンコードの設定。リクエスト・パラメータ読み込み時の文字コードを明示 24 request.setCharacterEncoding("utf-8"); 25 26 //Beanクラスのインスタンス生成 27 Question04FormBean q4 = new Question04FormBean(); 28 29 //リクエストからパラメータの取得 30 q4.setInputData1(request.getParameter("inputData1")); 31 q4.setInputData2(request.getParameter("inputData2")); 32 33 // 入力チェック 34 String validateResult = validate(q4); 35 if(!"".equals(validateResult)) { 36 q4.setMsg(validateResult); 37 request.setAttribute("formBean", q4); 38 request.getRequestDispatcher("/jsp/Question04.jsp").forward(request, response); 39 return; 40 } 41 42 //整数に変換 43 int number1 = Integer.parseInt(q4.getInputData1()); 44 int number2 = Integer.parseInt(q4.getInputData2()); 45 46 //足算を実施 47 int sum = number1 + number2; 48 49 q4.setMsg(String.valueOf(sum)); 50 request.setAttribute("formBean", q4); 51 request.getRequestDispatcher("/jsp/Question04.jsp").forward(request, response); 52 } 53 54 private String validate(Question04FormBean q4) { 55 56 StringBuilder sb = new StringBuilder(); 57 58 // InputData1の入力チェック 59 if(q4.getInputData1() == null || "".equals(q4.getInputData1())) { 60 sb.append("InputData1は入力必須です。<br/>"); 61 } else { 62 Pattern p1 = Pattern.compile(REGEX_NUMBER); 63 Matcher m1 = p1.matcher(q4.getInputData1()); 64 if(!m1.matches()) { 65 sb.append("InputData1は数値で入力してください<br/>"); 66 } 67 } 68 69 // InputData2の入力チェック 70 if(q4.getInputData2() == null || "".equals(q4.getInputData2())) { 71 sb.append("InputData2は入力必須です。<br/>"); 72 } else { 73 Pattern p2 = Pattern.compile(REGEX_NUMBER); 74 Matcher m2 = p2.matcher(q4.getInputData2()); 75 if(!m2.matches()) { 76 sb.append("InputData2は数値で入力してください<br/>"); 77 } 78 } 79 80 return sb.toString(); 81 } 82}

Java

1package ex; 2 3public class Question04FormBean { 4 5 // 入力パラメータ1 6 private String inputData1; 7 8 // 入力パラメータ2 9 private String inputData2; 10 11 // 出力メッセージ 12 private String msg; 13 14 public String getMsg() { 15 return msg; 16 } 17 18 public void setMsg(String msg) { 19 this.msg = msg; 20 } 21 22 public String getInputData1() { 23 return inputData1; 24 } 25 26 public void setInputData1(String inputData1) { 27 this.inputData1 = inputData1; 28 } 29 30 public String getInputData2() { 31 return inputData2; 32 } 33 34 public void setInputData2(String inputData2) { 35 this.inputData2 = inputData2; 36 } 37} 38

JSP

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 5<%-- Java Beanクラスを使う --%> 6<jsp:useBean id="formBean" scope="session" class="ex.Question04FormBean" /> 7 8<html> 9<head> 10<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 11<title>練習問題</title> 12</head> 13<body> 14 15 <h1>Beanを使う</h1> 16 <br> 17 <hr> 18 <br> 19 <form method="GET" action="/question4/sample"> 20 <table border="1"> 21 <tr> 22 <td>数字1</td> 23 <td><input type="text" name="inputData1" value=""></td> 24 </tr> 25 <tr> 26 <td>数字2</td> 27 <td><input type="text" name="inputData2" value=""></td> 28 </tr> 29 </table> 30 <br> 31 <hr> 32 <br> <input type="submit" value="計算"> 33 </form> 34 <p><font color="red"><jsp:getProperty property="msg" name="formBean"/></font></p> 35</body> 36</html>

投稿2021/08/12 01:46

TetsujiMiwa

総合スコア1124

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

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

tatakauneko3

2021/08/12 03:46

細かくご説明かつ今後のアドバイスまでありがとうございます。おっしゃる通りきちんとbeanに格納出来ておりませんでした。最終的には解決出来たのですが、Tetsujiさんの書き方がよりスマートです。終業後に改めて確認し再考致します。
guest

0

現状こうなってるのでは

java

1int i = Integer.parseInt(""); 2

空かnullの場合にsetMsg()と言うのは書かれてますが、現状の実装では空のままでもparseIntされてます。
空でない、且つ数値のみで構成された文字列であるという条件は必要です。
正規表現によるチェック、または想定例外として自身でtry-catchにてNumberFormatExceptionを捕捉するなど 配慮が必要です。(両方入れても良いかもしれませんが)

投稿2021/08/11 23:41

m.ts10806

総合スコア80861

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

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

tatakauneko3

2021/08/12 03:42

ありがとうございます。数字の部分はtry-catchにてNumberFormatExceptionを捕捉に解決出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問