액션 태그 : 상품 목록 표시하기
chapter4-1
액션 태그 : 상품 목록 표시하기
01. 액션 태그의 개요
액션태그는 서버나 클라이언트에게 어떤 행동을 하도록 명령하는 태그로 스트립트 태그, 주석, 디렉티브 태그와 함께 jsp 페이지를 구성하는 태그이다. 액션 태그는 jhp페이지에서 페이지와 페이지 사이를 제어하거나, 다른 페이지의 실행 결과 내용을 현재 페이지에 포함하거나, 자바 빈즈(javaBeans)등의 다양한 기능을 제공한다.
액션 태그에는 다양한 종류가 있으며, <%….%>와 같은 스크립트 태그의 형식을 따르지 않고 XML 형식 <jsp: …/>을 사용한다. 액션태그는 반드시 끝나는 태그 />로 마무리 해야한다.
액션태그의 종류
액션 태그 형식 설명
forward | <jsp:foward …./> | 다른 페이지로의 이동과 같은 페이지 흐름을 제어한다. |
include | <jsp:include …./> | 외부 페이지의 내용을 포함하거나 페이지를 모듈화 한다. |
useBean | jsp:useBean…./ | JSP 페이지에 자바빈즈를 설정한다. |
setProperty | jsp:setProperty…./ | 자바빈즈의 프로퍼티 값을 설정한다. |
getProperty | jsp:getProperty…./ | 자바빈즈의 프로퍼티 값을 얻어온다. |
param | jsp:param…./ | jsp:forward,jsp:include,jsp:plugin태그에 인자를 추가한다. |
plugin | jsp:plugin…./ | 웹 브라우저에 자바 애플릿을 실행한다. 자바 플러그인에 대한 OBJECT 또는 EMBED 태그를 만드는 브라우저별 코드를 생성한다. |
element | jsp:element…./ | 동적 XML 요소를 설정한다. |
attribute | jsp:attribute…./ | 동적으로 정의된 XML 요소의 속성을 설정한다. |
body | jsp:body…./ | 동적으로 정의된 XML요소의 몸체를 설정한다. |
text | jsp:text…./ | jsp 페이지 및 문서에서 템플릿 텍스트를 작성한다. |
여기서 주요 액션태그 forward, include, param, useBean, setProperty, getProperty 에대해서 알아보자.
02. forward 액션 태그의 기능과 사용법
forward 액션 태그는 현재 jsp 페이지에서 다른 페이지로 이동하는 태그로 형식은 다음과 같다.
jsp 컨테이너는 현재 jsp 페이지에서 froward액션 태그를 만나면 그 전까지 출력 버퍼에 저장되어 있던 내용을 모두 삭제한다. 그리고 forward 액션 태그에 설정된 페이지로 프로그램의 제어가 이동한다.
<jsp:forward page="파일명" /> //반드시 끝나는 태그가 있어야 함
또는
<jsp:forward page="파일명"> </jsp:forward>
여기서 page 속성 값은 현재 jsp 페이지에서 이동할 페이지의 외부 파일명이다. 이때 외부 파일은 현재 jsp 페이지와 같은 디렉터리에 있으면 파일명만 설정하고, 그렇지 않으면 전체 URL(또는 상대 경로)를 설정 해야 한다.
다음은 웹 브라우저의 주소란에 first.jsp 를 요청하면 jsp 컨테이너가 first.jsp 를 실행하다가 forward 액션태그 jsp:forward를 만나서 이 태그의 page 속성 값인 second.jsp 로 이동하는 예 이다.
[forward 액션 태그 사용 예 ] first.jsp
<%@ page contentType="text/heml; charset=utf-8" %>
<html>
<head>
<title>Action Tag</title>
</head>
<body>
<h3>이 파일은 first.jsp입니다.</h3>
<jsp:forward page="second.jsp"/>
<p>=====first.jsp 페이지 ========
</body>
</html>
<%@ page contentType="test/heml; charset=utf-8" %>
<html>
<head>
<title>Action Tag</title>
</head>
<body>
<h3>이 파일은 second.jsp입니다.</h3>
Today is : <%=new java.util.Date() %>
</body>
</html>
결과:
이 파일은 second.jsp입니다.
Today is : Sat Aug 12 00:48:16 KST 2023
웹 브라우저의 실행 결과를 보면 다음과 같이 처음에 요청한 URL 인 first.jsp 파일의 내용은 없고 second.jsp 파일의 내용만 있다. 하지만 웹 브라우저의 주소란은 처음에 요청한 first.jsp 이다. 이때 second.jsp 는 반드시 first.jsp 와 동일한 디렉터리에 있어야 한다. 그렇지 않으면 second.jsp 가 위치한 전체 경로를 지정해야 한다.
foward 액션 태그의 페이지 흐름 처리 과정
- 웹 브라우저에서 웹 서버로 frist.jsp 를 요청한다.
- jsp 컨테이너는 요청된 first.jsp 를 실행한다.
- first.jsp 를 실행하다가 forward 액션 태그를 만나면 지금까지 저장된 출력 버퍼의 내용을 삭제하고 프로그램 제어를 page 속성에서 설정한 second.jsp 로 이동한다(포워딩).
- second.jsp 를 실행한다.
- jsp 컨테이너는 second.jsp를 실행한 결과를 웹 브라우저에 응답으로 보낸다.
💡 forward 액션 태그 사용 시 주의점
웹 서버는 foward 액션 태그를 수행할 때 출력 버퍼를 지우므로 현재 페이지에서 forward 액션 태그가 선언된 지점 이전까지 생성된 HTML 코드가 손실된다. 그러나 현재페이지가 이미 전달 버퍼로 채워진 경우에는 전달이 중단될때까지 해당 내용을 웹 서버에서 응답으로 보낸다. 이렇게 하면 잘못된 페이지가 클라이언트로 전송될 수 있다. 따라서 큰 출력을 생성하는 페이지에서 forward 액션 태그를 호출할 때는 신중을 가해야 한다.
[forward 액션 태그로 현재 날짜와 시각을 출력하는 페이지로 이동하기 ] JSPBook/WebContent/ch04/forward.jsp
<%@ page contentType="text/heml; charset=utf-8"%>
<html>
<head>
<title>Action Tag</title>
</head>
<body>
<h2>forward 액션 태그</h2>
<jsp:forward page="forward_date.jsp"></jsp:forward>
<p>------------------------------
</body>
</html>
JSPBook/WebContent/ch04/forward_date.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Action Tag</title>
</head>
<body>
<p>오늘의 날짜 및 시간
<p><%=(new java.util.Date()).toLocaleString() %>
</body>
</html>
결과:
오늘의 날짜 및 시간
2023. 8. 12. 오전 1:15:19
💡 액션 태그를 사용하는 이유
액션태그는 스크립트 태그와 마찬가지로 jsp 페이지에서 자바코드를 삽입할 수 있는 태그이다. 액션 태그는 스크립트 태그를 이용하여 jsp 페이지에 직접 자바 코드를 작성하는 것을 피하기 위해 사용한다. 즉 jsp 페이지를 작성할 때 자바코드의 삽입을 되도록 최소화하여 유지 보수를 효율적으로 하는 것이 그 목적 이다.
03. include 액션 태그의 기능과 사용법
include 액션 태그는 include 디렉티브 태그처럼 현재 jsp 페이지의 특정 영역에 외부 파일의 내용을 포함하는 태그로 형식은 다음과 같다. 현재 jsp 페이지에 포함할 수 있는 외부 파일은 HTML, JSP , 서블릿 페이지 등이다.
<jsp:include page="파일명" flush="false"/>
여기서 page 속성 값은 현재 jsp 페이지 내에 포함할 내용을 가진 외부 파일명이다. 이때 외부파일은 현재 jsp 페이지와 같은 디렉터리에 있으면 파일명만 설정하고, 그렇지 않으면 전체 URL 또는 상대 경로를 설정해야 한다. flush 속성 값은 설정한 외부 파일로 제어가 이동할 때 현재 jsp 페이지가 지금까지 출력 버퍼에 저장한 결과를 처리한다. 기본값은 false 이고, true 로 설정하면 외부 파일로 제어가 이동할 때 현재 jsp 페이지가 지금까지 출력 버퍼에 저장된 내용을 웹 브라우저에 출력하고 출력 버퍼를 비운다.
💡 flush 속성 값
일반적으로 flush 속성은 false 로 지정하는 것이 좋다. true 로 지정하면 일단 출력 버퍼를 웹 브라우저에 전송하는데 이때 헤더 정보도 같이 전송된다. 헤더 정보가 웹 브라우저에 전송되고 나면 헤더 정보를 추가해도 결과가 반영되지 않는다.
include 액션 태그는 forward 액션 태그처럼 외부 파일을 포함한다는 점이 비슷하지만 포함된 외부 파일이 실행된 후 현재 jsp 페이지로 제어를 반환한다는 것이 가장 큰 차이점이다. 또한 jsp 컨테이너는 현재 jsp 페이지에서 include 액션 태그를 만나면 include 액션 태그에 설정된 외부 파일의 실행 내용이 현재 jsp 페이지의 출력 버퍼에 추가 저장되어 출력된다.
다음 예에서는 웹 브라우저의 주소란에 first.jsp 를 요청하면 jsp 컨테이너가 first.jsp 를 실행하다가 include 액션 태그를 만나면 이 태그의 page 속성 값인 second.jsp 로 이동한다. 그리고 second.jsp 가 실행되면 first.jsp 로 제어를 반환 한다.
<%@ page contentType="text/html; charset=utf-8" %>
<html>
<head>
<title>Action Tag</title>
</head>
<body>
<h3>이 파일은 first.jsp입니다.</h3>
<jsp:include page="second.jsp" flush="false"/>
<p>Java Server Page</p>
</body>
</html>
<%@ page contentType="text/heml; charset=utf-8" %>
<html>
<head>
<title>Action Tag</title>
</head>
<body>
<h3>이 파일은 second.jsp입니다.</h3>
Today is : <%=new java.util.Date() %>
</body>
</html>
출력결과:
이 파일은 first.jsp입니다.
이 파일은 second.jsp입니다.
Today is : Sat Aug 12 01:32:19 KST 2023
Java Server Page
웹 브라우저의 실행 결과를 보면 처음에 요청한 URL 인 first.jsp 파일의 내용와 second.jsp 파일의 내용이 모두 있다. 하지만 웹 브라우저 주소란은 처음에 요청한 first.jsp 이다, 이때 second.jsp 는 반드시 frirst.jsp 와 동일한 디렉터리에 있어야 한다. 그렇지 않으면 second.jsp 가 위치한 전체 경로를 지정해야 한다.
include 액션 태그의 처리 과정
- 웹 브라우저에서 웹 서버로 first.jsp를 요청한다.
- jsp 컨테이너는 요청받은 first.jsp 를 처리하고 first.jsp내의 출력 내용이 출력 버퍼에 저장된다.
- 이때 <jsp:include page=”second.jsp” flush=”false”/>문장을 만나면 하던 작업을 멈추고 프로그램 제어를 second.jsp 로 이동한다.
- second.jsp 를 실행하고 second.jsp 내의 출력 내용이 출력 버퍼에 저장된다.
- second.jsp 의 처리가 끝나면 다시 first.jsp 로 프로그램의 제어가 이동하는데, 이동 위치는 <jsp:include page=”second.jsp” flush=”false”/>문장의 다음 행이 된다.
- first.jsp 의 나머지 부분을 처리하고, 출력할 내용이 있으면 출력 버퍼에 저장한다.
- jsp 컨테이너는 출력 버퍼의 내용을 웹 브라우저에 응답으로 보낸다.
💡 include 액션 태그와 include 디렉티브 태그의 차이
include 액션 태그와 include 디렉티브 태그는 현재 jsp 페이지에 다른 페이지를 포함하는 기능을 제공한다는 점이 비슷해 보인다. 그러나 include 디렉티브 태그는 단순하게 다른 페이지의 내용이 텍스트로 포함되지만 include 액션 태그는 다른 페이지의 처리 결과 내용을 포함한다.
구분 include 액션 태그 include 디렉티브 태그
처리시간 | 요청 시 자원을 포함한다. | 번역 시 자원을 포함한다 |
기능 | 별도의 파일로 요청 처리 흐름을 이동한다 | 현재 페이지에 삽입한다 |
데이터 전달방법 | request 기본 내장 객체나 param액션 태그를 이용하여 파라미터를 전달한다 | 페이지 내의 변수를 선언한 후 변수에 값을 저장한다 |
용도 | 화면 레이아웃의 일부분을 모듈화할 때 주로 사용한다. | 다수의 jsp 웹 페이지에서 공통으로 사용되는 코드나 저작권과 같은 문장을 포함하는 경우에 사용한다 |
기타 | 동적 페이지에 사용한다 | 정적 페이지에 사용한다 |
[include 액션 태그에 현재 날짜와 시각을 출력하는 페이지 포함하기]
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Action Tag</title>
</head>
<body>
<h2>include 액션 태그</h2>
<jsp:include page="include_date.jsp"></jsp:include>
<p>------------------------------
</body>
</html>
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Action Tag</title>
</head>
<body>
<p>오늘의 날짜 및 시간
<p><%=(new java.util.Date()).toLocaleString() %>
</body>
</html>
출력결과:
include 액션 태그
오늘의 날짜 및 시간
2023. 8. 12. 오전 1:50:17
------------------------------
04. param 액션 태그의 기능과 사용법
param 액션 태그는 현재 jsp 페이지에서 다른 페이지에 정보를 전달하는 태그로 형식은 다음과 같다. 이 태그는 단독으로 사용되지 못하며 jsp:forward 나 jsp:include태그의 내부에 사용된다. 또한 다른 페이지에 여러 개의 정보를 전송해야 할 때 는 다중의 param 액션 태그를 사용 할 수 있다.
<jsp:forward page="파일명">
<jsp:param name="매개변수명1" value="매개변수값1" />
[<jsp:param name="매개변수명2" value="매개변수값2"/> ....]
</jsp:forward>
[jsp:param 액션 태그 사용 예]
<%@ page contentType="text/html; charset=utf-8" %>
<html>
<head>
<title>Action Tag</title>
</head>
<body>
<h3>이 파일은 first.jsp입니다.</h3>
<jsp:include page="second.jsp">
<jsp:param name="date" value="<%=new java.util.Date() %>" />
</jsp:include>
<p>Java Server Page</p>
</body>
</html>
<%@ page contentType="text/html; charset=utf-8" %>
<html>
<head>
<title>Action Tag</title>
</head>
<body>
<h3>이 파일은 second.jsp입니다.</h3>
Today is :<%=request.getParameter("date")%>
</body>
</html>
결과 출력:
이 파일은 first.jsp입니다.
이 파일은 second.jsp입니다.
Today is :Sat Aug 12 01:59:25 KST 2023
Java Server Page
[forward 액션 태그와 param 액션 태그에 아이디와 이름 전달하기]
<%@ page contentType="text/html; charset=utf-8" %>
<html>
<head>
<title>Action Tag</title>
</head>
<body>
<h3>param 액션 태그</h3>
<jsp:forward page="param01_date.jsp">
<jsp:param name="id" value="admin"/> //매개변수 id 와 값을 전송하기 위해 param 액션태그를 작성
<jsp:param name="name" value='<%=java.net.URLE ncoder.encode("관리자") %>'/> //한글이 깨지지 않도록 쓴 메소드
</jsp:forward>
<p>Java Server Page</p>
</body>
</html>
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Action Tag</title>
</head>
<body>
<p>아이디 : <%=request.getParameter("id") %> //전송된 id값과 name값을 받도록 request 내장 객채의 getParameter()메소드를 작성
<%
String name = request.getParameter("name");
%>
이 름 : <%=java.net.URLDecoder.decode(name) %>
</p>
</body>
</html>
출력 결과:
아이디 : admin 이 름 : 관리자
[include 액션 태그와 param 액션 태그에 제목과 현재 날짜 전달하기]
<%@ page contentType="text/html; charset=utf-8" %>
<html>
<head>
<title>Action Tag</title>
</head>
<body>
<h3>param 액션 태그</h3>
<jsp:include page="param02_date.jsp">
<jsp:param value='<%=java.net.URLEncoder.encode("오늘의 날짜와 시각") %>' name="title"/>
<jsp:param name="date" value="<%=java.util.Calendar.getInstance().getTime() %>"/>
</jsp:include>
</body>
</html>
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Action Tag</title>
</head>
<body>
<%
String title = request.getParameter("title");
%>
<h3><%=java.net.URLDecoder.decode(title) %></h3>
Today is :<%=request.getParameter("date") %>
</body>
</html>
출력결과:
param 액션 태그
오늘의 날짜와 시각
Today is :Sat Aug 12 02:22:30 KST 2023