【初心者向け/ITスクール54日】API&Parsing
はじめに
今日は、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