実現したいこと
ペット情報を表示する簡単な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以上で常時される)
回答1件
あなたの回答
tips
プレビュー