상세 컨텐츠

본문 제목

JSP best practices: 웹 사이트에 콘텐트 반입하기 - 외부 사이트에서 콘텐트를 가져오는 JSTL 태그

프로그래밍/JAVA

by 라제폰 2009. 1. 30. 17:45

본문

외부 사이트에서 콘텐트를 가져오는 JSTL 태그

난이도 : 초급

Brett McLaughlin
Author, O'Reilly and Associates
2003년 6월 17일
2003년 8월 18일 수정

표면상으로는, JSTL의 c:import 태그는 JSP의 include 메커니즘을 모방한 것처럼 보인다. 하지만 c:import (또는 모든 JSTL 태그)를 좀더 자세히 들여다보면 추가적인 기능들이 보일 것이다.

jsp:include와 마찬가지로 c:import는 매개변수들을 사용하여 주변 웹 사이트에서 콘텐트를 지능적으로 옮긴다. 하지만 include 지시문과는 달리, c:import는 로컬 파일로의 접근에 대한 제한이 없다.

뭔가 빠진 것 같습니까?

JSP best practices 시리즈를 처음부터 읽지 않았다면 이 글의 내용을 따라가기 쉽지 않을 것이다. 대부분의 best practices 기술자료는 연결되어 있으며 대부분의 예제들도 처음부터 지금까지 계속 진화해왔다. JSP best practices 시리즈 리스트에 시간을 내어 참조하기 바란다.

JSTL 변환
JSTL로 JSP 페이지 업데이트" 말미에 jsp:include가 아닌 c:import를 사용하기 위하여 웹 사이트 메인페이지를 변환했다. 요청 데이터를 전달하는 매개변수를 포함하고 있었기 때문에 헤더 파일 inclusion 코드 변경은 피했어야 했다. (Listing 1):

Listing 1. 거의 다 변환된 인덱스 페이지 (jsp:include 엘리먼트 주목)

			
<%@ page language="java" contentType="text/html" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<html>
<head>
     <title>newInstance.com</title>
     <meta http-equiv="Content-Type" 
       content="text/html; charset=iso-8859-1" />
     <link href="/styles/default.css" rel="stylesheet" type="text/css" />
</head>

<body>

<jsp:include page="header.jsp" flush="true">
     <jsp:param name="pageTitle" value="newInstance.com"/>
     <jsp:param name="pageSlogan" value=" " />
</jsp:include>
<%@ include file="/navigation.jsp" %>
<c:import url="bookshelf.jsp" />

<c:import url="/mt-blogs/index.jsp" />

<%@ include file="/footer.jsp" %>
</body>
</html>

매개변수 태그 변환하기
jsp:include가 아닌 c:import를 사용하기 위해 전체 인덱스를 변환할 때 우리가 해야 할 마지막 일은 남아있는 매개변수를 전달하는 jsp:include 엘리먼트를 가져와서 이것의 작동을 c:import 태그로 에뮬레이팅 하는 것이다. Listing 2 처럼, 우리가 해야 할 일은 jsp:paramc:param을 바꾸는 것이다. 왜냐하면 c:param은 JSP의 그것과 같은 기능을 하기 때문이다.

Listing 2는 JSTL에서 완전히 변환된 Listing 1의 인덱스 파일이다:

Listing 2. JSTL의 완전한 변환

			
<%@ page language="java" contentType="text/html" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<html>
<head>
     <title>newInstance.com</title>
     <meta http-equiv="Content-Type" 
       content="text/html; charset=iso-8859-1" />
     <link href="/styles/default.css" rel="stylesheet" type="text/css" />
</head>

<body>

<c:import url="header.jsp">
     <c:param name="pageTitle" value="newInstance.com"/>
     <c:param name="pageSlogan" value=" " />
</c:import>
<%@ include file="/navigation.jsp" %>
<c:import url="bookshelf.jsp" />

<c:import url="/mt-blogs/index.jsp" />

<%@ include file="/footer.jsp" %>
</body>
</html> 

JSP 페이지에서 매개변수를 전달하는 것에 대해 좀더 알고 싶다면 "Combine JavaBeans components and JSP technology"를 참조하기 바란다. c:paramjsp:param은 거의 동일하게 작동한다는 것을 기억하면 된다. 이제 c:import의 창조적인 활용법을 알아보자.

