본문 바로가기
Dev/Java

<jsp:include> 액션 태그

by vellahw 2022. 9. 1.

 

한 웹 사이트를 구성하는 페이지들은 동일한 상단 메뉴와 좌측 메뉴 그리고 하단 푸터(footer)를 갖는 경우가 많다.

<jsp:include> 액션 태그include 디렉티브를 사용하면 이런 공통 화면을 모듈화 해서 코드가 중복 되는 것을 방지할 수 있다.

 


 

1. <jsp:include>  액션 태그를 이용한 페이지 모듈화

<jsp:include> 액션 태그는 지정한 페이지를 태그가 위치한 부분에 포함 시킬 때 사용 된다.

 

동작 방식

사진을 기준으로 설명하면

  1. main.jsp가 웹 브라우저의 요청을 받는다.
  2. 출력내용 A를 출력 버퍼에 저장
  3. <jsp:include>가 실행되면 요청 흐름을 sub.jsp로 이동시킴
  4. 출력내용 B를 출력 버퍼에 저장
  5. sub.jsp의 실행이 끝나면 요청 흐름이 다시 main.jsp의 <jsp:include>로 돌아옴
  6. <jsp:include> 이후 부분인 출력내용 C를 출력 버퍼에 저장
  7. 출력 버퍼의 내용을 응답 데이터로 전송

즉 <jsp:include> 액션 태그는 포함할 JSP 페이지의 실행 결과를 현재 위치에 포함 시킨다고 할 수 있다.

 

1-1. 사용법

<jsp:include page="포함할페이지" flush="true" />
  • page: 포함할 JSP 페이지
  • flush: 지정할 JSP 페이지를 실행하기 전 출력 버퍼를 플러시 할지의 여부를 지정 (true면 출력 버퍼 플러시, false면 하지 않음)

 * flush 속성의 값이 true면 출력 버퍼를 플러시 한다는 것은 출력 버퍼의 내용이 웹 브라우저에 전달 된다는 것을 뜻한다.

 

1-2. <jsp:include> 액션 태그의 동작 확인

 1) <jsp:include> 액션 태그를 이용하는 main.jsp

<%@ page contentType="text/html; charset=EUC-KR" %>
<html>
<head><title>main</title></head>
<body>

main.jsp에서 실행한 내용

<jsp:include page="sub.jsp" flush="fasle" />

include 이후의 내용

</body>
</html>

 

 2) sub.jsp

<%@ page contentType="text/html; charset=EUC-KR" %>
<html>
<head><title>sub</title></head>
<body>
<p>
sub.jsp에서 생성한 내용
</p>
</body>
</html>

실행 화면

실행된 결과를 보면 main.jsp 파일 안에 생성된 'main.jsp에서 실행한 내용', 'include 이후의 내용' 사이에

sub.jsp 파일에서 생성된 'sub.jsp에서 생성한 내용'이 있는 걸 확인 할 수 있다.

 

<html>
<head><title>main</title></head>
<body>

main.jsp에서 실행한 내용


<html>
<head><title>sub</title></head>
<body>
<p>
sub.jsp에서 생성한 내용
</p>
</body>
</html>

include 이후의 내용

</body>
</html>

▲ main.jsp를 실행한 결과로 생성된 HTML 코드

main.jsp와 sub.jsp에서 생성한 결과가 처리 순서에 따라서 출력된 것을 확인할 수 있다.

 

 


 

 

2. <jsp:include>  액션 태그를 이용한 중복 영역의 처리

일반적인 웹 사이트를 보면 상단 메뉴, 좌측/우측 메뉴, 중앙 내용, 하단 메뉴 등의 요소로 구성되어 있는 것을 알 수 있다.

이들 구성 요소 중에는 상단 메뉴나 하단 메뉴 처럼 모든 페이지에서 고정적인 것들도 있고, 좌측 혹은 우측 메뉴처럼 페이지에 따라서 변경되는 부분이 있고, 중앙 내용처럼 페이지마다 서로 다른 화면이 출력되는 것도 있다.

수십 내지 수백 개의 JSP 페이지를 공통부분을 별도 모듈로 분리하지 않고 프로그래밍을 한다면 개발 및 유지 보수 과정에서 문제가 발생하게 된다.

