📘

【初心者向け/ITスクール54日】API&Parsing

2023/09/26に公開

はじめに

今日は、ITスクールに通った54日目の日で、今日学んだ知識を記事にシェアしたいと思います。本記事が、ITを勉強を始めた方々にもロードマップになればいいと思います。

54日目は、いよいよTomcatから解放され、データーを扱うことを練習しました。1か月前に勉強したことがある、XMLとJSONをDBのデーターから生成し、Parsingする練習を行いました。

Ajax

Asynchronous JavaScript and XMLの略語で、JavaScript、html、xml、JSONなどを交換する技術です。今まで、ServletとJSP、requestのattributeを活用して、ページ全体をそのまま、forwardしたり、includeしましたが、Ajaxを通して、ページの一部のみローディングする技術らいしいです!

API(XML)

XML作成(入力:StringBuffer)

public static String getAllFruit2(HttpServletRequest req) {
		
   Connection con = null;
   PreparedStatement pstmt = null;
   ResultSet rs = null;
   StringBuffer sb = null;  
		
   try {	  
      con = MemberDBManager.connect("hyonPool");  
      String sql = "select * from sep26_fruit order by f_price";	  
      pstmt = con.prepareStatement(sql);
      rs = pstmt.executeQuery();
		  
      sb = new StringBuffer();
      sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
      sb.append("<sep26_fruit>");
      while(rs.next()) {
	  sb.append("<fruit>");
	  sb.append("<f_name>" + rs.getString("f_name") + "</f_name>");
	  sb.append("<f_price>" + rs.getInt("f_price") + "</f_price>");
	   }
	sb.append("</sep26_fruit>");
	return sb.toString();
}catch(Exception e){
     e.printStackTrace();
      return "오류";
}finally {
	MemberDBManager.close(con, pstmt, rs);
	}
    }		

XMLをControllerにプリント(出力:PrintWriter)

@WebServlet("/GetFruit")
public class GetFruit extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("UTF-8");
		String s = FruitDAO.getAllFruit2(request);
		PrintWriter out = response.getWriter();
		out.print(s);
	}

StringBufferに値を入れ、Controllerから値を出力します。前回、Springから値をJSON APIを作成したことがあるので、理解がすぐできました。

API(JSON)

JSON作成(入力:StringBuffer)

SpringBootにJSONを作成してくれる、ライブラリがあるため、コードに対してはこんな方法もあるんだなみたいな感覚にみました。
最初のif文のみflag変数をtrueにし、以後はfalseに値を割りあてることで、falseの場合のみ, が作るパターンです。


try {
			  
con = MemberDBManager.connect("hyonPool");  
String sql = "select * from sep26_fruit order by f_price";
		  
pstmt = con.prepareStatement(sql);
rs = pstmt.executeQuery();
		  
StringBuffer sb = new StringBuffer();
boolean isFirst = true;
sb.append("[");              
    while(rs.next()) {   
    //最初はif文にかかり、isFirstがfalseになるので、最初のオブジェクトの以後は","が付きます。
	if(isFirst) {
	     isFirst = false;
	}else {
	  sb.append(",");
	}
	sb.append("{");
	sb.append("\"f_name\":\"" + rs.getString("f_name") + "\",");
	sb.append("\"f_price\":" + rs.getInt("f_price"));
	sb.append("}");
	}
	sb.append("]");
	return sb.toString();
  }catch(Exception e){
    e.printStackTrace();
	return "오류";
	}finally {
      MemberDBManager.close(con, pstmt, rs);
	  }
	}		

JSONをControllerにプリント(出力:PrintWriter)

@WebServlet("/GetFruitJSON")
public class GetFruitJSON extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("UTF-8");
		response.setContentType("application/json");
		response.getWriter().print(FruitDAO.getAllFruit3(request));
	}

確認のため、JSON Viewerをインストールしました。ただしく、フォーマットが完成された場合、このように色を付けることでJSONにきちんと作成されたか確認できます。

API呼び出し後、パーサ

JSON

	public static void getAllFruits2(HttpServletRequest req) {
	
	 try {
//事前に作成したHttpClientオブジェクトからurlのbodyをダウンロード。そのために、InputStream活用
	InputStream is = BeaverHttpClient.download("http://localhost/Sep_26_1_Ajax/GetFruitJSON");
//もらったバイナリをUTF-8に変換
       String data = BeaverHttpClient.convert(is, "UTF-8");
		 
      JSONParser jp = new JSONParser();
      JSONArray ja = (JSONArray)jp.parse(data);
		 
      JSONObject jo = null;
      ArrayList<Fruit> fruits = new ArrayList<>();
      Fruit fruit = null;
		 
      for(int i= 0; i<ja.size(); i++) {
	jo =  (JSONObject)ja.get(i);
	   fruit = new Fruit();
//JSONObjectをStringに変換してからfruitをDTOとして活用
	fruit.setF_name(jo.get("f_name").toString());
			fruit.setF_price(Integer.parseInt(jo.get("f_price").toString()));
			fruits.add(fruit);
		 }
		 req.setAttribute("fruits2",fruits);
	 }catch(Exception e) {
		 e.printStackTrace();
	 }
		

JSONArrayからJSONObjectを取り出し、getter,setterを活用します。
以後は、JSTLを活用し、requestオブジェクトに込めたAttributeを活用して、ループしながら、値を入れます。

<c:forEach var="fruit" items="${fruits2 }">
   ${fruit.f_name} - ${fruit.f_price}  	
</c:forEach>	

Discussion