[JSP 4-2] Standard Action Tag - include 태그

임승현·2022년 12월 9일
0

JSP

목록 보기
11/20

◈ action 폴더에 include 폴더 생성

🎨Header 영역

📌 include Directive : 외부파일(JSPF)을 읽어 소스코드(CSL 및 SSL)를 JSP 문서에 포함
→ file 속성값으로 설정된 외부파일의 소스코드를 포함하여 실행한 후 실행결과를 전달하여 응답
→ 외부파일의 내용이 변경될 경우 JSP 문서가 변경된 것과 동일하므로 JSP 문서에 대한 재해석 필요
→ file 속성값으로 JSP의 표현식(Expression) 사용 불가 - 속성값으로 설정된 외부파일의 소스코드만 포함(정적포함)
ex) 아래처럼 코드 사용시 에러 발생

String fileName="header.jspf"; %>
<%@include file="fileName" %>--%>
<%@include file="header.jspf" %>

↑대신 action 태그 사용
📌 include ActionTag : 스레드가 이동된 JSP 문서의 실행결과(CSL)를 제공받아 JSP 문서에 포함
형식) <jsp:include path="JSP"></jsp:include> 또는 <jsp:include path="JSP"/>
→ page 속성값으로 설정된 JSP 문서가 없는 경우 에러 발생 - 500
→ page 속성값으로 설정된 JSP 문서로 스레드를 이동하여 실행한 후 결과를 제공받아 포함하고 요청 JSP 문서의 실행결과를 클라이언트에게 전달하여 응답
→ 스레드가 이동될 JSP 문서의 내용이 변경될 경우 해당 JSP 문서만 변경된 것이므로 요청 JSP 문서에 대한 재해석 불필요
→ page 속성값으로 JSP의 표현식(Expression) 사용 가능 - 표현식에서 사용된 변수값에 따라 다른 JSP 문서의 결과를 포함(동적포함)

<%--<jsp:include page="header.jsp"/>--%>
<jsp:include page="<%=headFileName %>"/>

📌 param ActionTag : 스레드가 이동된 JSP 문서로 값을 전달하는 태그
→ 리퀘스트 메세지(request 객체)의 몸체부에 값을 저장하여 스레드가 이동된 JSP 문서로 전달 --%>
→ include 태그 또는 forward 태그의 자식태그로만 사영 가능
주의) include 태그 또는 forward 태그에 자식태그로 param 태그를 제외한 코드가 존재할 경우 에러 발생
→ JSP 주석문은 예외

<jsp:include page="footer.jsp">
	<jsp:param value="<%=masterName %>" name="masterName"/>
</jsp:include>

