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

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

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

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

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

808閲覧

選択されたvalueによって表示を変える

sisyamo0000

総合スコア3

Java

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

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2024/01/18 12:29

実現したいこと

ペット情報を表示する簡単なWebサイトをjspとサーブレットで作成をしてるのですが、
一部分だけnullで表示がされません。

前提

ペット情報を表示する簡単なWebサイト作成をしています。
①index.jspで暗証番号を入力する(StartServlet.javaで暗証番号があっているか確認)
②petList.jspでポチ(dog)とタマ(cat)のどちらかを選択(PetListServle.javaで選択されたvalueと紐付いたMapを取得)
③名前、年齢、体長、体重、散歩場所orお気に入りのおもちゃの5項目を表示。

散歩場所orお気に入りのおもちゃに関しては
dogならば→散歩場所:代々木公園、
catならば→お気に入りのおもちゃ:猫じゃらし 
というように項目を変更されます。
名前〜体重までは中身の内容までしっかり対応した値が出るものの、最後の項目だけエラーも表示もされません。

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

名前〜体重までは中身の内容までしっかり対応した値が出るものの、最後の選択により表示内容が変わる項目だけエラーも表示もされません。

PetUtil.getOptionTitleStr(requestScope.selectedPet)(散歩場所orお気に入りのおもちゃ)
この部分の値がnullになっていることは調べてわかったのですが、どう対応したらいいかがわからなくなってしまったので、アドバイスや何を試せばいいかなどを教えていただきたいです。

該当のソースコード

petList.jsp

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 4<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> 5 6<!DOCTYPE html> 7<html> 8<head> 9<meta charset="UTF-8"> 10<title>Java</title> 11<link href="css/styles.css" rel="stylesheet"> 12</head> 13<body> 14 15 <h1>ペット情報管理</h1> 16 17 <div class="info"> 18 <h2>ペット一覧</h2> 19 <form action="petListServlet" method="doGet"> 20 <button class="btn" type="submit" name="btn" value="dog">ポチ</button> 21 <button class="btn" type="submit" name="btn" value="cat">タマ</button> 22 </form> 23 </div> 24 25 <form action="index.jsp"> 26 <button class="btn" type="submit">先頭に戻る</button> 27 </form> 28</body> 29</html>

petInfo.jsp

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 4<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> 5 6<%@ page import="jp.co.axiz.Pet"%> 7<%@ page import="jp.co.axiz.util.Cat"%> 8<%@ page import="jp.co.axiz.util.Dog"%> 9 10 11 12<!DOCTYPE html> 13<html> 14<head> 15<meta charset="UTF-8"> 16<title>Java</title> 17<link href="css/styles.css" rel="stylesheet"> 18</head> 19<body> 20 <h1>ペット情報管理</h1> 21 <div class="info"> 22 <h2>ペット情報</h2> 23 24 <table class="petInfoTable"> 25 26 27 <tr> 28 <th>Debug Option Title:</th> 29 <td>${PetUtil.getOptionTitleStr(requestScope.selectedPet)}</td> 30 </tr> 31 32 33 <tr> 34 <th>名前:</th> 35 <td>${requestScope.selectedPet.name}</td> 36 </tr> 37 <tr> 38 <th>年齢:</th> 39 <td>${requestScope.selectedPet.age}</td> 40 </tr> 41 <tr> 42 <th>体長:</th> 43 <td>${requestScope.selectedPet.height}</td> 44 </tr> 45 <tr> 46 <th>体重:</th> 47 <td>${requestScope.selectedPet.weight}<c:if 48 test="${requestScope.selectedPet.isFat()}"> 49 <span class="fat">*太りすぎです。</span> 50 </c:if> 51 </td> 52 </tr> 53 <tr> 54 55 <!--getOptionTitleStrで散歩場所orお気に入りの遊具--> 56 <!--isDogがtrueなら代々木公園、falseなら猫じゃらし--> 57 <tr> 58 <th><c:out value="${PetUtil.getOptionTitleStr(requestScope.selectedPet)}" /></th> 59 <td><c:choose> 60 <c:when test="${PetUtil.isDog(requestScope.selectedPet)}"> 61 <c:if test="${not empty requestScope.selectedPet.walkingPlace}"> 62 <c:out value="${requestScope.selectedPet.walkingPlace}" /> 63 </c:if> 64 </c:when> 65 <c:when test="${PetUtil.isCat(requestScope.selectedPet)}"> 66 <c:if test="${not empty requestScope.selectedPet.favoriteItem}"> 67 <c:out value="${requestScope.selectedPet.favoriteItem}" /> 68 </c:if> 69 </c:when> 70 </c:choose></td> 71 </tr> 72 73 </table> 74 </div> 75 76 <form action="petList.jsp"> 77 <button class="btn" type="submit">戻る</button> 78 </form> 79 80 <form action="index.jsp"> 81 <button class="btn" type="submit">先頭に戻る</button> 82 </form> 83</body> 84</html>

