JSP

[JSP]Action Tag

MoZZANG 2022. 5. 3. 19:39
Action Tag(액션태그)란?

: - JSP의 표준 태그이다.
 - <jsp:태그명>으로 표현한다.
 - 페이지와 페이지사이의 제어 이동이나 자바빈(좁은 의미)등을 사용하는데 이용된다.
 - Action태그의 각 속성값에는 표현식을 이용해 값을 설정 할 수도 있다. 단,지시어에는 불가
   <%@ include file="<%=pageName%>" %> [x]

 - 소스보기시 서버측(WAS서버)에서 해석되어 액션태그가 보이지 않음.

 - XML 문법을 따른다.
 - 반드시 종료태그를 사용해야 함

 

 

 

Action Tag의 종류

1)<jsp:include>

- 페이지를 모듈화 할 때 사용.
- include한 페이지로 임시적으로 제어를 옮겼다가 그 실행 결과를 해당 페이지에 포함.
- 파일을 합치지 않고 컨텐트를 출력할 때  include한 파일의 출력과 기존 파일의 출력을 통합한다.
- request개체를 공유한다.

 

<jsp:include page="포함될페이지경로" />
page에는 절대경로/상대경로 다 적용되나 절대경로시에는 컨텍스트 루트 경로 제외(inlcude지시어도 동일)

 

include 지시어와 <jsp:include>액션 태그의 차이점

- <jsp:include page=""/>는 다른 jsp로 흐름제어를 이동시켜 그 결과물을 현재 위치에 포함시키는 방식인 반면,

- <%@ include file=""%>는 다른 파일의 내용을 현재 위치에  삽입시킨 후에 jsp파일을 자바 파일로 변환하고 컴파일 하는 방식인 것이다.

 

 

 

2)<jsp:forward>


- 다른 페이지로 프로그램의 제어를 이동하는 경우에 사용
- <jsp:forward>를 만나기 전까지 출력을 모두 제거하고 해당하는 페이지로 이동.즉 <jsp:forward> 이전의 웹브라우저에 출력하는  jsp코드는 의미 없다.
- 출력버퍼를 사용하지 않은 경우(buffer="none") 이 액션태그를 사용못함 즉 에러발생(JSP규약)
- request 개체를 공유한다.
- 조건에  따라 여러페이지로 이동해야 할 경우에 사용
- forward 액션 태그는 아래 자바코드와 같은 액션을 일으킨다


 <%
RequestDispatcher rd=request.getRequestDispatcher("포워드시킬 페이지명");
rd.forward(request,response);
 %>

 

 

 

 

 

 

예제를 보자

 

IncludeActiontag.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 
※include지시어의 file속성과
  include액션태그의 page속성에
  절대경로로 페이지 포함시에는 Context 루트 제외한
 경로.
 단,server.xml의 Context엘리먼트의 path속성을 ""으로
 설정시에는 request.getContextPath()로 해도 상관없다.
 
※include지시어의 file속성에는 표현식 사용불가
 include액션태그의 page속성에는 표현식 사용가능
  단,표현식을 사용할때는 page속성에 표현식만 와야한다.



[include지시어와 include 액션태그의 차이점]

  include 지시어를 사용한 페이지 include(포함)]
    -소스 그대로 해당 위치에 포함됨
    -include지시어를 통해 포함된 페이지는 현재 페이지와 같은 페이지를 의미
 include 액션태그를 사용한 페이지 include(포함)]
    -JSP컨테이너에 의해 실행된 결과가  해당 위치에 포함됨
    -서로 다른 페이지를 의미
    -단, request영역 공유
-->
<%
//페이지명 변수에 저장
String directivePath="DirectivePage.jsp";
String actionPath="ActiontagPage.jsp";
//페이지 및 리퀘스트 영역에 속성 저장
pageContext.setAttribute("pageVar", "페이지 영역입니다");
request.setAttribute("requestVar", "리퀘스트 영역입니다");