📃index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//요청 JSP 문서 및 스레드가 이동된 JSP 문서에 적용
	request.setCharacterEncoding("utf-8");
	//
	//전달값을 반환받아 저장
	String category=request.getParameter("category");
	if(category==null) {//JSP 문서 요청시 전달된 값이 없는 경우
		category="main";
	}
	//
	String headFileName="header.jsp";
	String masterName="";
	//
	//전달값을 비교하여 Header 영역에 포함될 JSP 문서의 파일명 저장 및 관리자명 저장
	if(category.equals("main")) {
		headFileName="header_main.jsp";
		masterName="홍길동(hong@itwill.xyz)";
	} else if(category.equals("blog")) {
		headFileName="header_blog.jsp";
		masterName="임꺽정(lim@itwill.xyz)";
	} else if(category.equals("cafe")) {
		headFileName="header_cafe.jsp";
		masterName="전우치(cheon@itwill.xyz)";
	} else {
		response.sendError(HttpServletResponse.SC_BAD_REQUEST);
		return;
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<%-- Header 영역 --%>
	<%-- 
	<h1>메인페이지</h1>
	<a href="index.jsp?category=main">메인</a>&nbsp;&nbsp;
	<a href="index.jsp?category=blog">블로그</a>&nbsp;&nbsp;
	<a href="index.jsp?category=cafe">카페</a>&nbsp;&nbsp;
	<hr>
	--%>
	<%-- include Directive : 외부파일(JSPF)을 읽어 소스코드(CSL 및 SSL)를 JSP 문서에 포함 --%>
	<%-- → file 속성값으로 설정된 외부파일의 소스코드를 포함하여 실행한 후 실행결과를 전달하여 응답 --%>
	<%-- → 외부파일의 내용이 변경될 경우 JSP 문서가 변경된 것과 동일하므로 JSP 문서에 대한 재해석 필요 --%>
	<%-- → file 속성값으로 JSP의 표현식(Expression) 사용 불가 - 속성값으로 설정된 외부파일의 소스코드만 포함(정적포함) --%>
	<%-- ex) 아래처럼 코드 사용시 에러 발생
	<% String fileName="header.jspf"; %>
	<%@include file="fileName" %>--%>
	<%--<%@include file="header.jspf" %>--%>
	<%-- ↑대신 action 태그 사용 --%>
	<%-- include ActionTag : 스레드가 이동된 JSP 문서의 실행결과(CSL)를 제공받아 JSP 문서에 포함 --%>
	<%-- 형식) <jsp:include path="JSP"></jsp:include> 또는 <jsp:include path="JSP"/> --%>
	<%-- → page 속성값으로 설정된 JSP 문서가 없는 경우 에러 발생 - 500 --%>
	<%-- → page 속성값으로 설정된 JSP 문서로 스레드를 이동하여 실행한 후 결과를 제공받아 포함하고 요청 JSP 문서의 실행결과를 클라이언트에게 전달하여 응답 --%>
	<%-- → 스레드가 이동될 JSP 문서의 내용이 변경될 경우 해당 JSP 문서만 변경된 것이므로 요청 JSP 문서에 대한 재해석 불필요 --%>
	<%-- → page 속성값으로 JSP의 표현식(Expression) 사용 가능 - 표현식에서 사용된 변수값에 따라 다른 JSP 문서의 결과를 포함(동적포함) --%>
	<%--<jsp:include page="header.jsp"/>--%>
	<jsp:include page="<%=headFileName %>"/>
	<%-- //////////////////////////////////////////////////////// --%>
	<%-- Content 영역 --%>
	<p>요청에 의해 응답되는 아주 중요한 내용입니다.</p>
	<p>요청에 의해 응답되는 아주 중요한 내용입니다.</p>
	<p>요청에 의해 응답되는 아주 중요한 내용입니다.</p>
	<p>요청에 의해 응답되는 아주 중요한 내용입니다.</p>
	<p>요청에 의해 응답되는 아주 중요한 내용입니다.</p>
	<%-- //////////////////////////////////////////////////////// --%>
	<%-- Footer 영역 --%>
	<%-- 
	<hr>
	<p>Copyright ©itwill Corp. All rights reserved.</p>
	<!-- <p>관리자 : 홍길동(hong@itwill.xyz)</p> -->
	<p>관리자 : <%=masterName %></p>
	--%>
	<%-- param ActionTag : 스레드가 이동된 JSP 문서로 값을 전달하는 태그 --%>
	<%-- → 리퀘스트 메세지(request 객체)의 몸체부에 값을 저장하여 스레드가 이동된 JSP 문서로 전달 --%>
	<%-- → include 태그 또는 forward 태그의 자식태그로만 사영 가능 --%>
	<%-- 주의)include 태그 또는 forward 태그에 자식태그로 param 태그를 제외한 코드가 존재할
	경우 에러 발생 - JSP 주석문은 예외 --%>
	<jsp:include page="footer.jsp">
		<jsp:param value="<%=masterName %>" name="masterName"/>
	</jsp:include>
</body>
</html>

📃header.jspf

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- int su=100; --%>    
<h1>메인페이지</h1>
<a href="index.jsp?category=main">메인</a>&nbsp;&nbsp;
<a href="index.jsp?category=blog">블로그</a>&nbsp;&nbsp;
<a href="index.jsp?category=cafe">카페</a>&nbsp;&nbsp;
<hr>

