자바(JAVA)/JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)

JAVA/JSP 19. 액션 태그(Action Tag) - 액션 태그의 개념, <jsp:include>

개발학생 2023. 12. 6. 12:20
반응형

1. 액션 태그의 개념

  • 액션 태그(Action Tag): JSP의 표준 태그로, 페이지 사이에서 이동을 제어하거나 자바빈 생성 시 주로 사용됨
  • 특별한 선언 없이, <jsp:태그명 /> 형태로 사용 (태그처럼 사용하지만 이 뒤에서는 JSP가 수행됨)
  • JSP 코드와 마찬가지로 웹 애플리케이션 서버(WAS)에서 처리된 후 결과만 출력되어, 웹 브라우저에서 소스 보기를 했을 때 이 태그가 보이지 않음
  • 용도별 액션 태그
<jsp:include> 외부 jsp 파일을 현재 jsp 파일에 포함시킴
<jsp:forward> 요청(request)을 다른 페이지로 넘김
<jsp:useBean>, <jsp:setProperty>, <jsp:getProperty> 자바빈즈를 생성하고 값을 설정/추출함
<jsp:param> 다른 페이지로 매개변수를 전달함
(<jsp:include>, <jsp:forward> 와 함께 사용함)

 

2. <jsp:include>

1) include 지시어와 <jsp:include> 액션 태그 이해하기

  • 둘 다 외부 jsp 파일을 현재 jsp 파일에 포함시키는 기능을 하는데, 동작 방식이 다름
  지시어 액션 태그
형식 <%@ include file=”포함할 파일의 경로” %> <jsp:include page=”포함할 파일의 경로” />
표현식 사용 불가 사용 가능
포함 방식 페이지 자체를 현재 페이지에 포함시킴 (이후 컴파일 → 실행) ‘실행의 흐름’을 포함시킬 페이지로 이동한 후,
실행한 결과를 현재 페이지에 포함시킴
변수 포함시킨 파일에서 생성한 변수 - 사용 가능 포함시킨 파일에서 생성한 변수 - 사용 불가
page 영역 공유됨 공유되지 않음
request 영역 공유됨 공유됨

 

(1) include 지시어의 동작 매커니즘 그림

  • 페이지를 원본 그대로, 현재 페이지에 먼저 포함시킨 후 컴파일함
    → JSP 코드만 서로 다른 페이지로 모듈화(부품화)하므로, 동일한 페이지로 인식됨

 

(2) <jsp:include> 액션 태그의 동작 매커니즘 그림

  • 포함시킬 페이지로 ‘요청의 흐름’이 이동되어 컴파일을 진행한 후, 그 결과물(컴파일된 것)을 현재 페이지에 삽입
    → 포함시킬 페이지에서 생성한 변수 현재 페이지에서 사용 불가, page 영역이 공유되지 않음
        (다른 페이지로 인식하기 때문)
    → 이때 웹 서버에서 컴파일된 JSP 코드는 모두 단순한 HTML 형태로 변환됨

 

2) 포함될 외부 파일들 준비

  • WebContent 폴더에 ActionTag 폴더 생성 → 하위에 inc 폴더 생성

*inc 폴더에 OuterPage1.jsp, OuterPage2.jsp 파일 생성

  • OuterPage1.jsp
// WebContent/ActionTag/inc/OuerPage1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>OuterPage</title>
</head>
<body>
    <h2>외부 파일 1</h2>
    <%
    String newVar1 = "고구려 세운 동명왕";    //1.
    %>
    <ul>
				//2.(아래 코드 2줄)
        <li>page 영역 속성 : <%= pageContext.getAttribute("pAttr") %></li>
        <li>request 영역 속성 : <%= request.getAttribute("rAttr") %></li>
    </ul>
</body>
</html>
  1. String 타입 변수를 하나 선언함
  2. page와 request 내장 객체 영역에서 속성을 읽어와 출력

 

  • OuterPage2.jsp - OuterPage1.jsp과 똑같고, String 변수의 이름과 값만 다름
