본문 바로가기

xml

xml -네이버API활용 예제(쇼핑)

-> 파싱해보기

 

->상품 검색 util메서드

package util;

import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

import xml.vo.ProductVo;

public class MySearchUtil {

	// 객체 생성없이 사용가능한 스태틱 메서드 활용
	// dao에서 싱글톤을 사용하는 것과 동일한 이치
	public static List<ProductVo> search_shop(String p_name,int start,int display)
	{
		List<ProductVo> list = new ArrayList<ProductVo>();
		String clientId = "BljnawOS5mfzkwMuYC3P";
		String clientSecret = "VdkVKvKKDf";

		try {
			p_name = URLEncoder.encode(p_name, "utf-8");
			String urlStr = String.format("https://openapi.naver.com/v1/search/shop.xml?query=%s&start=%d&display=%d",
					         p_name,start,display
					);

			URL url = new URL(urlStr);
			HttpURLConnection connection = (HttpURLConnection)url.openConnection();
			//발급받은 ID
			connection.setRequestProperty("X-Naver-Client-Id", clientId); 
			//발급받은 PW
			connection.setRequestProperty("X-Naver-Client-Secret", clientSecret); 
			// 받을요청타입
			connection.setRequestProperty("Content-Type", "application/xml"); 
			connection.connect();

			SAXBuilder builder = new SAXBuilder();
			
			Document   doc = builder.build (connection.getInputStream());

			Element  root     = doc.getRootElement();
			List<Element>   item_list = root.getChild("channel").getChildren("item");

			for(Element item : item_list){
				String title = item.getChildText("title");
				String link  = item.getChildText("link");
				String image = item.getChildText("image");
				int lprice=0,hprice=0;
				try {
					lprice = Integer.parseInt(item.getChildText("lprice"));
				} catch (Exception e) {
					// TODO: handle exception
				}
				
				try {
					hprice = Integer.parseInt(item.getChildText("hprice"));
				} catch (Exception e) {
					// TODO: handle exception
				}
				
				String mallName = item.getChildText("mallName");
				
				//상품목록을 포장
				ProductVo vo = new ProductVo();
				vo.setTitle(title);
				vo.setLink(link);
				vo.setImage(image);
				vo.setLprice(lprice);
				vo.setHprice(hprice);
				vo.setMallName(mallName);
								
				//ArrayList에 넣기
				list.add(vo);
				
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
		
		return list;
	}
	
	
}

 

-> search_product.html ajax활용

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script> 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>

<style type="text/css">

	#box{
		width: 1000px;
		margin: auto;
		margin-top: 20px;
	}
	
</style>

<script type="text/javascript">
	function search(){
		
		let p_name = $("#p_name").val().trim();
		let p_page = $("#p_page").val();
		let display = $("#display").val();
		
		if(p_name==''){
			alert("상품명을 입력하세요");
			$("#p_nmae").val("");
			$("#p_name").focus();
			return;
		}
		
		// 가져올 시작 상품위치
		let start = (p_page-1) * display + 1;
		
		//Ajax이용해서 (상품)요청
		$.ajax({
			url		:	"product/list.do",	//ProductListAction
			data	:	{"p_name":p_name, "start":start, "display":display},
			success	:	function(res_data){
				$("#disp").html(res_data);
			},
			error	:	function(err){
				alert(err.responseText);
			}
		});
	}
</script>
</head>
<body>

<div id="box">
<form class="form-inline">
	상품명: <input class="form-control" id="p_name">
		  <input class="btn btn-primary" type="button" value="검색" onclick="search();">
		  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
		  
	페이지: <select class="form-control" id="p_page">
		  	<option value="1">1</option>
		  	<option value="2">2</option>
		  	<option value="3">3</option>
		  	<option value="4">4</option>
		  	<option value="5">5</option>
		  </select>
		  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
	페이지당 조회수: 
		  <select class="form-control" id="display">
		  	<option value="10">10개씩 보기</option>
		  	<option value="20">20개씩 보기</option>
		  	<option value="30">30개씩 보기</option>
		  	<option value="50">50개씩 보기</option>
		  	<option value="100">100개씩 보기</option>
		  </select>
	<hr>
	<div id="disp"></div>
</form>	

</div>
	  

</body>
</html>

 

-> 상품 리스트 조회 서블릿

package action;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import util.MySearchUtil;
import xml.vo.ProductVo;

import java.io.IOException;
import java.util.List;

/**
 * Servlet implementation class ProductListAction
 */
@WebServlet("/product/list.do")
public class ProductListAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// /product/list.do?p_name=노트북&start=1&display=10
		
		request.setCharacterEncoding("utf-8");
		String p_name = request.getParameter("p_name");
		
		int	start   = 1;
		int display = 10;
		
		try {
			start   = Integer.parseInt(request.getParameter("start"));
			display = Integer.parseInt(request.getParameter("display"));
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			// e.printStackTrace();
		}
		
		// Naver Open API를 이용해서 상품검색...
		List<ProductVo> p_list = MySearchUtil.search_shop(p_name, start, display);
		
		// request binding
		request.setAttribute("p_list", p_list);

		// Dispatcher형식으로 호출
		String forward_page = "product_list.jsp";
		RequestDispatcher disp = request.getRequestDispatcher(forward_page);
		disp.forward(request, response);

	}

}

 

-> 조회 jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>    

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script> 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>

<style type="text/css">
	img{
		width: 120px;
		height: 100px;
	}
	
	td{
		vertical-align: middle !important;
	}
</style>

</head>
<body>
	<table class="table">
		<tr class="success">
			<th>순번</th>
			<th>이미지</th>
			<th>상품명</th>
			<th>최저가</th>
			<th>최고가</th>
			<th>판매처</th>
		</tr>
		<!-- for(ProductVo vo : p_list -->
		<c:forEach var="vo" items="${ p_list }" varStatus="i"> <!-- ProductListAction -->
			<tr>
				<td>${ i.count }</td>
				<td><img src="${ vo.image }"></td>
				<td><a href="${ vo.link }">${ vo.title }</a></td>
				<td><fmt:formatNumber type="currency" value="${ vo.lprice }"/></td>
				<td><fmt:formatNumber type="currency" value="${ vo.hprice }"/></td>
				<td>${ vo.mallName }</td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>

 

 

)검색 번호 조정

둘다 임시변수이기 때문에 변수 선언없이 바로 start++해도 됨

'xml' 카테고리의 다른 글

xml - 예제(지역)  (0) 2024.07.09
xml - 네이버API활용 예제(책)  (0) 2024.07.08
네이버 API 어플리케이션 등록/postman download  (0) 2024.07.08
xml - 파싱  (0) 2024.07.08
xmlTest/jdom 설치 환경  (0) 2024.07.08