본문 바로가기

JSP

[JSP]JSP의 지시자와 액션태그

JSP 지시자

  • 클라이언트의 요청에 JSP 페이지가 실행이 될 때 필요한 정보를 JSP 컨테이너에게 알리는 역할
  • 태그 안에서 @로 시작하며 page, include, taglib 세가지 종류가 있다.
  • page : JSP 페이지에서 지원되는 속성들을 정의하여 JSP 컨테이너에게 해당 페이지의 처리방식에 대한 정보를 제공
  • inlucde : JSP페이지 내에 다른 JSP조각페이지를 삽입할 수 있다.
  • taglib : JSP페이지 내에 사용될 라이브러리를 접두사를 지정해 사용을 할 수 있게한다.

JSP 액션태그

  • 어떤 동작 또는 액션이 일어나는 시점에 페이지와 페이지 사이의 제어를 이동시키는 목적으로 사용된다.
  • 자바 빈즈의 기능을 사용할 수 있도록 해주며, include, forward, plug-in, useBean등의 태그가 존재한다.
  • XML에 기반한 구문 형식을 갖는다.
  • include : JSP페이지 내에 다른 JSP페이지의 렌더링된 결과를 삽입할 수 있다. flush속성은 포함될 페이지로 이동시 현재 페이지가 지금까지 출력 버퍼에 저장한결과를 어떻게 처리할 것인가를 결정하며, true일 경우 포함할 페이지의 내용을 삽입하기 이전에 현재 페이지가 지금까지 버퍼에 저장한 내용을 출력하게된다. 또한 포함달 JSP페이지에 새로운 요청 파라미터를 추가적으로 지정할 수 있다.
  • forward : 다른 페이지로 이동할 떄 사용되는 태그로 해당 태그를 만나면 forward 태그가 있던 JSP 페이지의 모든 내용을 버리고 지정한 다른 페이지로 이동한다. 따라서 사용자가 입력한 값의 조건에 의해 여러 페이지로 이동해야 할 경우에 사용될 수 있으며, 절대경로, 상대경로를 동적으로 지정이 가능하다.
  • plug-in : 자바 플러그인을 사용하여 JSP 페이지내에서 자바 애플릿을 사용할 때 사용한다. JSP 컨테이너는 해당 액션태그를 브라우저에서 인식할 수 있는 태그로 변환하여 브라우저가 자바 플러그인을 이용하여 자바 애플릿을 실행하도록 만든다.
  • useBean : 자바빈지와 통신을 위해 구현한 액션태그로, setPropery, getPropery 액션태그와 함께 사용된다.
  • 해당 태그 이외에 스크립트 요소나 지시자를 액션태그로 사용가능한 대체태그들이 있으나 장점이 없어 잘 사용되지 않는다. 또한 useBean은 JSP Model1 방식을 사용할때 사용되기 때문에 현재에 와서는 잘 사용되지 않는다.

 

지사자의 include와 액션태그의 include의 차이점

지시자의 include 방식

액션태그의 include 방식

  • 지시자의 include는 단순하게 소스의 내용이 텍스트로 JSP페이지에 포함이 되지만, 액션태그의 include는 포함시킬 페이지의 처리 결과를 포함시킨다는 점이 다르다.
  • 또한 액션태그의 include는 page를 통해 URL을 참조하며 새로운 요청 파라미터를 추가할 수 있으나, 지시자의 include는 file을 통해 URL을 참조하고, 요청 파라미터의 추가가 불가하다.
  • 지시자의 Include는 정적, 액션 태그의 Include는 동적 처리를 한다 볼 수 있다.

예제

  • action태그와 지시자를 이용해 다른 두개의 페이지를 합칠 페이지로 출력결과가 된다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>add fragment page</title>
</head>
<body>
	<% request.setAttribute("param", "param"); %>

	<%@include file="directivePage.jsp" %>
	<jsp:include page="actionPage.jsp">
		<jsp:param name="addParam" value="include" />
	</jsp:include>