// WebContent/ActionTag/inc/OuerPage2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>OuterPage</title>
</head>
<body>
    <h2>외부 파일 2</h2>
    <%
    String newVar2 = "백제 온조왕";
    %>
    <ul>
        <li>page 영역 속성 : <%= pageContext.getAttribute("pAttr") %></li>
        <li>request 영역 속성 : <%= request.getAttribute("rAttr") %></li>
    </ul>
</body>
</html>

 

3) 포함 방식에 따른 차이 확인

  • 앞의 두 외부 파일을 지시어와 액션 태그로 각각 인클루드하여 차이 확인

(1) WebContent → ActionTag 폴더에서 IncludeMain.jsp 파일 생성

// WebContent/ActionTag/IncludeMain.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
//1.포함할 파일의 경로
String outerPath1 = "./inc/OuterPage1.jsp";
String outerPath2 = "./inc/OuterPage2.jsp";

//2.page 영역과 request 영역에 속성 저장 
pageContext.setAttribute("pAttr", "동명왕");
request.setAttribute("rAttr", "온조왕");
%>
<html>
<head><title>지시어와 액션 태그 동작 방식 비교</title></head>
<body>
    <h2>지시어와 액션 태그 동작 방식 비교</h2>
    <!-- 지시어 방식 -->
    <h3>지시어로 페이지 포함하기</h3>
    <%@ include file="./inc/OuterPage1.jsp"%>    //3.
    <%--@ include file="<%=outerPath1OuterPage1%>" --%>    //4.
    <p>외부 파일에 선언한 변수 : <%=newVar1%></p>    //5.

    <!-- 액션 태그 방식 -->
    <h3>액션 태그로 페이지 포함하기</h3>
    <jsp:include page="./inc/OuterPage2.jsp" />    //6.
    <jsp:include page="<%=outerPath2%>" />    //7.
    <p>외부 파일에 선언한 변수 : <%--=newVar2 --%></p>    //8.
</body>
</html>
  1. 외부 파일을 포함할 두 파일의 경로를 변수에 저장함 (4.와 7.에서 표현식 사용 가능 여부를 확인해보기 위한 용도의 변수들
  2. page 영역과 request 영역에 속성을 저장함 (여기서 설정한 속성을, 포함할 두 파일에서 읽어올 수 있는지 확인하기 위한 용도
  3. include 지시어로 OuterPage1.jsp 파일을 포함시킴
  4. 3.을 표현식으로 잘못 나타낸 사례 (include 지시어는 표현식을 지원하지 않음
  5. OuterPage1.jsp에서 선언한 newVar1 변수 출력 (지시어 방식은 실행 전에 파일을 포함시켜 컴파일을 진행하므로, Outer1.jsp/Outer2.jsp 파일이 같은 페이지로 인식되기 때문)
  6. 액션 태그로 페이지를 포함시키는 코드
  7. 액션 태그로 페이지를 포함시키는 코드 - 표현식을 썼지만, 액션 태그는 표현식을 지원하므로 문제없이 실행됨
  8. OuterPage2.jsp에서 선언한 newVar2 변수 출력 (주석 해제 후 실행 시 ‘선언되지 않은 변수’라는 에러 발생
    → 액션 태그 방식은 실행의 흐름만 이동시켜, 실행된 결괏값만 가져와서 포함시키기 때문)

 

(2) IncludeMain.jsp 파일 실행 결과

  1. 외부 파일 1은 OuterPage1.jsp를 의미함
  2. page 영역과 request 영역에 저장된 속성값을 정상적으로 가져와서 출력함
  3. 외부 파일에서 선언한 변수의 값도 잘 출력됨
  4. 외부 파일 2는 OuterPage2.jsp를 의미함
    → 액션 태그에서는 표현식을 사용할 수 있으므로 파일이 두 번 포함되어, 출력도 두 번 됨
  5. page 영역에 설정한 속성은 null
    → 실행한 IncludeMain.jsp와 인클루드된 OuterPage2.jsp는 서로 다른 페이지로 처리되므로 page 영역은 공유되지 않기 때문
  6. 외부 파일에서 선언한 변수 부분은 아무것도 출력되지 않음
    → 외부 파일의 변수를 가져오려 하면 컴파일 자체가 되지 않으므로, 주석으로 처리했기 때문

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형