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

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

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

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

servlet

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

Q&A

解決済

1回答

868閲覧

try-catch文 サーブレットと他クラス

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

servlet

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

0グッド

0クリップ

投稿2019/08/20 16:39

前提・実現したいこと

フォーム画面で年齢や身長、体重を入力しBMIなどを測定するものを作りたいと思っています。
フォーム画面では年齢などを必須入力としたいため未入力チェックを行っているのですが、現在の状態では全角や半角文字に対してエラーメッセージを表示できません。そのため全角や半角文字に対してもエラーメッセージが出るような処理を行いたいのでtry-catch(NumberFormatException)を使用しようと思っています。また、メッセージの内容は、未入力だった場合と全角や半角文字が入力された場合とで分けたいと思っています。ですがdoGetメソッドが長くなってしまうので他クラス別メソッドで未入力チェックを実装しようと思っています。ですが、他クラスでtry-catchを使用してその値をサーブレットに渡す?イメージが全くつきません。

ageのみなどでも構いませんので、修正箇所を教えていただけないでしょうか。

またtry-catchやNumberFormatException以外のよい方法などありましたらお願いします。

該当のソースコード

Servlet

1protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 2 // TODO Auto-generated method stub 3 EntityManager em = DBUtil.createEntityManager(); 4 5 String age = request.getParameter("age"); 6 String gender_flag = request.getParameter("gender_flag"); 7 String height = request.getParameter("height"); 8 String weight = request.getParameter("weight"); 9 String fat_percentage = request.getParameter("fat_percentage"); 10 String waist = request.getParameter("waist"); 11 String activity = request.getParameter("activity"); 12 13 Health health = new Health(); 14 15 health.setAge(age); 16 health.setGender_flag(gender_flag); 17 health.setHeight(height); 18 health.setWeight(weight); 19 health.setFat_percentage(fat_percentage); 20 health.setWaist(waist); 21 health.setActivity(activity); 22 23 // 未入力チェック(年齢、身長、体重のみ必須) 24 List<String> errors = HealthValidator.validate(health); 25 if(errors.size() > 0) { 26 em.close(); 27 request.setAttribute("_token", request.getSession().getId()); 28 request.setAttribute("health", health); 29 request.setAttribute("errors", errors); 30 // 元の入力フォームへ戻る 31 RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/health/healthCheck.jsp"); 32 rd.forward(request, response); 33 }
package validators; import java.util.ArrayList; import java.util.List; import models.Health; public class HealthValidator { public static List<String> validate(Health h) { List<String> errors = new ArrayList<String>(); String age_error = _validateAge(h.getAge()); if(!age_error.equals("")) { errors.add(age_error); } String height_error = _validateHeight(h.getHeight()); if(!height_error.equals("")) { errors.add(height_error); } String weight_error = _validateWeight(h.getWeight()); if(!weight_error.equals("")) { errors.add(weight_error); } return errors; } private static String _validateAge(Integer age) { if(age == null || age.equals("")) { return "年齢を入力してください"; } return ""; } private static String _validateHeight(Double height) { if(height == null || height.equals("")) { return "身長を入力してください"; } return ""; } private static String _validateWeight(Double weight) { if(weight == null || weight.equals("")) { return "体重を入力してください"; } return ""; } }

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

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

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

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

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

jimbe

2019/08/20 17:41 編集

> 他クラス別メソッドで未入力チェックを実装しようと思っています。ですが、他クラスでtry-catchを使用してその値をサーブレットに渡す?イメージが全くつきません。 ご提示のコードはそれっぽくなっているようですが, 何か問題なのでしょうか. if 文で errors に add する代わりに, try-catch で NumberFormatException 発生時に errors に add するだけかと思います.
m.ts10806

2019/08/21 00:16

>全角や半角文字に対してエラーメッセージを表示できません 正規表現でバリデーションするのはダメなのでしょうか。 「入力チェック」の範疇であればtry-catchで拾うよりきちんとブラックリスト方式で「ダメなものを指定して弾く」方が理にかなっていると思います。
退会済みユーザー

退会済みユーザー

2019/08/21 04:28

jimbe様> 例えばtry{!age_error.equals("") }catch{(NumberFormatException e) {errors.add(age_error);} ということでしょうか?
退会済みユーザー

退会済みユーザー

2019/08/21 04:31

m.ts10806様> 正規表現でバリデーション、またブラックリスト方式というのが理解が及ばないのですが、jimbe様がおっしゃっていることではないのですよね? 「ダメなものを指定」というのは全角や文字を指定するということでしょうか?
m.ts10806

2019/08/21 04:35

そもそもバリデーションはほとんどがブラックリスト方式で入力のチェックを行うものです。 ご自身でも「入力が空だったら」でエラーとしていますが、それはブラックリスト方式です。 受け入れられないものをチェックすることですね。 Exceptionはあくまで「異常処理」の範疇で、「意図しない事態が起きた時」というのが通例です。 「自由に入力できる欄」からくる情報は「受け入れられるものだけ受け入れる」とするべきで、 そうすると「受け入れられないもの」は「想定できる範囲」になるので、Exceptionは不適当かなと思っています。
退会済みユーザー

退会済みユーザー

2019/08/21 04:40

プログラミング思考の点で、ということですね! ありがとうございます。参考にさせていただきます。
jimbe

2019/08/21 12:10

> 例えば ~ try-catch の記述の仕方をお分かりになっていないということでしょうか. だとすれば NumberFormatException がどのような場合に発生するのか等からお調べになれば, try-catch の例文も見られるかと思います.
guest

回答1

0

ベストアンサー

jimbe様がおっしゃったように、if文をtry-catchに変えてひとまずは思った通りの動作をさせることができました。ありがとうございます。
m.ts様の視点で改めて改良していこうかと思います。

投稿2019/08/22 03:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問