본문 바로가기

Server Oriented/Java & JSP

URLConnection 으로 외부 서비스 내용을 가져와서 ajax 나 include 에 사용

ajax 와 jsonp 를 사용하면, 다른 머신에서 서비스 되는 데이타를 가져올 수 있다고 하긴 하는데..

오늘 설명하고자 하는 것은, URLConnection 과 ajax 를 사용하여 다른 머신에서 서비스 되는 웹페이지를 가져오는 방법.


ajax 로는 사실 다른 머신에서 서비스 되는 웹페이지 내용을 가져올 수 없잖아요..

jsonp 로 데이타는 가져올 수 있어도 해당 웹페이지 자체를 가져올 수는 없으니까..

물론, 웹페이지 뿐만 아니라 json 이나 xml 등의 데이타도 가져올 수 있습니다.


외부 머신의 URL 스트림을 받아서 일단 내부 머신의 .jsp 에 담았으면,

이를 jsp:include 해도 되고.. ajax 에 상요해도 되고..


<%--

  * 프로그램 명칭 : 

  * 프로그램 설명 : 

  * 작업일/작업자 :

--%><%@ page language="java" contentType="text/html; charset=EUC-KR"

%><%@ page import="java.util.*"

%><%@ page import="java.io.*"

%><%@ page import="java.net.URL"

%><%@ page import="java.net.URLConnection"

%><%@ page import="java.net.UnknownHostException"

%><%


  URLConnection con = null;

  InputStreamReader isr = null;

  BufferedReader br = null; // File I/O 가 아니라서 필요없을 수도 있긴 한데..

  StringBuffer sb = null;

  

  ServletOutputStream sos = null;

  BufferedOutputStream bos = null; // 꼭 필요한 것을 아닐텐데..


  try{

    

    URL u = new URL("http://URL");

    con = u.openConnection(); // DB 에서 Connection 을 생성하는 것처럼..

    con.connect();

  

    isr = new InputStreamReader(con.getInputStream(),"EUC-KR"); // 문자셋은 상황에 맞게..

    br = new BufferedReader(isr);

    

    sb = new StringBuffer();

    String line  = null;

    while((line = br.readLine()) != null){

      sb.append(line+"\n");

    }


    // trim() 함수는 IE 의 경우 8.0 에서 지원되지 않음. http://blog.naver.com/chsmanager/140208464748

    String cont  = sb.toString().trim(); // The processing instruction target matching "[xX][mM][lL]" is not allowed 오류 제거 위해 trim()

    

    sos = response.getOutputStream();

    bos = new BufferedOutputStream(sos);

    byte[] bs = cont.getBytes(); 

    bos.write(bs, 0, bs.length);

    bos.flush(); // flush() 는 반드시 해야 해요.. 아니면, Buffer 에 남은 짜투리가 제대로 전달되지 않을수도.


    

  }catch(UnknownHostException uhe){

    StringBuffer  sbLog = new StringBuffer(); // FileAccess 를 줄이기 위해서 한번에 Write 하는 방식

    sbLog.append("\n+++."+request.getRequestURL()+  "..\n");

    sbLog.append("+++.Exception:" +uhe.toString()+    "..\n");

    System.out.println(sbLog);                // println 이기 때문에 맨 뒤에는 sbLog.append("\n"); 불필요.

    sbLog.delete(0,sbLog.length());

  }catch(Exception e){

    StringBuffer  sbLog = new StringBuffer(); // FileAccess 를 줄이기 위해서 한번에 Write 하는 방식

    sbLog.append("\n+++."+request.getRequestURL()+  "..\n");

    sbLog.append("+++.Exception:" +e.toString()+    "..\n");

    System.out.println(sbLog);                // println 이기 때문에 맨 뒤에는 sbLog.append("\n"); 불필요.

    sbLog.delete(0,sbLog.length());

  }finally{

    if(sb !=null) try{ sb.delete(0, sb.length()); }catch(Exception e){}finally{ sb =null; }

    if(br !=null) try{ br.close(); }catch(Exception e){}finally{ br =null; }

    if(isr !=null) try{ isr.close(); }catch(Exception e){}finally{ isr =null; }

  

    if(sos !=null) try{ sos.close(); }catch(Exception e){}finally{ sos =null; }

    if(bos !=null) try{ bos.close(); }catch(Exception e){}finally{ bos =null; }

  }

%>