본문 바로가기

학원/복기

[JSP] 표준 액션 태그(Standard Action Tag) - include 태그/forward 태그/param 태그

표준 액션 태그(Standard Action Tag)

 

표준 액션 태그는 JSP 페이지에서 제공되는 미리 정의된 액션을 수행하는 태그로, Java 명령으로 구현해야 하는 기능을 표준 액션 태그로 제공한다. 이 태그들은 JSP 페이지에서 동적인 기능을 구현하기 위해 사용된다.

 

HTML 태그와 구분하기 위해 [jsp] 네임스페이스(NameSpace) 를 사용하고, JSP 태그라고 부른다. 

 

 


 

표준 액션 태그의 종류 

  • include 태그 : JSP 문서의 스레드를 다른 JSP 문서로 이동하여 실행된 결과(웹문서)를 제공받아 태그를 사용한 위치에 포함하는 태그 (스레드를 이동시켜 처리결과를 가져온다)
  • forward 태그 : JSP 문서의 스레드를 다른 JSP 문서로 이동하여 실행된 결과(웹문서)를 클라이언트에게 전달하여 응답하는 태그 (스레드를 이동시켜 대신 응답할 수 있도록 해준다) - forward 이동(서버측에서 페이지를 바꾼다) forward이동과 redirect이동을 잘 구분해야 한다.
  • param 태그 : JSP 문서에서 스레드가 이동된 JSP 문서로 값을 전달하기 위한 태그 - include 태그와 forward 태그의 하위태그로 실행
  • useBean 태그 : JSP 문서에서 사용할 수 있는 객체를 제공하기 위한 태그 - 내장객체에 저장된 속성값을 반환받아 제공하거나 새로운 객체를 생성하여 제공
  • setProperty 태그 : useBean 태그로 제공된 객체의 필드값을 변경하기 위한 태그 (Setter 메소드 호출) - useBean 태그의 종속태그
  • getProperty 태그 : useBean 태그로 제공된 객체의 필드값을 반환하기 위한 태그 (Getter 메소드 호출) - useBean 태그의 종속태그

 

include Directive와 include Tag 비교 

권한에 관련된 설정 등은 include 디렉티브를 많이 사용한다.

하지만 Header 영역 또는 footer영역 등에 파일을 포함시킬 땐 include 태그를 사용하는 것을 더 권장한다. 

 

include 디렉티브와 include 태그의 가장 큰 차이점은, include 디렉티브는 file 속성값으로 JSP의 표현식 사용이 불가능하지만 include 태그의 page 속성에는 JSP의 표현식 사용이 가능하다는 점이다. 


include Directive

: 외부파일(JSPF)의 소스코드를 JSP 문서에 포함시킨다.

 

→ CSL(HTML, CSS, JavaScript) 및 SSL(Java - Script Element)의 소스코드를 포함시킨다.

JSP 문서를 요청한 경우  include 디렉티브의 file 속성값으로 설정된 외부파일의 소스코드를 JSP 문서에 포함한 후 실행한 결과를 클라이언트에게 응답한다. 

 include 디렉티브의 file 속성값으로 설정된 외부파일의 내용이 변경될 경우 JSP 문서를 변경한 것과 동일하므로 JSP 문서를 다시 해석하여 서블릿으로 생성한다. 

include 디렉티브의 file 속성값으로 JSP의 표현식(Expression) 사용이 불가능하다. 

→ include 디렉티브의 file 속성값으로 설정된 외부파일의 소스코드만 포함시킬 수 있다. (정적포함) 

 

 

include Directive 예제)

 

action >> include>> index.jsp

 

[index.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<%-- Header 영역 --%>
	<%@ include file="header.jspf"%>
	
	<%-- Content 영역 --%>
	<p>메일 관련 정보가 출력됩니다.</p>
	<p>메일 관련 정보가 출력됩니다.</p>
	<p>메일 관련 정보가 출력됩니다.</p>
	<p>메일 관련 정보가 출력됩니다.</p>
	<p>메일 관련 정보가 출력됩니다.</p>
	
	<%-- Footer 영역 --%>
	<hr>
	<p>Copyright © Garu Corp. All rights reserved.</p>
	<p>관리자 : 김민지(kim@garu.xyz)</p>
</body>
</html>

 

[header.jspf]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>메일페이지</h1>
<a href="index.jsp">메일(Mail)</a>&nbsp;&nbsp;
<a href="index.jsp">블로그(Blog)</a>&nbsp;&nbsp;
<a href="index.jsp">카페(Cafe)</a>&nbsp;&nbsp;
<hr>

 

 


include Tag

: 요청 JSP 문서에서 다른 JSP 문서로 스레드를 이동하고 실행하여  실행될 결과를 가져와 요청 JSP 문서에 포함하는 태그

→ JSP 문서의 실행결과(CSL - HTML, CSS, JavaScript)를 포함시킨다. 

 

형식)

<jsp:include page="JSP 문서의 경로"/></jsp:include>

 

