http://www.juso.go.kr/ 접속 후 우측 상단 개발자 센터를 클릭합니다.
주요 서비스 API 신청하기 후 키 발급 받기
가이드 및 소스 다운받기
sch_zipcode.jsp
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<!-- 우편번호검색 -->
<!-- <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js"></script>
<script type="text/javascript" src="/common/script/util.js"></script> -->
<script type="text/javaScript" defer="defer">
//페이지 이동
function goPage(pageNum){
document.zipform.currentPage.value=pageNum;
getAddr();
}
// 페이지 처리 (주소정보 리스트 makeList(xmlData); 다음에서 호출)
function pageMake(jsonStr){
var total = jsonStr.results.common.totalCount;
//var total = $(jsonStr.results.juso).find("totalCount").text(); // 총건수
var pageNum = document.zipform.currentPage.value;// 현재페이지
var paggingStr = "";
var totStr = "";
if(total < 1){
$("#pageApi").html("검색결과가 없습니다.");
}else{
var PAGEBLOCK=document.zipform.countPerPage.value;;//'${currentPage }';//
var pageSize=document.zipform.countPerPage.value;;
var totalPages = Math.floor((total-1)/pageSize) + 1;
var firstPage = Math.floor((pageNum-1)/PAGEBLOCK) * PAGEBLOCK + 1;
if( firstPage <= 0 ) firstPage = 1;
var lastPage = parseInt(firstPage)-1 + parseInt(PAGEBLOCK);
if( parseInt(lastPage) > parseInt(totalPages) ) lastPage = parseInt(totalPages);
var nextPage = parseInt(lastPage)+1 ;
var prePage = parseInt(firstPage)-5 ;
totStr +="검색결과 : "+total + " 건";
if( firstPage > PAGEBLOCK ){
paggingStr += "<a style='cursor:pointer' onclick='javascript:goPage("+prePage+");'>◁</a>" ;
}
for( i=firstPage; i<=lastPage; i++ ){
if( pageNum == i )
paggingStr += "<a style='font-weight:bold;color:blue;cursor:pointer;' onclick='javascript:goPage("+i+");'>" + i + "</a>";
else
paggingStr += "<a style='cursor:pointer' onclick='javascript:goPage("+i+");'>" + i + "</a>";
}
if( lastPage < totalPages ){
paggingStr += "<a style='cursor:pointer' onclick='javascript:goPage("+nextPage+");'>▷</a>";
}
$("#pageApi").html(paggingStr);
$("#tot").html(totStr);
}
}
function getAddrLoc(){
$.ajax({
url :"/zipcode_list.do"
,type:"post"
,data:$("#zipform").serialize()
,dataType:"xml"
,success:function(xmlStr){
$("#list").html("");
var errCode = $(xmlStr).find("errorCode").text();
var errDesc = $(xmlStr).find("errorMessage").text();
if(errCode != "0"){
var htmlStr = "";
htmlStr += "<tr>";
htmlStr += "<td colspan='2'>"+errDesc+"</td>";
htmlStr += "</tr>";
$("#list").html(htmlStr);
}else{
if(xmlStr != null){
makeList(xmlStr);
pageMake(xmlStr);
}
}
}
,error: function(xhr,status, error){
alert("다시시도하세요.");
}
});
}
function makeList(xmlStr){
var htmlStr = "";
$(xmlStr).find("juso").each(function(){
htmlStr += "<tr>";
htmlStr += "<td style='width:90%'><a id='roadAddr' href='javascript:setAddr()'>"+$(this).find('roadAddr').text()+"</a></td>";
htmlStr += "<td rowspan='2' style='width:10%'><a id='zipNo' href='javascript:setAddr()'>"+$(this).find('zipNo').text()+"</a></td></tr>";
htmlStr += "<tr><td class='wp_90'><a id='jibunAddr' href='javascript:setAddr()'>"+$(this).find('jibunAddr').text()+"</a></td>";
htmlStr += "</tr>";
});
$("#list").html(htmlStr);
}
//엔터키 적용
function enterSearch() {
var evt_code = (window.netscape) ? ev.which : event.keyCode;
if (evt_code == 13) {
event.keyCode = 0;
getAddr();
}
}
//특수문자, 특정문자열(sql예약어의 앞뒤공백포함) 제거
function checkSearchedWord(obj){
if(obj.value.length >0){
//특수문자 제거
var expText = /[%=><]/ ;
if(expText.test(obj.value) == true){
alert("특수문자를 입력 할수 없습니다.") ;
obj.value = obj.value.split(expText).join("");
return false;
}
//특정문자열(sql예약어의 앞뒤공백포함) 제거
var sqlArray = new Array(
"OR", "SELECT", "INSERT", "DELETE", "UPDATE", "CREATE", "DROP", "EXEC",
"UNION", "FETCH", "DECLARE", "TRUNCATE"
);
var regex ;
var regex_plus ;
for(var i=0; i<sqlArray.length; i++){
regex = new RegExp("\\s" + sqlArray[i] + "\\s","gi") ;
if (regex.test(obj.value)) {
alert("\"" + sqlArray[i]+"\"와(과) 같은 특정문자로 검색할 수 없습니다.");
obj.value =obj.value.replace(regex, "");
return false;
}
regex_plus = new RegExp( "\\+" + sqlArray[i] + "\\+","gi") ;
if (regex_plus.test(obj.value)) {
alert("\"" + sqlArray[i]+"\"와(과) 같은 특정문자로 검색할 수 없습니다.");
obj.value =obj.value.replace(regex_plus, "");
return false;
}
}
}
return true ;
}
// 적용예 (api 호출 전에 검색어 체크)
function searchJuso(){
if (!checkSearchedWord(document.zipform.keyword)) {
return ;
}
}
// 불러온 도로주소 값 셋팅
function setAddr(){
var road = document.getElementById("roadAddr").innerHTML;
var zipno = document.getElementById("zipNo").innerHTML;
var jibun = document.getElementById("jibunAddr").innerHTML;
var f_name = $("#form_name").val();
var in_addr = $("#set_addr").val();
var in_detail = $("#set_detail").val();
var in_zip = $("#set_zipno").val();
if($("#"+f_name+" #"+in_addr).length>0){
$("#"+f_name+" #"+in_addr).val(road);
}else{
$(".zipcode").each(function(){
if($(this).attr("data-focus") == 'Y'){
$(this).parent().find("input[name=\'"+in_addr+"\']").val(road) ;
}
})
}
if($("#"+f_name+" #"+in_zip).length>0){
$("#"+f_name+" #"+in_zip).val(zipno);
}else{
$(".zipcode").each(function(){
if($(this).attr("data-focus") == 'Y'){
$(this).parent().find("input[name=\'"+in_zip+"\']").val(zipno) ;
}
})
}
jboxClose(); $(".zipcode").prevAll().find("#"+in_addr).focus();
}
//결과 가져오기
function getAddr(){
// AJAX 주소 검색 요청
$.ajax({
url:"https://www.juso.go.kr/addrlink/addrLinkApiJsonp.do" // 주소검색 OPEN API URL
,type:"post"
,data:$("#zipform").serialize() // 요청 변수 설정
,dataType:"jsonp" // 크로스도메인으로 인한 jsonp 이용, 검색결과형식 JSON
,crossDomain:true
,success:function(jsonStr){ // jsonStr : 주소 검색 결과 JSON 데이터
$("#list").html(""); // 결과 출력 영역 초기화
var errCode = jsonStr.results.common.errorCode;
var errDesc = jsonStr.results.common.errorMessage;
if(errCode != "0"){
alert(errCode+"="+errDesc);
}else{
if(jsonStr!= null){
makeListJson(jsonStr); // 결과 JSON 데이터 파싱 및 출력
pageMake(jsonStr); //페이징 셋팅
}
}
}
,error: function(xhr,status, error){
alert("에러발생");
alert("status :: " + status);
alert("error :: " + error)
// AJAX 호출 에러
}
});
}
function makeListJson(jsonStr){
var htmlStr = "";
// jquery를 이용한 JSON 결과 데이터 파싱
$(jsonStr.results.juso).each(function(){
htmlStr += "<tr>";
htmlStr += "<td style='width:90%'><a id='roadAddr' href='javascript:setAddr()'>"+this.roadAddr+"</a></td>";
htmlStr += "<td rowspan='2' style='width:10%'><a id='zipNo' href='javascript:setAddr()'>"+this.zipNo+"</a></td></tr>";
htmlStr += "<tr><td class='wp_90'><a id='jibunAddr' href='javascript:setAddr()'>"+this.jibunAddr+"</a></td>";
htmlStr += "</tr>";
});
// 결과 HTML을 FORM의 결과 출력 DIV에 삽입
$("#list").html(htmlStr);
}
</script>
<style>
/*페이지에 대한 이미지를 적용하다*/
#pageApi{margin:0 auto; text-align:center; padding:5px;}
#pageApi a{margin:3px; padding: 5px 10px; font-size:20px;}
#pageApi ul{width:100%; height:30px; margin:0 auto;}
#pageApi ul li{float:left; list-style:none; padding:5px; cursor:pointer;}
</style>
<form name="zipform" id="zipform" method="post">
<input type="hidden" name="form_name" id="form_name" value="${form_name }"/>
<input type="hidden" name="set_addr" id="set_addr" value="${set_addr }"/>
<input type="hidden" name="set_detail" id="set_detail" value="${set_detail }"/>
<input type="hidden" name="set_zipno" id="set_zipno" value="${set_zipno }"/>
<input type="hidden" name="resultType" value="json"/> <!-- 요청 변수 설정 (검색결과형식 설정, json) -->
<input type="hidden" name="currentPage" id="currentPage" value="${currentPage }"/> <!-- 요청 변수 설정 (현재 페이지) -->
<input type="hidden" name="countPerPage" value="5"/><!-- 요청 변수 설정 (페이지당 출력 개수) -->
<input type="hidden" name="confmKey" id="confmKey" value="NTE4ODc1"/><!-- 요청 변수 설정 (승인키) -->
<div class="search">
<div class="search_key">
<ul>
<li style="width:100%">
<input type="text" name="keyword" value="" onkeydown="enterSearch();" style="width:90%;height:30px;"/><!-- 요청 변수 설정 (키워드) --><br/>
<input type="text" value="" class="dis_non">
검색어 예 : 도로명(반포대로 58), 건물명(독립기념관), 지번(삼성동 25)
</li>
</ul>
</div>
<div class="web search_btn center" onClick="getAddr();"><i class="fa fa-search"></i> 검색</div>
<div class="mobile btn_i center" style="width:95%;" onClick="getAddr();"><i class="fa fa-search"></i> 검색</div>
</div>
<div>
<div><b id="tot"></b></div>
<table class="tbl tbl_left type_10">
<thead>
<tr>
<th class="wp_90">
주소
</th>
<th class="wp_10">
우편번호
</th>
</tr>
</thead>
<tbody style="width:100%" id="list"></tbody>
</table>
</div>
<!-- <div id="list"></div> -->
<div class="paginate" id="pageApi"></div>
</form>
Controller.java
/*///*
* 주소검색 controller
* @Class Name : MemberController.java
* @Description : MemberController Class
* @Modification Information
*
*/
package co.ciec.common.web;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ZipcodeController {
@RequestMapping(value = "/zipcode.do")
public String member(ModelMap model, HttpServletRequest request) throws Exception {
try{
model.addAttribute("form_name", request.getParameter("form_name"));
model.addAttribute("set_addr", request.getParameter("addr"));
model.addAttribute("set_detail", request.getParameter("detail"));
model.addAttribute("set_zipno", request.getParameter("zipno"));
model.addAttribute("currentPage","1");
}catch(Exception e){
e.printStackTrace();
}
return "ajax/sch/sch_zipcode";
}
@RequestMapping(value = "/zipcode_list.do")
public void addr( ModelMap model, HttpServletResponse response, HttpServletRequest req) throws Exception {
model.addAttribute("form_name", req.getParameter("form_name"));
model.addAttribute("set_addr", req.getParameter("set_addr"));
model.addAttribute("set_detail", req.getParameter("set_detail"));
model.addAttribute("set_zipno", req.getParameter("set_zipno"));
String cp = (req.getParameter("currentPage") != null || !"".equals(req.getParameter("currentPage"))) ? req.getParameter("currentPage") : "1";
model.addAttribute("currentPage", cp);
String currentPage = req.getParameter("currentPage");
String countPerPage = req.getParameter("countPerPage");
String confmKey = req.getParameter("confmKey");
String keyword = req.getParameter("keyword");
String apiUrl = "http://www.juso.go.kr/addrlink/addrLinkApi.do?currentPage="+currentPage+
"&countPerPage="+countPerPage+
"&keyword="+URLEncoder.encode(keyword,"UTF-8")+"&confmKey="+confmKey;
URL url = new URL(apiUrl);
BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));
StringBuffer sb = new StringBuffer();
String tempStr = null;
while(true){
tempStr = br.readLine();
if(tempStr == null) break;
sb.append(tempStr);
}
br.close();
response.setCharacterEncoding("UTF-8");
response.setContentType("text/xml");
response.getWriter().write(sb.toString());
}
}
'언어 > Spring' 카테고리의 다른 글
| 스프링 버전 차이 (0) | 2019.12.24 |
|---|---|
| 스프링의 특징 (0) | 2019.12.11 |
| 전자정부 프레임워크 기반의 페이지 네비게이션(Pagination) 사용 (0) | 2019.09.25 |