외부 콘텐트 가져오기
c:import를 사용할 때의 이점 중 하나는 외부 웹 사이트나 웹 애플리케이션에서 콘텐트를 가져올 수 있다는 것이다. jsp:include에 대해 배울 때를 회상해보면 file 애트리뷰트를 사용하여 포함시킬 정적 콘텐트를 지정했다는 것을 알 수 있을 것이다. file 애트리뷰트는 이름이 포함하고 있는 것을 수행한다: 로컬 파일의 콘텐트를 가져올 수 있다. c:import에 대한 상응 애트리뷰트는 url이고 이것 역시 이름이 내포하는 대로 수행한다: 모든 URL을 가져올 수 있다. 로컬 파일에서 콘텐트와 함께 사이트 페이지를 파퓰레이팅 하는 대신, c:import는 모든 URL에서 콘텐트를 가져올 수 있다.

간단한 예제를 들어보겠다. 마다가스카르 로즈우드 기타 그림을 내 웹 사이트로 가져오고 싶다고 하자. 이미지 파일과 관련 링크로 이루어진 페이지를 구현할 수 있지만 다른 사이트에서 콘텐트를 가져오는 방법이 더 쉽다. 그런다음 자신의 사이트 룩앤필에 맞추는 것이다. (Listing 3) :

Listing 3. 외부 콘텐트 가져오기

<%@ page language="java" contentType="text/html" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<html>
<head>
     <title>newInstance.com</title>
     <meta http-equiv="Content-Type" 
       content="text/html; charset=iso-8859-1" />
     <link href="/styles/default.css" rel="stylesheet" type="text/css" />
</head>

<body>

<c:import url="header.jsp">
     <c:param name="pageTitle" 
       value="newInstance.com :: True North Guitars"/>
     <c:param name="pageSlogan" value="...building it from scratch" />
</c:import>
<%@ include file="/navigation.jsp" %>
<c:import url="bookshelf.jsp" />

<c:import 
  url="http://www.truenorthguitars.com/Clients/Richman/index.htm" />

<%@ include file="/footer.jsp" %>
</body>
</html>

이 코드는 훌륭해 보이지만 곧바로 문제가 발견된다. 어떤 이미지도 나타나지 않으며 관련 링크도 실패한다. 물론 원인도 분명하다. 외부 리소스가 인터프리팅되기 때문에 인터프리팅이 아웃풋 스트림에 직접 삽입되었다는 결과를 얻는다. /images/guitar-01-24.jpg 같은 외부 이미지 링크는 없어진 것으로 나온다. 이 문제를 해결 할 유일한 방법은 이미지를 사이트에 복사하는 것이다. 이것은 간단한 임포트와는 전적으로 다르다.

따라서 외부 콘텐트를 가져오는 것은 콘텐트가 순수하게 텍스트 기반이여야만 이치에 맞는다. 예를들어 관리자를 위한 사이트가 있다고 해보자. 헤더, 풋터, 룩앤필을 갖추었을 것이다. 사이트의 한 페이지는 초기 README 파일을 설정하는 방법이 설명되어 있어 사용자들에게 이 사이트가 어떻게 사용되어야 하는지를 알려준다. 다음과 같이 FTP 사이트의 인스트럭션을 인용할 수 있다:

Listing 1. Seven methods to create a connection

<c:import url="ftp://ftp.oreilly.com/pub/README.ftp" />

FTP 서버 콘텐트를 임포팅하는 것은 HTTP 콘텐트를 가져오는 것 처럼 쉽다. HTTPS에 대해 같은 명령어를 사용할 수 있고 본인 사이트와 목표 사이트가 이해하고 말할 수 있는 프로토콜을 사용할 수 있다.

JSTL
A JSTL primer 시리즈:

Part 1, "The expression language" (2003년 2월)
Part 2, "Getting down to the core" (2003년 3월)
Part 3, "Presentation is everything" (2003년 4월)
Part 4, "Accessing SQL and XML content" (2003년 5월)

JSTL을 사용하는 이유
JSP 태그 보다 JSTL을 사용하면 여러가지 큰 이득을 볼 수 있다. 우선 JSTL은 JSP 태그와는 분리된 스팩으로 정의되었다. 이는 JSP 스팩이 변하더라도 JSTL 태그가 일관될 수 있다는 것을 보장하는 것이다. JSP 컨테이너 변경에 영향을 받을 수 없는 애플리케이션은 JSTL 스팩에서 효과를 볼 수 있다. 둘째, JSTL 태그는 핵심 JSP 태그의 기능보다 훨씬 나은 기능을 제공한다. c:import는 다른 사이트에서 URL을 임포팅 할 수 있을 뿐만아니라 jsp:include 태그에서는 가능하지 않은 복잡한 콘텐트도 임포트 할 수 있다. 마지막으로 JSTL은 고유의 expression language(EL)을 제공한다. JSTL EL은 JSP 코드를 작성하는 데 있어 놀라운 유연성을 제공한다.

참고자료


관련글 더보기