→ page 속성값으로 설정된 JSP 문서가 없는 경우 에러가 발생한다.

page 속성값으로 설정된 JSP 문서가 변경되어도 요청 JSP 문서에는 아무런 영향을 주지 않는다. 

 

include Tag의 page 속성값으로 JSP의 표현식(Expression) 사용이 가능하다. 

→ JSP의 표현식(Expression)으로 제공되는 JSP 문서의 실행결과를 포함할 수 있다. (동적포함)

 

 

param Tag 

: 스레드가 이동된 JSP 문서에게 값을 전달하는 태그 
→ include 태그 또는 forward 태그의 하위 태그로 사용한다.
요청 JSP 문서에서 다른 JSP 문서로 스레드를 이동할 경우 요청 JSP 문서의 request 객체와 response 객체를 스레드가 이동되는 JSP 문서에 전달하여 사용할 수 있도록 해준다.
→ param 태그를 사용하면 request 객체의 몸체부에 값을 저장하여 전달한다. 
include 태그와 forward 태그의 하위태그로 param 태그를 제외한 문장이 존재할 경우 에러가 발생한다. 

 

 

[index.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//footer.jsp에서 변경이 불가능하기 때문에 요청 JSP문서인 index.jsp에서 변경 처리
	request.setCharacterEncoding("utf-8"); 	

	//JSP 문서 요청시 전달된 값을 반환받아 저장
	String category=request.getParameter("category");

	if(category==null) {//전달값이 없는 경우
		category="mail";
	}
	
	String headerPath="";//Header 영역에 포함될 파일의 경로를 저장하기 위한 변수
	String master="";//페이지 관리자의 정보를 저장하기 위한 변수
	
	//전달값을 비교하여 Header 영역에 포함될 파일의 경로를 구분하여 저장
	if(category.equals("mail")) {
		headerPath="header_mail.jsp";
		master="김민지(kim@garu.xyz)";
	} else if(category.equals("blog")) {
		headerPath="header_blog.jsp";
		master="강하늘(kang@garu.xyz)";
	} else if(category.equals("cafe")) {
		headerPath="header_cafe.jsp";
		master="이효리(lee@garu.xyz)";
	} else {
		response.sendError(HttpServletResponse.SC_BAD_REQUEST);
		return;
	}

	//Content 영역에 포함될 파일의 경로를 저장하기 위한 변수
	// => 전달값으로 Content 영역에 포함될 파일의 경로 저장
	String contentPath=category+".jsp";
%>     
<!DOCTYPE html> 
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<%-- Header 영역 --%>
	<%--<%@include file="header.jspf"%>--%>
	<%--<%@include file="<%=headerPath %>" %>  >> include 디렉티브는 JSP 표현식 사용 불가능--%>
	
	<%-- include Tag --%>
	<%--<jsp:include page="header.jsp"/>--%>
	<%-- 동적포함 --%>
	<jsp:include page="<%=headerPath %>"/>
	
	
	<%-- Content 영역 --%>
	<jsp:include page="<%=contentPath %>"/>
	
	
	<%-- Footer 영역 --%>
	
	<%-- param 태그 : 스레드가 이동된 JSP 문서에게 값을 전달하는 태그 --%>
	<jsp:include page="footer.jsp">
		<jsp:param value="<%=master %>" name="master"/>
	</jsp:include>
</body>
</html>

 

[header_mail.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>메일페이지</h1>
메일(Mail)&nbsp;&nbsp;
<a href="index.jsp?category=blog">블로그(Blog)</a>&nbsp;&nbsp;
<a href="index.jsp?category=cafe">카페(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=mail">메일(Mail)</a>&nbsp;&nbsp;
블로그(Blog)&nbsp;&nbsp;
<a href="index.jsp?category=cafe">카페(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=mail">메일(Mail)</a>&nbsp;&nbsp;
<a href="index.jsp?category=blog">블로그(Blog)</a>&nbsp;&nbsp;
카페(Cafe)&nbsp;&nbsp;
<hr>

 

[mail.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<p>메일 관련 정보가 출력됩니다.</p>
<p>메일 관련 정보가 출력됩니다.</p>
<p>메일 관련 정보가 출력됩니다.</p>
<p>메일 관련 정보가 출력됩니다.</p>
<p>메일 관련 정보가 출력됩니다.</p>

 

[blog.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<p>블로그 관련 정보가 출력됩니다.</p>
<p>블로그 관련 정보가 출력됩니다.</p>
<p>블로그 관련 정보가 출력됩니다.</p>
<p>블로그 관련 정보가 출력됩니다.</p>
<p>블로그 관련 정보가 출력됩니다.</p>

 

 

[cafe.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<p>카페 관련 정보가 출력됩니다.</p>
<p>카페 관련 정보가 출력됩니다.</p>
<p>카페 관련 정보가 출력됩니다.</p>
<p>카페 관련 정보가 출력됩니다.</p>
<p>카페 관련 정보가 출력됩니다.</p>

 

[footer.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- 요청 JSP 문서에서 스레드가 이동되어 실행되는 JSP 문서는 요청 JSP 문서의 request 객체와 
response 객체를 전달받아 사용한다. 즉, 빌려다 사용한다. 
따라서 request 객체와 response 객체의 사용제한이 발생된다. (메소드 사용이 제한된다.) --%>
<%
	//스레드가 이동되어 실행되는 JSP 문서에서는 request 객체의 정보를 사용할 수 있지만
	//변경은 불가능하다. 
	//따라서 request 객체의 정보를 변경해야 될 경우 요청 JSP 문서에서 변경 처리해야한다. 
	//request.setCharacterEncoding("utf-8"); //불가능 
	
	String master=request.getParameter("master");
	
	//스레드가 이동되어 실행되는 JSP 문서에는 response 객체에 실행결과를 포함하여 요청 JSP 문서에
	//전달할 수 있지만 클라이언트에게 에러코드나 URL 주소를 직접 전달하여 응답할 수 없다.
	// => 클라이언트에게 에러코드나 URL 주소를 전달하고 싶으면 JavaScript를 이용해야 한다. 
	if(master==null) {
		//response.sendError(HttpServletResponse.SC_BAD_REQUEST);
		response.sendRedirect("../standard_action.jsp");
		return;
	}
%>
<hr>
<p>Copyright © Garu Corp. All rights reserved.</p>
<p>관리자 : <%=master %></p>

 


 

action >> forward 폴더

forward Tag

: 요청 JSP 문서에서 다른 JSP 문서를 스레드를 이동하여 스레드가 이동된 JSP 문서로 응답 처리하기 위한 기능을 제공하는 태그 - 포워드 이동 

→ forward 이동을 하면 서버측에서 이동되기 때문에 클라이언트의 URL 주소가 변경되지 않는다. 

→ 스레드가 이동되는 JSP 문서에서는 request 내장객체에 저장된 속성값을 반환받아 사용이 가능하다. 

 

 

형식) 

<jsp:forward page="스레드가 이동될 JSP 문서"></jsp:forward>

→ page 속성값으로 JSP 표현식(Expression) 사용이 가능하다. 

 

 


예제)

 

[login.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<h1>로그인 페이지</h1>
	<hr>
	<a href="main.jsp">메인으로</a>
</body>
</html>

 

[join.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<h1>회원가입 페이지</h1>
	<hr>
	<a href="main.jsp">메인으로</a>
</body>
</html>

 

[cart.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<h1>장바구니 페이지</h1>
	<hr>
	<a href="main.jsp">메인으로</a>
</body>
</html>

 

[review.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<h1>제품후기 페이지</h1>
	<hr>
	<a href="main.jsp">메인으로</a>
</body>
</html>

 

[main.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<h1>메인페이지</h1>
	<hr>
	<%-- 
	<a href="login.jsp">로그인</a>&nbsp;&nbsp;
	<a href="join.jsp">회원가입</a>&nbsp;&nbsp;
	<a href="cart.jsp">장바구니</a>&nbsp;&nbsp;
	<a href="review.jsp">제품후기</a>&nbsp;&nbsp;
	--%>
	
	<a href="controller.jsp?pageName=login">로그인</a>&nbsp;&nbsp;
	<a href="controller.jsp?pageName=join">회원가입</a>&nbsp;&nbsp;
	<a href="controller.jsp?pageName=cart">장바구니</a>&nbsp;&nbsp;
	<a href="controller.jsp?pageName=review">제품후기</a>&nbsp;&nbsp;
</body>
</html>

 

[controller.jsp]

전달값을 이용하여 다른 JSP 문서로 포워드 이동하는 JSP 문서

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- 전달값을 이용하여 다른 JSP 문서로 포워드 이동하는 JSP 문서 --%>
<%
	//전달값을 반환받아 저장
	String pageName=request.getParameter("pageName");

	if(pageName==null) {//전달값이 없는 경우
		//클라이언트에게 URL 주소를 전달하여 응답
		// => URL 주소를 응답받은 클라이언트는 브라우저의 요청 URL 주소를 변경하여 서버의
		//JSP 문서를 요청하여 실행결과(웹문서)를 응답받아 출력한다. - 리다이렉트 이동
		response.sendRedirect("main.jsp");
		return;
	}
	
	String contextPath=pageName+".jsp";
%>

<%-- forward Tag --%>
<jsp:forward page="<%=contextPath %>"/>

 

'학원 > 복기' 카테고리의 다른 글

[JSP] DB 연동 예제  (0) 2023.06.26
[JSP] 자바빈(JavaBean) / useBean 태그  (0) 2023.06.26
[JSP] 객체의 사용범위(Scope)  (0) 2023.06.25
[JSP] 내장객체(Implicit Object)  (0) 2023.06.23
[JSP] 지시어(Directive) - taglib  (0) 2023.06.22