예를 들어 50여 개의 JSP가 상단과 하단이 동일하고, 모든 JSP 페이지가 상단과 하단을 생성하는 코드를 포함 하고 있다고 생각해보면,

이 경우, 공통되는 부분이 변경되면 공통된 부분을 포함하고 있던 모든 JSP 페이지를 변경 해주어야 한다는 문제가 발생한다.

<jsp:include> 액션 태그를 사용하면 이 처럼 공통되는 부분의 수정에 따른 문제를 최소화 할 수 있다.

 

 

ex-1) 공통 부분을 별도의 JSP로 작성하고 해당 공통 부분을 필요로 하는 JSP 페이지에서는

      <jsp:include> 액션 태그를 사용하여 공통 부분을 포함시키기

 1) 페이지의 공통부분

<%@ page contentType="text/html; charset=EUC-KR" %>
<html>
<head><title>layout1</title></head>
<body>
<table width="400" border="1" cellpadding="0" cellspacing="0">
<tr>
	<td colspan="2">
		<jsp:include page="../module/top.jsp" flush="false" />
	</td>	
</tr>
<tr>
	<td width="10" valign="top">
	레이아웃 1
	<br><br><br>
	</td>
</tr>
<tr>
	<td colspan="2">
		<jsp:include page="../module/bottom.jsp" flush="false" />
	</td>
</tr>
</table>
</body>
</html>

(*경로의 점(.) : 상위 폴더 의미)

layout1은 상단, 좌측, 하단 부분의 코드를 직접 생성하지 않고 <jsp:include> 액션 태그를 사용하여 관련 부분을 생성함

실행 결과

 

<%@ page contentType = "text/html; charset=euc-kr" %>

상단 메뉴:
<a href="#">HOME</a>
<a href="#">INFO</a>

<!-- top.jsp 파일 --!>
<%@ page contentType = "text/html; charset=euc-kr" %>

하단메뉴: 소개 | 도움말 | 약관 | 사이트맵

<!-- bottom.jsp 파일 --!>

 

 

ex-2) layout1.jsp와 동일한 공통 부분을 사용하는 JSP 페이지 layout2.jsp

<%@ page contentType="text/html; charset=EUC-KR" %>
<html>
<head><title>layout2</title></head>
<body>
<table width="400" border="1" cellpadding="0" cellspacing="0">
<tr>
	<td colspan="2">
		<jsp:include page="../module/top.jsp" flush="false" />
	</td>
</tr>
<tr>
	<td width="100" valign="top" >
		<jsp:include page="../module/left.jsp" flush="false" />
	</td>
	<td width="300" valign="top">
		이 부분은 layout2.jsp가 생성한다.<br>
		레이아웃2
		<br><br><br>
	</td>
</tr>
<tr>
	<td colspan="2">
		<jsp:include page="../module/bottom.jsp" flush="false" />
	</td>
</tr>
</table>
</body>
</html>

실행 결과

공통 부분에 출력된 내용이 layout1과 동일한 것을 확인 할 수 있다.

 

<%@ page contentType = "text/html; charset=euc-kr" %>

좌측메뉴:

<!-- left.jsp 파일 -->

 

위와 같은 실행 결과들을 통해서 <jsp:include> 액션 태그를 화면의 구성 요소에 대한 모듈로서 사용할 수 있다는 것을 알 수 있다.

즉, 상단 메뉴/좌측 메뉴/하단 메뉴 모듈을 작성하고 각각의 모듈을 필요할 때에 <jsp:include> 액션 태그를 사용해서 불러다 쓸 수 있다.

 

 


 

 

3. <jsp:param>을 이용해 포함될 페이지에 파라미터 추가하기

 

<jsp:include> 액션 태그는 <jsp:param> 액션 태그를 이용해서  포함할 JSP 페이지에 파라미터를 추가할 수 있다.

 

아래 코드는 infoSub.jsp에 파라미터를 추가로 전달한다.

<%@ page language="java" contentType="text/html; charset=EUC-KR" %>
<html>
<head><title>INFO</title></head>
<body>
<table width="100%" border="1" cellpadding="0" cellspacing="0">
<tr>
	<td>제품번호</td> <td>XXXX</td>
</tr>
<tr>
	<td>가격</td> <td>10,000원</td>
