2022. 3. 19. 20:06ㆍLanguage`/JSP (Java Server Page)
<jsp:include>
- 다른 JSP의 실행 결과 & 코드를 포함할 때 사용하는 액션 태그
- 중복된 코드를 하나의 .jsp를 통해서 구현할 수 있다
- 화면 구성 요소의 코드 중복을 없앨 수 있다
<jsp:include page = "포함할 다른 페이지" flush = "true" />
- page : 포함할 다른 JSP 페이지의 경로 지정
- flush : "page"에서 지정한 JSP 페이지를 실행하기 전에 출력 버퍼를 flush할지 여부 지정 & default = "false"
## main.jsp ##
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
main.jsp 실행<br>
<jsp:include page="sub.jsp" flush="false"/>
include 이후
</body>
</html>
## sub.jsp ##
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>
sub.jsp 실행
</p>
</body>
</html>
※ flush : "true"? "false"?
flush를 "true"로 지정하게 되면 <jsp:include ~>를 실행하는 시점에 출력 버퍼에 저장된 내용들을 flush한다는 의미이다.
출력 버퍼를 flush하게 되면 client에게 response를 보내게 되고 HTTP 메시지의 가장 상단에 응답 상태 코드가 먼저 보내지기 때문에 <jsp:include ~>이후에 새로운 헤더 정보를 추가해도 반영되지 않는다
만약 sub.jsp에 대한 include 태그에서 "flush = true"로 설정했다면 sub.jsp로 요청 흐름이 넘어갈 때 main.jsp에서는 이미 response를 보내기 때문에 sub.jsp에서 response에 데이터를 추가해도 반영되지 않는다
반면에 위에 코드에서 볼수 있듯이 sub.jsp에 대한 include 태그에서 "flush = false"로 설정했다면 sub.jsp로 요청 흐름이 넘어가더라도 main.jsp에서는 flush를 하지 않고, 그에 따라서 sub.jsp에서 response에 데이터를 추가하면 다시 main.jsp로 요청 흐름이 넘어올때 response에 추가한 데이터가 반영되어서 main.jsp에서 최종적인 response message를 client에게 응답한다
<jsp:param>
<jsp:include ~~~~~>
<jsp:param name="~~" value="~~" />
<jsp:param name="~~" value="~~" />
</jsp:include>
- <jsp:include>에 포함된 다른 JSP 페이지에게 <jsp:param>을 통해서 (name, value)인 파라미터를 전달해줄 수 있다
- 그러면 <jsp:include>에 포함된 다른 JSP 페이지에서는 request.getParameter("~~")를 통해서 파라미터를 받을 수 있다
- <jsp:param>은 <jsp:include>의 자식 태그로써 <jsp:include> 태그 내부에서만 활용 가능하다
- jsp:include에 의해서 요청 흐름이 넘어갈때 보낼 파라미터들을 설정한다고 보면 된다
## info_table.jsp ##
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table width="100%" border="1">
<tr>
<td>제품번호</td>
<td>XXXX</td>
</tr>
<tr>
<td>가격</td>
<td>5000원</td>
</tr>
</table>
<!-- param_result.jsp에서 실행한 결과 가져오기 -->
<jsp:include page="param_result.jsp" flush="false">
<jsp:param name="type" value="A"/>
</jsp:include>
</body>
</html>
"param_result.jsp"에게 ("type", "A") 파라미터를 전달
## param_reseult.jsp ##
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
String type = request.getParameter("type");
String value = "";
if(type == null){
return;
}
else if(type.equals("A")){
value = "강한 내구성";
}
else if(type.equals("B")){
value = "쓸만한 내구성";
}
else{
value = "안좋은 내구성";
}
%>
<table width="100%" border="1">
<tr>
<td>타입</td>
<td><%=type%></td>
</tr>
<tr>
<td>특징</td>
<td><%=value%></td>
</tr>
</table>
</body>
</html>
전달받은 파라미터는 request.getParameter()를 통해서 받는다
<!-- param_result.jsp에서 실행한 결과 가져오기 -->
<jsp:include page="param_result.jsp" flush="false">
<jsp:param name="type" value="A"/>
</jsp:include>
<!-- param_result.jsp에서 실행한 결과 가져오기 -->
<jsp:include page="param_result.jsp" flush="false">
<jsp:param name="type" value="B"/>
</jsp:include>
<!-- param_result.jsp에서 실행한 결과 가져오기 -->
<jsp:include page="param_result.jsp" flush="false">
<jsp:param name="type" value="C"/>
</jsp:include>
>> 전달한 파라미터의 value에 따라 param_result.jsp는 다른 결과를 보여준다
※ <jsp:param> - 이미 동일한 이름의 파리미터가 존재하면?
URL : http://localhost:8080/chap07/body_main.jsp?name=cbk
- 요청 URL에 (name, "cbk") 파라미터가 포함되어 있다고 가정
<jsp:include page="body_sub.jsp">
<jsp:param name="name" value="홍길동"/>
</jsp:include>
- 여기서 (name, "홍길동")이라는 새로운 파라미터를 또 전달하게 되면 body_sub.jsp측에서는 "name" 파라미터에 대해서 ("cbk", "홍길동")인 2개의 value를 갖게 된다
include 디렉티브 vs <jsp:include>
<jsp:include> 액션 태그 : 다른 JSP 페이지로 실행 흐름을 이동시켜서, 해당 실행 결과를 현재 위치에 포함
- 주로 레이아웃의 한 구성 요소를 모듈화하기 위해 사용
include 디렉티브 : 다른 파일의 내용을 현재 위치에 먼저 포함시키고, 이 다음에 JSP 파일을 자바 코드로 변환하고 컴파일하는 방식
<%@ include file = "포함할 파일" %>
- 포함할 파일의 코드를 현재 JSP 페이지에 해당 위치에 그대로 삽입해준다고 보면 된다
- 모든 JSP 페이지에서 사용하는 변수 지정
- 저작권 표시와 같이 모든 페이지에서 중복되는 간단한 문장
<jsp:include> | include 디렉티브 | |
처리 시간 | 코드 내에서 <jsp:include>를 요청 시 처리 | JSP 파일을 자바 소스코드로 변환할 때 처리 |
기능 | 아예 별도의 파일로 <jsp:include>에 지정된 파일에서 실행한 결과를 현재 JSP 페이지에 표현 |
현재 파일에 include 디렉티브에 지정된 파일의 코드를 삽입 |
데이터 전달 방법 | <jsp:param>을 이용해서 파라미터로 value 전달 | include 디렉티브에 지정된 파일 내에 변수 등을 지정하고 현재 JSP에서 "include 디렉티브"가 선언된 다음 줄부터 해당 변수 사용 가능 |
용도 | 화면의 레이아웃을 일부분 모듈화할 때 주로 사용 | 다수의 JSP 페이지에서 공통으로 사용하는 변수 지정 or 저작권 같은 단순한 문장 |
## include_test.jsp ##
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int num = 100;
%>
<%@ include file="include_file.jsp" %>
<br>
include_file.jsp의 변수 "int num2" : <%=num2%>
</body>
</html>
"include_file.jsp"에서는 include_test.jsp에서 선언된 변수 "int num = 100"을 사용할 수 있다
## include_file.jsp ##
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int num2 = 500;
%>
include_test.jsp의 변수 "int num" : <%=num%>
</body>
</html>
"include_test.jsp"에서는 include_file.jsp에서 선언된 변수 "int num2 = 500"을 사용할 수 있다
이러한 기능(A라는 jsp파일의 필드를 B라는 jsp파일에서 사용)이 가능한 이유는 <% include> = include 디렉티브는 "file에 걸려있는 jsp파일"을 먼저 현재 위치에 포함시키고 자바 소스코드로 변환한 다음에 서블릿 클래스로 컴파일하기 때문이다
코드 자동 삽입 기능 (파일)
- include 디렉티브를 사용하지 않고, web.xml 파일을 이용해서 "현재 JSP 페이지"의 앞/뒤에 지정한 파일을 삽입할 수 있다
<jsp-config>
<jsp-property-group>
<url-pattern>"property에 적용할 JSP 파일의 URL 패턴"</url-pattern>
<include-prelude>"앞에 삽입할 파일"</include-prelude>
<include-coda>"뒤에 삽입할 파일"</include-coda>
</jsp-property-group>
</jsp-config>
Example)
<%@ include file = "header.jsp" %>
<html>
..
..
..
<%@ include file = "footer.jsp" %>
<jsp-config>
<jsp-property-group>
<url-pattern>"property에 적용할 JSP 파일의 URL 패턴"</url-pattern>
<include-prelude>header.jsp</include-prelude>
<include-coda>footer.jsp</include-coda>
</jsp-property-group>
</jsp-config>
include 디렉티브 (jspf)
include 디렉티브는 해당 file을 include 디렉티브를 호출한 위치에 먼저 적용시키는 개념이다
따라서 include 디렉티브의 file은 전체적인 jsp의 구조를 갖추지 않고 조각형태로 가져도 된다
이러한 조각형태로 존재하는 jsp파일은 확장자로 "jspf"를 설정해주면 된다