%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>IncludeActiontag.jsp</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
<style>
  /*점보트론 세로폭 줄이기*/
  .jumbotron {
    padding-top: 1rem;
    padding-bottom: 1rem;
  }
</style>
</head>
<body>

<div class="jumbotron jumbotron-fluid bg-warning">
    <div class="container-fluid">
      <h1>include액션태그</h1>      
    </div><!--container-fluid-->
   </div><!--jumbotron-fluid--> 
   <div class="container">    
     <fieldset class="form-group border p-3">
     <legend class="w-auto p-3">include지시어와 &lt;include&gt;액션태그</legend>
     <!-- file속성에 표현식 사용불가 -->
     <%--@ include file="<%=directivePath %>" --%>
     <h2>include지시어로 페이지 삽입하기</h2>
     <%@ include file="DirectivePage.jsp" %>
     <h2>include액션태그로 페이지 삽입하기</h2>
     <!-- page속성에 표현식 가능 -->
     <jsp:include page="<%=actionPath %>"/>
     <h2>삽입된 페이지 안에서 선언한 변수 사용하기</h2>
     directiveString : <%=directiveString %><br/>
     <!-- include액션태그로 포함된 페이지에서 선언한 변수는
         사용불가(실행결과(HTML결과)만 포함됨으로)
    -->
     actiontagString : <%--=actiontagString --%>
     </fieldset>
   </div><!-- container -->
</body>
</html>

▲지시어로 페이지를 연결할 때는 해당 페이지의 코드가 복사붙여넣기가 되는 방식으로 삽입되기 때문에 같은 지시어로 연결된 페이지와 같은 페이지이므로 페이지영역과 리퀘스트 영역의 값이 모두 살아있다.

 

하지만 액션태그로 연결하면 액션태그로 연결된 페이지는 따로 서블릿으로 변환되어 최종결과를 삽입하는 것이므로 두 페이지는 다른 페이지이므로 null이다. 또한 액션태그로 포함된 페이지에서 선언한 변수는 사용이 불가하다. 실행결과 즉 HTML결과만이 포함되기 때문이다.

 

 

ActiontagPage.jsp
anguage="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- ActiontagPage.jsp -->
<%
	//- 이 페이지는 서블릿으로 변환
	//- 즉 다른 페이지다
	//- 실행결과가 페이지에 포함된다.
	//- request영역 공유

	//변수 선언
	String actiontagString="액션태그로 삽입된 페이지안에서 선언한 변수";
%>
<hr/>
<h4>ActiontagPage.jsp페이지 입니다</h4>
<ul class="list-unstyled">
	<li>페이지 영역 : <%=pageContext.getAttribute("pageVar") %></li>
	<li>리퀘스트 영역 : <%=request.getAttribute("requestVar") %></li>
	
</ul>

 

 

 

DirectivePage.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- DirectivePage.jsp -->
<%
	//-독립적인 서블릿으로 변환 안됨 
	// 즉 페이지에 삽입되서 서블릿으로 변홤됨으로 같은 페이지다.	

	//변수 선언
	String directiveString="지시어로 삽입된 페이지안에서 선언한 변수";
%>
<hr/>
<h4>DirectivePage.jsp페이지 입니다</h4>
<ul class="list-unstyled">
	<li>페이지 영역 : <%=pageContext.getAttribute("pageVar") %></li>
	<li>리퀘스트 영역 : <%=request.getAttribute("requestVar") %></li>
</ul>

'JSP' 카테고리의 다른 글

[JSP]EL : 내장객체  (0) 2022.05.09
[JSP]Expression Language(EL : 표현언어)  (0) 2022.05.06
[JSP]session  (0) 2022.05.03
[JSP]Cookie로 간단한 쇼핑몰 만들기 예제  (0) 2022.05.03
[JSP]Cookie  (0) 2022.05.03