웹 사이트를 구성하는 페이지들은 상단, 좌측 메뉴 그리고 하단 푸터를 갖는 경우가 많은데
<jsp:include> 액션 태그와 include 디렉티브를 사용하면 이런 공통 화면을 모듈화하여 코드가 중복되는 것을 방지할 수 있다.
또한, <jsp:forward> 액션 태그를 이용하면 클라이언트의 요청을 다른 JSP 페이지에 전달할 수 있고 이를 통해 요청 처리 흐름을 제어할 수 있다.
이번 시간엔 <jsp:include> 액션 태그 및 include 디렉티브를 이용하여 페이지를 모듈화하는 방법과 <jsp:forward> 액션 태그를 이용하여 요청 흐름을 제어하는 방법을 알아보자.
<jsp:include> 액션 태그를 이용한 페이지 모듈화
지정한 페이지를 태그가 위치한 부분에 포함시킬 때 사용된다. 다음 그림을 통해 동작 방식을 알아보자.
<jsp:include> 액션 태그는 포함할 JSP 페이지의 실행 결과를 현재 위치에 포함시킨다.
<jsp:include> 액션 태그 사용법
: 기본 사용방법은 다음과 같다.
▶ <jsp:include page="포함할 페이지" flush="true/false">
* flush 속성값이 true 이면 출력 버퍼를 플러시하여 <jsp:include> 태그 이전의 내용이 웹 브라우저에 전달되고 태그에서 지정한 페이지의 내용이 출력버퍼에 채워지게 된다. 전달시 HTTP 헤더 정보도 함께 전달된다.
다음 예제를 통해 <jsp:include> 태그를 알아보자.
main.jsp 와 sub.jsp 페이지를 만들어준 뒤 실행하면 다음과 같은 결과가 출력된다.
<jsp:include> 중복 영역의 처리
: 공통되는 부분의 수정에 따른 문제를 최소화할 수 있다. 즉, 페이지의 공통되는 부분을 별도의 JSP 페이지로 작성한 후 태그를 사용하여 지정한 위치에 포함해주는 방법을 사용하여 중복 영역을 처리한다.
다음 예제를 통해 알아보자.
각 영역에 맞는 페이지를 만들어주고 <jsp:include> 태그를 사용하면 위와 같이 출력된다.
<jsp:param> 액션 태그를 이용하여 포함될 페이지에 파라미터 추가하기
: <jsp:param> 액션 태그는 <jsp:include> 액션 태그의 자식 태그로 추가된다. name과 value 속성이 있는데 포함할 페이지에 추가할 이름과 값을 입력한다. value 속성의 경우 표현식을 이용할 수 있다. 사용 형식은 다음과 같다.
<jsp:include page="포함할 페이지" flush="true/false">
<jsp:param name="name1" value="value1"/>
<jsp:param name="name2" value="value2"/>
.
.
.
<jsp:param name="namen" value="valuen"/>
</jsp:include>
다음 예제를 통해 확인해 보자.
type 파라미터의 값에 따라 다른 정보를 출력하는 것을 확인할 수 있다.
* <jsp:param> 액션 태그의 특징
이미 동일한 이름의 파라미터가 존재할 경우, 기존 파라미터 값을 유지하면서 새로운 파라미터 값을 추가한다.
예를 들어 URL로 파라미터 값을 넘길 경우 파라미터 값을 갖게 되는데 이후에 <jsp:param> 태그로 새로운 파라미터 값을 추가하면 새로 추가한 <jsp:param> 태그의 파라미터 값이 우선 적용된다. 아래 그림을 보자.
위의 그림의 body_sub.jsp에서 request.getParameter("name"); 은 <jsp:param> 태그를 통해서 추가된 파라미터의 값을 리턴한다.
여기서 request.getParameterValues("name") 을 실행하면 ["최범균", "cbk"]를 파라미터 값 목록으로 리턴한다.
※ 주의 : <jsp:param> 액션 태그를 통해서 추가되는 파라미터는 <jsp:include> 액션 태그를 통해서 포함되는 페이지에서만 유효하다.
위의 그림에서 <jsp:param> 실행 이후에 request.getParameterValues("name") 을 실행하면 ["cbk"]만 파라미터 값 목록으로 리턴한다.
<jsp:param> 액션 태그와 캐릭터 인코딩
: <jsp:param> 액션 태그는 request.setCharacterEncoding("캐릭터 셋") 메서드를 통해서 설정한 캐릭터 셋을 사용할 수 있다. 이 메서드는 포함될 페이지에 전달할 파라미터의 값을 인코딩한다.
즉, request.setCharacterEncoding() 메서드로 알맞은 캐릭터 셋을 지정해 주지 않으면 <jsp:param>으로 설정한 값이 올바르게 전달되지 않는다. (이전에 살펴본 form과 같은 경우이다)
include 디렉티브를 이용한 중복 코드 삽입
<jsp:include> 와 마찬가지로 페이지를 포함해주는 기능을 제공하지만 include 디렉티브는 포함 방식에서 차이를 보인다.
include 디렉티브는 다른 파일의 내용을 현재 위치에 삽입한 후에 JSP 파일을 자바 파일로 변환하고 컴파일하는 방식이다.
include 디렉티브의 처리 방식과 사용법
: 사용방법은 다음과 같다.
▶ <%@ include file="포함할파일" %>
file 속성은 포함할 파일의 경로를 나타낸다. include 디렉티브에서 지정한 파일은 파일의 내용을 해당 위치에 삽입하고, 삽입된 자바 파일을 컴파일 하게 된다. 다음 그림을 통해 include 디렉티브를 좀더 쉽게 이해해보자.
* include 디렉티브에 포함할 파일의 경우 일반 JSP와 구분하기 위해서 확장자로 .jspf 를 사용한다. jspf(JSP Fragment)는 소스코드조각을 의미한다.
include 디렉티브의 활용
: <jsp:include> 액션 태그는 레이아웃의 한 구성요소를 모듈화하기 위해 사용되는 반면에 include 디렉티브는 다음과 같이 두 가지 형태로 주로 사용된다.
▶ 모든 JSP 페이지에서 사용되는 변수 지정
▶ 저작권 표시와 같이 간단하게 모든 페이지에서 중복되는 문장
* 기본 객체로 부터 특정 값을 읽어와 변수에 저장 후 그 변수를 사용하는 JSP 페이지가 많을 경우, 변수를 지정하는 부분을 별도의 파일에 작성한 후 그 파일을 include 디렉티브로 포함시키는 것이 더 좋은 방법이다.
다음과 같이 변수를 선언하는 파일을 만들어 준다.
ex) <commonVariable.jspf>
<%@ page contentType = "text/html; charset = euc-kr" %>
String memberID = (String)session.getAttribute("MEMBERID");
File tempFolder = (File)application.getAttribute("TEMPFOLDER");
만들어준 파일을 include 디렉티브로 포함해 준다.
<%@ include file="commonVariable.jspf" %>
코드 조각 자동 포함 기능
: include 디렉티브를 사용할 경우 같은 내용이 여러 페이지에 중복된다면 web.xml 파일에 다음과 같은 설정 정보를 추가해 주어 코드 중복을 방지할 수 있다.
<jsp-config>
<jsp-property-group>
<url-pattern>/view/*</url-pattern>
<include-prelude>/common/variable.jspf</include-prelude>
<include-coda>/common/footer.jspf</include-coda>
</jsp-property-group>
</jsp-config>
▶ jsp-property-group : JSP의 프로퍼티를 지정함을 나타낸다.
▶ url-pattern : 프로퍼티를 적용할 JSP 파일에 해당하는 URL을 지정.
▶ include-prelude : url-pattern 태그에 해당되는 JSP 파일의 앞에 자동으로 삽입될 파일을 지정.
▶ include-coda : url-pattern 태그에 해당되는 JSP 파일의 뒤에 자동으로 삽입될 파일을 지정.
* 한 개 이상의 <jsp-property-group> 태그를 이용하여 지정한 경우에는 입력한 순서대로 적용된다.
<jsp:include> 액션 태그와 include 디렉티브의 비교
|
<jsp:include> |
include 디렉티브 |
처리 시간 |
요청 시간에 처리 |
JSP 파일을 자바 소스로 변환할 때 처리 |
기능 |
별도의 파일로 요청 처리 흐름을 이동 |
현재 파일에 삽입 |
전달 방법 |
request 기본 객체나 <jsp:param>을 이용하여 파라미터 전달 |
페이지 내에 변수를 선언한 후 저장 |
용도 |
레이아웃의 일부를 모듈화할 때 사용 |
공통변수나 저작권과 같은 문장을 포함할 때 사용 |
<jsp:forward> 액션 태그를 이용한 JSP 페이지 이동
하나의 JSP 페이지에서 다른 JSP 페이지로 요청 처리를 전달할 때 사용된다. 다음 그림을 통해 요청의 흐름을 이해해보자.
위의 그림을 보고 이해하고 가야할 부분은 다음과 같다.
▶ from.jsp가 아닌 to.jsp가 생성한 응답 결과가 웹 브라우저에 전송된다.
▶ from.jsp에서 사용한 request, response 기본 객체가 to.jsp에 그대로 전달된다.
* <jsp:forward> 액션 태그를 사용하는 이유
보다 간결하고 구조적으로 프로그래밍할 수 있기 때문이다. 각각의 조건을 처리하는 JSP를 분리시켜 기능별로 모듈화할 수 있다.
<jsp:forward> 액션 태그의 사용법
: 기본 문법은 다음과 같다.
▶ <jsp:forward page="이동할 페이지"/>
이동할 페이지는 웹 어플리케이션 내에서의 경로를 나타내고, 값을 지정하거나 표현식의 결과를 값으로 지정할 수 있다.
예제를 통해 알아보자.
위와 같이 from.jsp 페이지와 to.jsp 페이지를 만들어준 뒤 실행하고 결과를 출력해보면 다음과 같은 두가지 내용을 알 수 있다.
▶ from.jsp 페이지에서 <jsp:forward> 액션 태그를 사용해서 이동한 to.jsp 페이지의 내용만 출력이된다.
(<jsp:forward> 태그 이전의 내용은 출력되지 않는다)
▶ 웹 브라우저의 주소는 from.jsp이며 이것은 최초로 요청받은 JSP 페이지의 주소이다. (to.jsp로 변경안됨)
<jsp:forward> 액션 태그와 출력 버퍼와의 관계
: <jsp:forward> 태그가 실행되면 다음 그림과 같이 출력 버퍼의 내용이 사라지고 이동한 페이지의 출력 결과가 출력 버퍼에 저장된다.
* <jsp:forward> 액션 태그가 잘 동작하기 위해서는 태그가 실행되기 전에 웹 브라우저에 데이터가 전송되면 안된다.
(이런 점에서 버퍼가 없을 경우 태그가 실행되지 않을 수도 있다) 또한 태그를 기준으로 앞뒤에 있는 내용도 실행되지 않는다.
<jsp:forward> 액션 태그의 전형적인 사용법
: 조건에 따라 페이지의 분기를 지정해 주는 것이 일반적인 사용법이다. 바로 예제를 통해 알아보자.
우선 다음과 같이 두개의 페이지를 만들어주자.
이후에 각각의 페이지를 만들어준 다음 실행을 하고 페이지를 선택해주면 다음과 같이 출력된다.
<jsp:param>을 이용하여 이동할 페이지에 파라미터 추가하기
: <jsp:forward> 태그를 사용하여 정보를 전달하고 싶은 경우 <jsp:param> 액션 태그를 사용할 수 있다. 사용 방법과 동작방식은 <jsp:include> 태그와 동일하다.
<jsp:include>와 <jsp:forward> 액션 태그의 page 속성의 경로
두개의 태그는 각각 page 속성을 이용하여 포함하거나 이동할 페이지의 경로를 지정한다. 경로지정에는 다음과 같이 두가지 방법이 있다.
▶ 웹 어플리케이션 디렉터리를 기준으로 한 절대경로
▶ 현재 JSP 페이지를 기준으로 한 상대경로
내가 사용하는 실습환경의 디렉터리 구조를 통해 비교해보자.
▶ JSPTest : 웹 어플리케이션의 루트디렉터리
▶ common / pages : 웹 어플리케이션 디렉터리의 하위 디렉터리
* 절대경로 : 웹 어플리케이션 디렉터리를 루트로 사용하는 경로
ex) /common/view.jsp
* 상대경로 : JSP 페이지를 기준으로 사용하는 경로 ('..'은 상위 디렉터리를 의미)
ex) ../pages/pageA.jsp
* 절대경로를 사용하는 것이 관련 파일을 쉽게 찾을 수 있기 때문에 많이 사용한다. 상대경로는 다음의 경우에 사용한다.
▶ 이동할 페이지가 같은 디렉터리에 위치한 경우
▶ 이동할 페이지가 현재 디렉터리의 상위/하위 에 위치한 경우
기본 객체의 속성을 이용하여 값 전달하기
<jsp:param> 태그는 파라미터를 이용하여 데이터를 추가하기 때문에 String 타입만 전달할 수 있다는 제약이 있다.
이러한 이유로 전달하는 데이터가 String 타입이 아니라면 기본 객체의 속성을 이용하는 것이 좋다.
그림을 통해 원리를 알아보자.
request 기본 객체가 한 번의 요청을 처리하는 데 사용되는 모든 JSP 에서 공유된다는 특징을 이용하여 값을 전달하고 받아온다.
request 기본 객체를 통해 객체를 전달하는 예제를 실습해보자.
Calendar 객체를 생성한 뒤 request 기본 객체를 통해 값을 전달한 것을 확인할 수 있다.
* 속성을 이용한 값 전달 방식은 MVC(Model-View-Controller) 패턴에 기반하여 웹 어플리케이션을 구현할 때의 필수 요소이기 때문에 반드시 이해하고 잘 알아둬야 한다.
이상으로 페이지 모듈화와 흐름제어 파트의 포스팅을 마친다.