PetListServle.java

1package jp.co.axiz.servlet; 2 3import java.io.IOException; 4import java.util.HashMap; 5 6import javax.servlet.ServletException; 7import javax.servlet.annotation.WebServlet; 8import javax.servlet.http.HttpServlet; 9import javax.servlet.http.HttpServletRequest; 10import javax.servlet.http.HttpServletResponse; 11 12import jp.co.axiz.Pet; 13 14/** 15 * Servlet implementation class PetListServlet 16 */ 17@WebServlet("/petListServlet") 18public class PetListServlet extends HttpServlet { 19 private static final long serialVersionUID = 1L; 20 21 /** 22 * @see HttpServlet#HttpServlet() 23 */ 24 public PetListServlet() { 25 super(); 26 // TODO Auto-generated constructor stub 27 } 28 29 /** 30 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 31 */ 32 protected void doGet(HttpServletRequest request, HttpServletResponse response) 33 throws ServletException, IOException { 34 // TODO Auto-generated method stub 35 36 //選択されたのが犬と猫どちらか 37 String buttonValue = request.getParameter("btn"); 38 //確認用 39 System.out.println("buttonValue: " + buttonValue); 40 41 // PetSessionInfoクラスのインスタンスを取得 42 PetSessionInfo petSessionInfo = new PetSessionInfo(); 43 44 // ペット情報の一覧を取得 45 HashMap<String, Pet> petList = petSessionInfo.getPetList(); 46 47 //確認用 48 System.out.println("petList: " + petList); 49 50 51 52 53 Pet selectedPet = petList.get(buttonValue); 54 55 //nullになってないかを確認 56 System.out.println("selectedPet: " + selectedPet); 57 58 request.setAttribute("selectedPet", selectedPet); 59 60 request.getRequestDispatcher("/petInfo.jsp").forward(request, response); 61 } 62 63 /** 64 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 65 */ 66 // protected void doPost(HttpServletRequest request, HttpServletResponse response) 67 // throws ServletException, IOException { 68 // // TODO Auto-generated method stub 69 // doGet(request, response); 70 // 71 // } 72 73} 74

PetSessionInfo.java

1package jp.co.axiz.servlet; 2 3import java.util.HashMap; 4 5import jp.co.axiz.Pet; 6import jp.co.axiz.util.Cat; 7import jp.co.axiz.util.Dog; 8 9/** 10 * ペット情報の一覧をHashMapで保持しておくためのクラス 11 */ 12public class PetSessionInfo { 13 private HashMap<String, Pet> petList; 14 15 public PetSessionInfo() { 16 petList = new HashMap<String, Pet>(); 17 18 Dog dog = new Dog("ポチ", 5, 55, 20, "柴犬", "代々木公園"); 19 Cat cat = new Cat("タマ", 3, 40, 4, "アメリカンショートヘア", "猫じゃらし"); 20 21 petList.put("dog", dog); 22 petList.put("cat", cat); 23 } 24 // 25 // /** 26 // * ペット情報の一覧 27 // */ 28 public void setPetList(HashMap<String, Pet> _petList) { 29 petList = _petList; 30 } 31 32 // /** 33 // * ペット情報の一覧設定 34 // */ 35 public HashMap<String, Pet> getPetList() { 36 return petList; 37 } 38} 39

Pet.java

1package jp.co.axiz; 2 3public interface Pet { 4 public String getName(); 5 6 public void setName(String name); 7 8 public int getAge(); 9 10 public void setAge(int age); 11 12 public int getHeight(); 13 14 public void setHeight(int height); 15 16 public int getWeight(); 17 18 public void setWeight(int weight); 19 20} 21

PetUtil.java

1package jp.co.axiz.util; 2 3import jp.co.axiz.Pet; 4 5public class PetUtil { 6 /** 7 * 引数に指定した文字列がnull、または空文字かを判定 8 */ 9 10 //StartServletで使用 11 public static boolean isNullOrEmpty(String str) { 12 if (str == null || str.isEmpty()) { 13 return true; 14 } else { 15 return false; 16 } 17 } 18 /** 19 * 引数に指定した文字列が数値に変換できるかを判定 20 */ 21 22 //StartServletで使用 23 public static boolean isNumber(String str) { 24 // このメソッドは作成済 25 try { 26 Integer.parseInt(str); 27 } catch (NumberFormatException ex) { 28 return false; 29 } 30 return true; 31 } 32 33 /** 34 * 引数に指定した文字列が数値に変換して返却する。 35 * 変換できない場合はnullを返却する。 36 */ 37 38 //StartServletで使用 39 public static Integer checkAndParseInt(String str) { 40 // このメソッドは作成済 41 if (isNumber(str)) { 42 return Integer.parseInt(str); 43 } else { 44 return null; 45 } 46 } 47 /** 48 */ 49 public static String getOptionTitleStr(Pet pet) { 50 //確認ようにコンソール出力を挿入 51 System.out.println("Debug: Entering getOptionTitleStr with pet: " + pet); 52 53 if (isDog(pet)) { 54 System.out.println("Debug: Inside isDog branch"); 55 return "散歩場所"; 56 } else if (isCat(pet)) { 57 System.out.println("Debug: Inside isCat branch"); 58 return "お気に入り遊具"; 59 } else { 60 System.out.println("Debug: Inside default branch"); 61 return "-"; 62 } 63 } 64 65 /** 66 * petInfo.jspの最後の項目の値を取得 67 */ 68 69 public static String getOptionStr(Pet pet) { 70 if (isDog(pet)) { 71 return ((Dog) pet).getWalkingPlace(); 72 } else if (isCat(pet)) { 73 return ((Cat) pet).getFavoriteItem(); 74 } else { 75 return "-"; 76 } 77 } 78 /** 79 * 引数で受け取ったオブジェクトの型がDogかを判定 80 81 */ 82 public static boolean isDog(Pet pet) { 83 System.out.println("isDog: " + (pet instanceof Dog)); 84 if (pet instanceof Dog) { 85 return true; 86 } else { 87 return false; 88 } 89 } 90 /** 91 * 引数で受け取ったオブジェクトの型がCatかを判定 92 */ 93 public static boolean isCat(Pet pet) { 94 System.out.println("isCat: " + (pet instanceof Cat)); 95 if (pet instanceof Cat) { 96 return true; 97 } else { 98 return false; 99 } 100 } 101}

Dog.java

1package jp.co.axiz.util; 2 3public class Dog extends Animal { 4 private String type; 5 private String place; 6 public Dog(String name, int age, int height, int weight, String type, String place) { 7 super(name, age, height, weight); 8 this.type = type; 9 this.place = place; 10 } 11 @Override 12 public boolean isFat() { 13 //dogは15以上で太り気味 14 return getWeight() >15; 15 } 16 public String getWalkingPlace() { 17 return place; 18 } 19 public void setWalkingPlace(String place) { 20 this.place = place; 21 } 22 public String getType() { 23 return type; 24 } 25 public void setType(String type) { 26 this.type = type; 27 } 28}

試したこと

コンソールで値が取得できているかの表示をして、buttonValue、petList、selectedPet、の部分まではnullではなく、選択したvalueが取得ができていることがわかりました。

上記の条件分岐の部分の最後にnull判定を入れて見たのですが、nullが出たことから、getOptionTitleStrの部分はnullに置き換わっていることはわかりました。

※文字数の都合により関係のないindex.jsp、StartServlethは割愛。
Cat.javaはDog.javaと違う部分が少ないのでこちらも割愛。(placeがitem、isFat()は5以上で常時される)

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

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

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

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

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

jimbe

2024/01/18 14:32

Dog が Animal を extends していますけど、これはどうしたら良いのでしょうか。
guest

回答1

0

ベストアンサー

PetInfo.jsp で PetUtil を import していません。


質問とは関係ありませんが、 Dog と Cat をいちいち確認して別々のメソッドを呼ぶのはオブジェクトとしてうまくいっていないように見えます。
他にどのような処理があるのか分かりませんが、散歩場所も好きなおもちゃも犬猫どちらにあっても良さそうな気がします。
何ならそれらを追加属性として map にでも入れるようにすればクラス判定をしなくて済むのでは無いでしょうか。
また、 Animal は恐らく Pet を implement して Pet → Animal → Dog/Cat という関係になっていると思いますが、 Animal → Pet → Dog/Cat のほうが合っていると思います。

以下は Animal を無くし Pet に処理を集めた上で、 Pet に addnlInfoMap を作り Dog/Cat はそれぞれの都合で情報を追加します。
その為、 petList.jsp はマップの中身をただ出力するだけで済みます。

java

1package jp.co.axiz; 2 3import java.util.*; 4 5//Animal の使い道が分からないので Pet と合成 6public abstract class Pet { 7 //追加情報 8 public static enum AddnlInfo { 9 WALKING_PLACE("散歩場所"), 10 FAVORITE_ITEM("お気に入りの遊具"); 11 12 final String text; 13 AddnlInfo(String text) { 14 this.text = text; 15 } 16 @Override 17 public String toString() { return text; } 18 } 19 20 private final String name; 21 private final int age, height, weight; 22 private final String type; 23 private final Map<AddnlInfo,String> addnlInfoMap = new EnumMap<AddnlInfo,String>(AddnlInfo.class); 24 25 protected int weightLimit = -1; 26 27 public Pet(String name, int age, int height, int weight, String type) { 28 this.name = name; 29 this.age = age; 30 this.height = height; 31 this.weight = weight; 32 this.type = type; 33 } 34 protected void putAddnlInfo(AddnlInfo key, String value) { 35 addnlInfoMap.put(key, value); 36 } 37 38 public String getName() { return name; } 39 public int getAge() { return age; } 40 public int getHeight() { return height; } 41 public int getWeight() { return weight; } 42 public String getType() { return type; } 43 public Map<AddnlInfo,String> getAddnlInfoMap() { return Collections.unmodifiableMap(addnlInfoMap); } 44 45 public boolean isFat() { return weightLimit < 0 ? false : weight > weightLimit; } 46 47 @Override 48 public String toString() { 49 StringBuilder sb = new StringBuilder("["); 50 sb.append("name=").append(name); 51 sb.append(",age=").append(age); 52 sb.append(",height=").append(height); 53 sb.append(",weight=").append(weight); 54 sb.append(",type=").append(type); 55 sb.append(",addnlInfo=").append(addnlInfoMap); 56 return sb.append("]").toString(); 57 } 58}

java

1package jp.co.axiz.util; 2 3import jp.co.axiz.Pet; 4 5public class Dog extends Pet { 6 public Dog(String name, int age, int height, int weight, String type, String place) { 7 super(name, age, height, weight, type); 8 putAddnlInfo(AddnlInfo.WALKING_PLACE, place); 9 weightLimit = 15; 10 } 11}

java

1package jp.co.axiz.util; 2 3import jp.co.axiz.Pet; 4 5public class Cat extends Pet { 6 public Cat(String name, int age, int height, int weight, String type, String item) { 7 super(name, age, height, weight, type); 8 putAddnlInfo(AddnlInfo.FAVORITE_ITEM, item); 9 weightLimit = 5; 10 } 11}

petList.jsp

html

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 4<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%> 5 6<%@ page import="jp.co.axiz.Pet"%> 7 8<!DOCTYPE html> 9<html> 10<head> 11<meta charset="UTF-8"> 12<title>Java</title> 13<link href="css/styles.css" rel="stylesheet"> 14</head> 15<body> 16 <h1>ペット情報管理</h1> 17 <div class="info"> 18 <h2>ペット情報</h2> 19 20 <table class="petInfoTable"> 21 22 <tr> 23 <th>名前:</th> 24 <td>${requestScope.selectedPet.name}</td> 25 </tr> 26 <tr> 27 <th>年齢:</th> 28 <td>${requestScope.selectedPet.age}</td> 29 </tr> 30 <tr> 31 <th>体長:</th> 32 <td>${requestScope.selectedPet.height}</td> 33 </tr> 34 <tr> 35 <th>体重:</th> 36 <td>${requestScope.selectedPet.weight}<c:if 37 test="${requestScope.selectedPet.isFat()}"> 38 <span class="fat">*太りすぎです。</span> 39 </c:if> 40 </td> 41 </tr> 42 <tr> 43 44 <!--散歩場所やお気に入りの遊具--> 45 <c:forEach var="addnlInfo" items="${requestScope.selectedPet.addnlInfoMap}"> 46 <tr> 47 <th><c:out value="${addnlInfo.key}" /></th> 48 <td><c:out value="${addnlInfo.value}" /></td> 49 </tr> 50 </c:forEach> 51 52 </table> 53 </div> 54 55 <form action="petList.jsp"> 56 <button class="btn" type="submit">戻る</button> 57 </form> 58 59 <form action="index.jsp"> 60 <button class="btn" type="submit">先頭に戻る</button> 61 </form> 62</body> 63</html>

投稿2024/01/18 15:04

編集2024/01/18 16:17
jimbe

総合スコア13170

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

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

sisyamo0000

2024/01/19 00:44

回答ありがとうございます。 コードが簡潔でとてもスッキリしました。 初心者ということもあり今回は継承や抽象クラス、インターフェースなどのつながりを一度理解するためにわざと分けてみて、ちゃんと繋がりを作ることができているかの確認を兼ねて分けています。 確かに一緒にできるなら一つにしたほうが見やすいしメンテナンスなどを考えるとそのほうがいいですよね。 一つ質問なのですが、私のコードで最後の表示getOptionTitleStrがちゃんと呼び出されず途中からnullが入ってしまうのは呼び出しがちゃんとできていないことやどこかで型変換ができていないなどのミスがあるからでしょうか。
sisyamo0000

2024/01/19 01:36

すみません。インポートをがを書いたつもりがいつの間にか消えていたことが原因でした、、 確認はちゃんとするものですね。。解決です。
jimbe

2024/01/19 03:06

>継承や抽象クラス、インターフェースなどのつながりを一度理解するためにわざと分けて コードとしては繋がりは出来ていたようですね。 ただシステムとしては無理矢理使って複雑になってしまいました。 (回答のコードでもまだ Dog/Cat クラスは不要かも知れません。) 継承等を用いるのは(ぶっちゃけ)違うクラスを同じものとして扱う為ですので、 instanceof 等で切り分けてしまっては意味がありません。 上手く使えば機能的な if 文は減っていくはずですので、『使えているか』の次として『どう使うか』『使う必要があるか』を考えられると良いと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問