</body>
</html>
  • 지시자의 HTML 페이지
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Directive Page</title>
</head>
<body>
	<% String param = request.getParameter("param"); %>
	<h1>Directive Page</h1>
	<div><%= param %></div>
</body>
</html>
  • 액션태그의 HTML페이지
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Action Page</title>
</head>
<body>
	<%
		String addParam = request.getParameter("addParam");
	%>
	<h1>Action page</h1>
	<div>${ requestScope.param }</div>
	<div><%= addParam %></div>
</body>
</html>

출력결과

  • 지시자 태그의 include는 정적페이지를 가져와 취합하는 방식이기 때문에 호출페이지의 인자를 전달받을 수 없다.
  • 반면에 액션 태그의 include는 호출페이지에서 포함될 페이지에게 요청을 보내 렌더링된 결과를 가져와 취합하는 방식이기 때문에 인자를 전달할 수 있으며, param액션태그를 통해 추가적인 파라미터의 전달또한 가능하다.
  • 즉 지시자 태그의 include는 정적 페이지의 성격을 갖으며, 액션 태그의 include는 동적 페이지의 성질을 갖게된다.

  • 그러나 이 둘은의 공통점으로는 요청에 해당되는 JSP페이지를 그대로 삽입하는 것이기 때문에 html페이지 내에 html 페이지가 삽입된다는 점을 주의해야한다.

  • .따라서 출력결과만을 얻고싶다면 아래와같이 삽입되는 페이지의 코드를 수정해줘야한다.
  • 본문에 포함될 내용만을 남기고 나머지 태그들을 지워주면 된다.
<% String param = request.getParameter("param"); %>
<h1>Directive Page</h1>
<div><%= param %></div>
<% String addParam = request.getParameter("addParam"); %>
<h1>Action page</h1>
<div>${ requestScope.param }</div>
<div><%= addParam %></div>
  • 이후 다시 출력을 해보면 출력결과는 동일하나, 소스보기에서 하나의 html 페이지로 출력이 되는것을 확인할 수 있다.

 

Forward 액션태그

  • 그렇다면 Forward 액션태그는 어떻게 동작할까?
  • 위 예제의 메인 페이지에 추가해보자
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>add fragment page</title>
</head>
<body>
	<% request.setAttribute("param", "param"); %>

	<%@include file="directivePage.jsp" %>
	<jsp:include page="actionPage.jsp">
		<jsp:param name="addParam" value="include" />
	</jsp:include>
	
	<jsp:forward page="forwardPage.jsp" />
</body>
</html>
  • 그리고 forward 대상이 될 jsp 페이지를 작성해보자
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Forward Page</title>
</head>
<body>
	<% String param = request.getParameter("addParam"); %>
	<h1>forward Page</h1>
</body>
</html>

실행결과

  • 해당 페이지에서 모든 페이지의 실행이 취소되고, 해당 forward액션태그의 JSP페이지로 이동된다.
  • 여기서 주목할점은 URL이다 분명 forward를 통해 page를 이동했음에도 불구하고 URL상에는 newPage.jsp에 있다고 알려준다.

 

Forward와 Redirect에 대해 포스팅한 글을 통해 왜 이런 동작이 일어났나 알아보자

https://tatsu.tistory.com/entry/JSPForward%EC%99%80-Redirect%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

[JSP]Forward와 Redirect의 차이

Forward와 Redirect Forward와 Redirect는 작업 중이 페이지가 전환된다는 점에서 비슷한 역할을 하지만, 이 둘 사이에는 페이지를 전환하는 주체가 다르다는 큰 차이점이 존재하며, 이로인해 동작에 큰

tatsu.tistory.com

 

'JSP' 카테고리의 다른 글

[JSP] Java Beans와 JSP 빈즈태그  (0) 2023.03.15
[JSP] 내부객체  (0) 2023.03.15
[JSP]JSP의 스크립트 요소  (0) 2023.03.14
[JSP]Model1, Model2  (0) 2023.03.14
[JSP]JSP의 개념  (0) 2023.03.14