📃header.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- int su=100; --%>    
<h1>메인페이지</h1>
<a href="index.jsp?category=main">메인</a>&nbsp;&nbsp;
<a href="index.jsp?category=blog">블로그</a>&nbsp;&nbsp;
<a href="index.jsp?category=cafe">카페</a>&nbsp;&nbsp;
<hr>

📃header_main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>메인페이지</h1>
메인&nbsp;&nbsp;
<a href="index.jsp?category=blog">블로그</a>&nbsp;&nbsp;
<a href="index.jsp?category=cafe">카페</a>&nbsp;&nbsp;
<hr>

📃header_blog.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>블로그페이지</h1>
<a href="index.jsp?category=main">메인</a>&nbsp;&nbsp;
블로그&nbsp;&nbsp;
<a href="index.jsp?category=cafe">카페</a>&nbsp;&nbsp;
<hr>

📃header_cafe.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>카페페이지</h1>
<a href="index.jsp?category=main">메인</a>&nbsp;&nbsp;
<a href="index.jsp?category=blog">블로그</a>&nbsp;&nbsp;
카페&nbsp;&nbsp;
<hr>

📍 스레드가 이동된 JSP 문서(footer.jsp)는 클라이언트의 요청 JSP 문서(index.jsp)의 request 객체와 response 객체를 제공받아 사용
→ 스레드가 이동된 JSP 문서에서는 request 객체와 response 객체의 사용 제한 발생
문제점)스레드가 이동된 JSP 문서에서는 request 객체에 대한 리퀘스트 메세지 관련 정보 변경 불가능
→ request.setCharacterEncoding() 메소드를 호출하여 리퀘스트 몸체부에 저장되어 전달되는 값에 대한 캐릭터셋 변경 불가능
해결법)클라이언트의 요청 JSP 문서에서 리퀘스트 몸체부에 저장되어 전달되는 값에 대한 캐릭터셋 변경

//request.setCharacterEncoding("utf-8");
String masterName=request.getParameter("masterName");
if(masterName==null) {

문제점)스레드가 이동된 JSP 문서에서는 response 객체를 이용하여 클라이언트에게 에러코드나 URL 주소를 전달 불가능
→ 스레드가 이동된 JSP 문서는 결과를 클라이언트가 아닌 요청 JSP 문서에 전달하므로 에러코드 또는 URL 주소 전달은 무의미
해결법)자바스크립트로 응답 처리하여 페이지 이동 가능

response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return;

📃footer.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//스레드가 이동된 JSP 문서(footer.jsp)는 클라이언트의 요청 JSP 문서(index.jsp)의 request 객체와 response 객체를 제공받아 사용
	//→ 스레드가 이동된 JSP 문서에서는 request 객체와 response 객체의 사용 제한 발생
	//
	//문제점)스레드가 이동된 JSP 문서에서는 request 객체에 대한 리퀘스트 메세지 관련 정보 변경 불가능
	//→ request.setCharacterEncoding() 메소드를 호출하여 리퀘스트 몸체부에 저장되어 전달되는 값에 대한 캐릭터셋 변경 불가능
	//해결법)클라이언트의 요청 JSP 문서에서 리퀘스트 몸체부에 저장되어 전달되는 값에 대한 캐릭터셋 변경
	//request.setCharacterEncoding("utf-8");
	String masterName=request.getParameter("masterName");
	//
	if(masterName==null) {
		//문제점)스레드가 이동된 JSP 문서에서는 response 객체를 이용하여 클라이언트에게 에러코드나 URL 주소를 전달 불가능 
		//→ 스레드가 이동된 JSP 문서는 결과를 클라이언트가 아닌 요청 JSP 문서에 전달하므로 에러코드 또는 URL 주소 전달은 무의미
		//해결법)자바스크립트로 응답 처리하여 페이지 이동 가능
		response.sendError(HttpServletResponse.SC_BAD_REQUEST);
		return;
	}
%>    
<hr>
<p>Copyright ©itwill Corp. All rights reserved.</p>
<%-- <p>관리자 : 홍길동(hong@itwill.xyz)</p> --%>
<p>관리자 : <%=masterName %></p>

0개의 댓글