RSS 서비스를 제공하는 웹프로그램을 AJAX 기능으로 요청하여 처리결과를 응답받아 클라이언트에게 전달하는 JSP 문서
RSS(Really Simple Syndication 또는 RDF Site Summary) : 실시간으로 변경되는 정보를 빠르게 제공하기 위한 웹프로그램

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>AJAX</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>
<h1>RSS Reader</h1>
<hr>
<div id="display"></div>
<script type="text/javascript">
$.ajax({
type: "get",
//문제점)현재 실행중인 웹프로그램과 동일 서버에 작성된 웹프로그램을 AJAX 기능을 사용하여
//요청과 응답 처리 가능하지만 다른 서버에 작성된 웹프로그램을 AJAX 기능을 사용하여
//요청할 경우 에러(에러코드 : 0) 발생
//url: "https://www.khan.co.kr/rss/rssdata/kh_entertainment.xml",
//해결법)다른 서버에 작성된 웹프로그램은 프록시 프로그램을 사용하여 AJAX 기능으로
//요청하여 실행결과를 응답받아 처리 가능
url: "rss_proxy.jsp",
dateType: "xml",
success: function(xmlDoc) {
var channelTitle=$(xmlDoc).find("channel").children("title").text();
var html="<h2>"+channelTitle+"</h2>";
html+="<ul>";
$(xmlDoc).find("item").each(function() {
var title=$(this).find("title").text();
var link=$(this).find("link").text();
var date;
if($(this).find("pubDate").length!=0) {
date=$(this).find("pubDate").text();
} else {
date=$(this).find("dc\\:date").text();
}
html+="<li><a href='"+link+"'>"+title+"["+date+"]</a></li>";
});
html+="</ul>";
$("#display").html(html);
},
error: function(xhr) {
alert("에러코드 = "+xhr.status);
}
});
</script>
</body>
</html>
가상의 클라이언트(브라우저)를 이용하여 다른 서버에 작성된 웹프로그램을 요청하고 실행결과를 응답받아 그대로 클라이언트에게 전달하는 JSP 문서
HttpClient 객체 사용하여 프록시(Proxy) 기능을 제공하는 웹프로그램 작성
<%@page import="org.apache.commons.httpclient.methods.GetMethod"%>
<%@page import="org.apache.commons.httpclient.HttpClient"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//요청 웹프로그램의 URL 주소 저장
String url="https://www.khan.co.kr/rss/rssdata/kh_entertainment.xml";
//HttpClient 객체 생성 - 가상의 브라우저 기능을 제공하기 위한 객체
HttpClient client=new HttpClient();
//GetMethod 객체 생성 - 가상의 브라우저를 이용하여 GET 방식으로 웹프로그램을 요청하기 위한 객체
// => PostMethod 객체 : 가상의 브라우저를 이용하여 POST 방식으로 웹프로그램을 요청하기 위한 객체
GetMethod method=new GetMethod(url);
try {
//HttpClient.executeMethod(Method method) : 가상의 브라우저를 이용하여 웹프로그램을 요청하는 메소드
// => 요청에 대한 실행결과의 상태코드(Status Code - 응답상태 : int) 반환
int statusCode=client.executeMethod(method);
//프록시 프로그램의 리스폰즈 메세지를 저장하기 위한 객체 초기화
response.reset();
//프록시 프로그램의 출력스트림 초기화
out.clearBuffer();
//프록시 프로그램을 요청한 웹프로그램(클라이언트)에게 반환받은 상태코드를 전달
response.setStatus(statusCode);
if(statusCode==HttpServletResponse.SC_OK) {//정상적인 실행결과를 응답받은 경우 - 상태코드 : 200
//Method.getResponseBodyAsString() : 요청에 실행결과를 문자열로 반환하는 메소드
// => 실행결과를 반환받아 원하는 문자형태(캐릭터셋)으로 변환하여 저장
String result=new String(method.getResponseBodyAsString().getBytes("8859_1"),"utf-8");
//프록시 프로그램을 요청한 웹프로그램(클라이언트)에게 실행결과에 대한 문서형태를 전달
response.setContentType("text/xml; charset=utf-8");
//프록시 프로그램을 요청한 웹프로그램(클라이언트)에게 실행결과를 전달
out.println(result);
}
} finally {
//가상의 브라우저를 이용하여 접속된 서버의 연결 해제
//Method.releaseConnection() : 접속 서버의 연결을 해제하는 메소드
if(method!=null) method.releaseConnection();
}
%>
프록시 기능을 제공하는 웹프로그램 (HttpClient) 객체 사용
https://apache.org 사이트에서 라이브러리 파일을 다운로드 받아 프로젝트에 빌드 처리
apache 사이트 상단 Downloads → Distribution

다운받을 폴더 click → binary 폴더 click → zip 폴더 다운로드 → 압축 푼 후 jar 파일을 eclipse lib 폴더에 빌드 처리(붙여넣기)
