前提・実現したいこと
jspとサーブレットを使って仮想的なECサイトの作成中です。
テキスト検索(top.jsp)でYahooショッピングAPIから商品情報を取得して一覧表示させたい。
レスポンスの読み出しで以下の問題が発生しました。
発生している問題・エラーメッセージ
エラーは起きてませんが、ページやコンソールに何も表示されない。 エクリプスでデバックしてみたら BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); で止まってしまっている。
該当のソースコード
Java
1package EC; 2 3import java.io.BufferedReader; 4import java.io.IOException; 5import java.io.InputStreamReader; 6import java.net.HttpURLConnection; 7import java.net.URL; 8import java.util.ArrayList; 9 10import javax.servlet.ServletException; 11import javax.servlet.annotation.WebServlet; 12import javax.servlet.http.HttpServlet; 13import javax.servlet.http.HttpServletRequest; 14import javax.servlet.http.HttpServletResponse; 15 16import com.fasterxml.jackson.databind.JsonNode; 17import com.fasterxml.jackson.databind.ObjectMapper; 18 19/** 20 * Servlet implementation class Search 21 */ 22@WebServlet("/Search") 23public class Search extends HttpServlet { 24 private static final long serialVersionUID = 1L; 25 26 /** 27 * @see HttpServlet#HttpServlet() 28 */ 29 public Search() { 30 super(); 31 // TODO Auto-generated constructor stub 32 } 33 34 /** 35 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 36 */ 37 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 38 // TODO Auto-generated method stub 39 try { 40 String appid = "アプリケーションID"; 41 //商品キーワードを受け取りString型に格納 42 request.setCharacterEncoding("UTF-8"); 43 String query = request.getParameter("search"); 44 //リクエストURL 45 String url = "http://shopping.yahooapis.jp/ShoppingWebService/V1/json/itemSearch?appid=" 46 + appid + "&query=" + query; 47 //API接続用のURL生成 48 URL urlConn = new URL(url); 49 System.out.println(urlConn); 50 //コネクションを取得 51 HttpURLConnection conn = (HttpURLConnection)urlConn.openConnection(); 52 //HttpのメソッドをGETに指定 53 conn.setRequestMethod("GET"); 54 //リクエストのボディ送信を許可しない 55 conn.setDoOutput(false); 56 //レスポンスのボディ送信を許可する 57 conn.setDoInput(true); 58 //接続 59 conn.connect(); 60 61 //レスポンスの読み出し 62 BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 63 String json = br.readLine(); 64 65 //JSON文字列を読み込み、JsonNodeオブジェクトに変換 66 ObjectMapper mapper = new ObjectMapper(); 67 JsonNode root = mapper.readTree(json); 68 69 //商品検索結果の入ったBeansを格納するArrayListを生成 70 ArrayList<productDataBeans> pdbList = new ArrayList<productDataBeans>(); 71 productDataBeans pdb = new productDataBeans(); 72 73 //JSONから10件分の要素を取り出し、String型に格納 74 //それをBeansにセットし、BeansをArrayListに格納 75 for(int i = 0; i <= 9; i++) { 76 String hitNum = String.valueOf(i); 77 String imageURL = root.get("ResultSet").get("0").get("Result").get(hitNum).get("Image").get("Small").textValue(); 78 String productName = root.get("ResultSet").get("0").get("Result").get(hitNum).get("Name").textValue(); 79 String price = root.get("ResultSet").get("0").get("Result").get(hitNum).get("Price").get("_value").textValue(); 80 int SearchResultNum = root.get("ResultSet").get("totalResultsAvailable").asInt(); 81 82 //商品検索結果を格納するBeansのインスタンスを生成 83 84 pdb.setImageURL(imageURL); 85 pdb.setProductName(productName); 86 pdb.setPrice(price); 87 pdb.setQuery(query); 88 pdb.setSearchResultNum(SearchResultNum); 89 90 pdbList.add(pdb); 91 } 92 93 //ArrayListをリクエストスコープに格納 94 request.setAttribute("resultData", pdbList); 95 96 br.close(); 97 98 request.getRequestDispatcher("/search.jsp").forward(request, response); 99 100 }catch (Exception e) { 101 request.setAttribute("error", e.getMessage()); 102 } 103 } 104 105 /** 106 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 107 */ 108 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 109 // TODO Auto-generated method stub 110 doGet(request, response); 111 } 112 113} 114
jsp
1<%@ page language="java" 2 contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4<!DOCTYPE html> 5<html> 6 <head> 7 <meta charset="UTF-8"> 8 <title>トップページ</title> 9 </head> 10 <body> 11 <p>仮想ショッピングサイトです。ここでのショッピングに金銭は発生しません。</p> 12 <form action="Search" method="GET"> 13 <input type="text" name="search"> 14 <input type="submit" name="submit" value="検索"> 15 </form> 16 </body> 17</html> 18
java
1package kagoyume; 2 3import java.io.Serializable; 4 5//商品情報を持ち回るJavaBeans 6 7public class productDataBeans implements Serializable{ 8 private String hitNum; 9 private String imageURL; 10 private String productName; 11 private String price; 12 private int SearchResultNum; 13 private String query; 14 15 public String getHitNum() { 16 return hitNum; 17 } 18 public void setHitNum(String hitNum) { 19 this.hitNum = hitNum; 20 } 21 22 public String getImageURL() { 23 return imageURL; 24 } 25 public void setImageURL(String imageURL) { 26 this.imageURL = imageURL; 27 } 28 29 public String getProductName() { 30 return productName; 31 } 32 public void setProductName(String productName) { 33 this.productName = productName; 34 } 35 36 public String getPrice() { 37 return price; 38 } 39 public void setPrice(String price) { 40 this.price = price; 41 } 42 43 public int getSearchResultNum() { 44 return SearchResultNum; 45 } 46 public void setSearchResultNum(int SearchResultNum) { 47 this.SearchResultNum = SearchResultNum; 48 } 49 50 public String getQuery() { 51 return query; 52 } 53 public void setQuery(String query) { 54 this.query = query; 55 } 56} 57
試したこと
URL(http://shopping.yahooapis.jp/ShoppingWebService/V1/json/itemSearch?appid=)の中のjson有無両方を試しました。
String json = br.readLine();
を
while(br.ready()){
String son = br.readLine();
}
にして試しました。
###終わりに
最後までご覧いただきありがとうございます。
何か気付いた点あればコメントいただけると助かります。
あなたの回答
tips
プレビュー