</tr>
</table>
<jsp:include page="infoSub.jsp" flush="false">  //include를 사용해 infoSub.jsp 포함 시키기
	<jsp:param name="type" value="B" />  //새로 추가할 파라미터의 이름과 값을 입력 (B)
</jsp:include>
</body>
</html>

 

<jsp:param> 의 name 속성과 value 속성에는 포함할 페이지에 새로 추가할 파라미터의 이름과 값을 입력한다.

 

<%@ page contentType="text/html; charset=EUC-KR" %>
<html>
<head><title>InfoSub</title></head>
<body>
<%
	String type = request.getParameter("type");	 //info.jsp에서 전달한 type 파라미터 값 읽어옴
	if(type != null) {
%>
<br>
<table width="100%" border="1" cellpadding="0" cellspacing="0">
<tr>
	<td>타입</td>
	<td><b><%= type %></b></td>
</tr>
<tr>
	<td>특징</td>
	<td>
<%		if(type.equals("A")) { %>  
	강한 내구성		//type 파라미터 값이 A인 경우 출력됨
<% 		} else if(type.equals("B")) { %>
	뛰어난 대처 능력		 //type 파라미터 값이 B인 경우 출력됨
<% 		} %>
	</td>	
</tr>
</table>
<%
}
%>
</body>
</html>

▲ infoSub.jsp 의 코드

infoSub.jsp 페이지는 type 파라미터의 값에 따라 다른 정보를 출력한다.

 

출력 결과

info.jsp는 <jsp:param>을 사용하여 infoSub.jsp에 type 파라미터의 값으로 "B"를 전달해서 위와 같은 결과가 출력 되었다.

 

 

* <jsp:param> 태그는 이미 동일한 이름의 파라미터가 존재할 경우, 기존 파라미터 값을 유지하면서 새로운 값을 추가한다.

ex) 실행하기 전/후 파라미터 값에 변화가 발생하는지 여부 확인을 위한 예제

<%@ page contentType="text/html; charset=EUC-KR" %>
<%
	request.setCharacterEncoding("euc-kr"); 
%>
<html>
<head><title>INFO</title></head>
<body>
include 전 name 파라미터 값: <%= request.getParameter("name") %>
<hr />
<jsp:include page="body_sub.jsp" flush="false">
	<jsp:param value="tavi" name="name"/>  //name 파라미터 새로 추가
</jsp:include>
<hr />
include 후 name 파라미터 값: <%= request.getParameter("name") %>
</body>
</html>

▲ body_main.jsp 

* request.setCharacterEncoding(): <jsp:param>으로 전달되는 값은 이 메소드에 명시한 캐릭터 셋을 통해 인코딩 되어 전달됨

<%@ page contentType="text/html; charset=EUC-KR" %>
<html>
<head><title>INFO2</title></head>
<body>
body_sub에서 name 파라미터 값: <%= request.getParameter("name") %>
<br/>
name 파라미터 값 목록:
<ul>
<%
	String[] names = request.getParameterValues("name");
	for(String name : names) {
%>
	<li><%= name %></li>
<%
	}
%>
</ul>
</body>
</html>

▲ body_sub.jsp 

*request.getParameter(), request.getParameterValues() : name 파라미터 값을 출력, <jsp:param> 태그가 기존 파라미터 값에 새로운 값을 추가하는지 여부를 확인 가능

body_main.jsp에 get 방식으로 name 파라미터를 전달해 실행한 결과이다. (URL 맨 뒤에 ?name=cat 추가)

  • body_sub.jsp에서 request.getParameter("name")으로 구한 파라미터 값이 <jsp:param>을 통해 추가된 값
  • 또한 request.getParameterValues("name")으로 구한 파라미터 값 목록에는 새로 추가한 파라미터 값과 기존 파라미터 값이 함께 포함 됨

즉, <jsp:param>는 기존 파라미터 값을 유지한 채 새로운 파라미터 값을 추가하며 이때 새롭게 추가된 파라미터 값이 우선한다.

 

 

'Dev > Java' 카테고리의 다른 글

자바빈(JavaBean)  (0) 2022.09.02
include 디렉티브  (0) 2022.09.01
객체 지향 프로그래밍  (0) 2022.08.26
12. 그룹 알고리즘 (Group Algorithm)  (0) 2022.08.08
11. 최빈값 알고리즘(Mode Algorithm)  (0) 2022.08.08

댓글