[JSP] 액션태그
개요
JSP 액션 태그는 클라이언트 혹은 서버에게 어떠한 작동을 행하도록 명령을 내리는 태그다.
크게 JSP 페이지 안에서 자바빈즈를 사용할 수 있도록 하는 액션태그와 페이지를 활용 할 수 있도록 하는 액션태그로 나눌 수 있다.
Syntex 1
<jsp:tag attribute="value"/>
Syntex 2:
<jsp:tag attribute1="value1">
<jsp:param name="paramName" value="paramValue"/>
</jsp:tag>
JSP 액션 태그는 JSP 태그 형식을 따르지 않고 XML형식을 따른다. 그러므로 시작 태그가 있으면 반드시 끝나는 태그가 있어야 한다. 그리고 액션 태그는 접두어 jsp:
이 붙어서 <jsp:
으로 시작해야 한다. 액션태그에 속성 값만 지정하고 내용이 없을 경우에는, XML규칙에 의해 끝나는 태그를 따로 하지 않고 시작 태그의 마지막 부분을 />
으로 마무리 한다.
param
<jsp:param>
태그는 요청한 페이지로 정보를 전달할 때 사용하는 태그로 현재 페이지에서 요청한 페이지로 인자(parameter)와 인자 값(value) 형태로 넘겨준다.
<jsp:param name="paramName" value="var"/>
name
: 포함되는 JSP 페이지에 전달할 파라미터의 이름을 표시value
: 전달할 파라미터의 값을 표시. 이때 value 속성의 값으로 표현식을 사용가능
이 태그는 단독으로는 사용하지 못하고 <jsp:include>
나 <jsp:forward>
태그의 내부에 기술하여 사용한다.
forward
클라이언트의 요청을 포워딩한다.
<jsp:forward page="포워딩 할 페이지 URL"/>
<jsp:forward page="/view.jsp" />
<% String url = "/to.jsp";%>
<jsp:forward page="<%=url%>" />
page 속성에는 이동할 페이지의 URL을 기술하며 page 속성의 값인 이동할 페이지명은 웹 애플리케이션 상대경로나 웹 애플리케이션 절대경로로 지정할 수 있고, 표현식도 사용할 수 있다.
<jsp:param>
태그로 프로그램의 제어가 이동할 페이지에 파라미터 값을 전달할 수 있으며 전달받은 값은 request.getParameter("파라미터 이름")
로 넘겨받는다.
<jsp:forward page="이동할 페이지" >
<jsp:param name="paramName1" value="var1"/> <jsp:param name="paramName2" value="var2"/>
</jsp:forward>
여기서 name은 JSP 페이지에 전달할 파라미터의 이름, value는 파라미터의 값을 표시한다. value는 표현식 사용가능. 이 방법은 단순히 page 속성에 지정된 페이지로 이동할 것이 아니라 이동할 페이지에 자신의 정보를 파라미터 형식으로 전달 할 수 있다.
page의 값을 파일 경로가 아닌 URL로 설정할 경우, 그러니까 파일 경로 대신 /product/product
, /main.do
와 같은 URL을 사용할 경우 스프링 인터셉터가 두 번 작동하는 현상이 있으니 주의할 것.
include
<jsp:include page="url" flush="false"/>
page
: 현재 페이지에 결과가 포함될 페이지 명url
: 포함될 페이지flush
: 기본값은 false. 포함될 페이지로 이동할 때 현재 페이지가 지금까지 출력 버퍼에 저장한 결과를 어 떻게 처리 할 것인가를 결정하며flush
속성의 값은false
로 지정하는 것이 좋다.flush
속성의 값을true
로 지정하면 일단 출력버퍼의 내용을 웹 브라우저에 전송하게 되는데 이때 헤더정보도 같이 전송된다. 헤더정보가 일단 웹 브라우저에 전송이 되고나면 헤더정보를 추가해도 결과가 반영되지 않는다.
include 디렉티브<%@include%>
가 컴파일 되기 이전의 소스를 하나의 jsp문서에 포함하는 반면 <jsp:include>
액션태그는 각각 컴파일 후 그 결과만을 포함한다.
포함되는 페이지는 html, jsp, Servlet 페이지 모두 가능 하며 include 디렉티브는 주로 조각코드를 삽입할 때 사용되고, <jsp:include>
액션 태그는 페이지를 모듈화 할 때 사용된다. 즉, 템플릿 페이지 를 작성할 때 사용한다.
디렉티브 include와 달리 각각 다른자바파일로 존재하기 때문에 스크립릿에서는 다른 지역으로 간주한여 지역변수를 공유할 수 없다.
따라서 부모 jsp에서 include된 jsp에 값을 전달해야 한다면 아래 예와 같이 <jsp:param>
을 이용하여 처리한다.
주의: <jsp:include>
로 불러온 jsp가 모델이 다를거라고 생각할 수 있는데 그렇지 않다. include는 어디까지나 같은 응답처리 내에서 발생하며 요청 역시 반복발생하지 않으니 전송되는 결과값은 같은 request 객체를 사용하기 때문이다.
예를 들어 parent.jsp에서 child.jsp를 include할 때 컨트롤러는 parent.jsp에 ${dataList}
를 넘겨줬다고 하고 이것을 child.jsp에에서 출력한다고 가정하자. 이때 parent.jsp에서 <jsp:include>
코드를 작성하면서 <jsp:param>
으로 넘겨주지 않아도 childe.jsp는 이 값에 접근할 수 있다. include된 jsp와 부모페이지는 모두 같은 scope에 해당하기 때문이다.
<jsp:include page="url" flush="false">
<jsp:param name="paramName1" value="var1"/>
<jsp:param name="paramName2" value="var2"/>
</jsp:include>
상단, 좌측메뉴, 하단의 경우 같은 내용을 표시해야 하는 경우가 많고, 주로 중앙부분의 내용만 계속 바뀌게 된다. 여기서 하단을 같은 구성으로 유지한다고 하면 다음처럼 작성한다:
<div id="header">상단</div>
<div id="left">좌측</div>
<div id="center">중앙</div>
<div id="footer">
<jsp:include page="root/footer.jsp" flush="false"/>
</div>
이런 식으로 페이지의 일부분을 모듈화화면 중복되는 페이지만 수정해도 모든 페이지가 수정된 것과 같은 효과를 주며 사이트의 유지 보수가 쉬워진다.
URL
JSP 파일명만의 경우 test.jsp와 같이 JSP 파일명만을 기술했을 경우는 include JSP 페이지와 같은 디렉터리의 test.jsp를 include한다.
sub/test.jsp
와 같이 디렉터리명/파일명
형식으로 기술하면 include 원 JSP 페이지 의 디렉터리를 기점으로서 서브 디렉터리 sub의 test.jsp를 include 한다.
/sub/test.jsp
처럼 /
로 시작하면 Web 애플리케이션의 contextpath를 기점으로 한 상대경로를 의미한다. 즉, http://localhost:8080/study
의 가상 경로가 웹 애플리케이션 폴더라면 /
는 http://localhost:8080/study
까지다.
하지만 다음처럼:
/p1.jsp
/a/p2.jsp
/a/b/p3.jsp
p1.jsp 페이지에서 <jsp:include page="a/p2.jsp" />
하고 /a/p2.jsp
페이지에서 <jsp:include page="b/p3.jsp" />
한 경우 /p3.jsp
는 p2.jsp를 기점으로 한 상대 URL로 /a/b/p3.jsp
페이지를 include 한다.
만약 p1.jsp 페이지에서 <%@include file="a/p2.jsp" %>
하고 /a/p2.jsp
페이지에서 <%@ include page="b/p3.jsp" %>
한 경우에는 의미가 다르다. <%@ include>
는 2개의 JSP를 1개의 JSP에 조합하는 기능이 있어서 상대경로인 b/p3.jsp
의 기점은 p1.jsp 페이지가 되어 있는 /b/p3.jsp
페이지를 include 하여 에러가 발생 한다.
useBean
자바 객체를 생성하거나 기존에 만들어진 객체를 반환한다.
Syntex 1
<jsp:useBean id="name" scope="page|request|session|application" typeSpec />
Syntex 2
<jsp:useBean id="name" scope="page | request | session | application" typeSpec>
<jsp:setProperty name="bean_Name" prop_expr />
<%-- 스크립릿을 이용하여 다른 속성 값을 호출하는 함수를 호출할 수 있다. --%>
</jsp:useBean>
id
: 객체 인스턴스를 식별하는 이름으로 대소문자를 구별하며 한번 생성된 Bean이 소멸 할 때까 지 같은 Id를 중복해서 사용할 수 없다scope
: 객체의 참조 범위. default는 page-
typeSpec
:class="class_Name"
class="class_Name" type="type_Name"
type="type_Name" class="class_Name"
beanName="bean_Name" type="type_Name"
type="type_Name" beanName="bean_Name"
type="type_Name"
class
: 완전한 형태의 클래스 이름으로beanName
이 정의되어 있지 않으면 반드시 정의 되어야 한다.beanName
:java.bean.Beans
클래스의instantiate()
의 메서드에 사용할 빈의 이름으로type
과beanName
을 지정한 경우에는class
속성을 생략할 수 있다.class
를 안 쓸 경우 사용한다. 내부적으로 컨테이너는id
와scope
를 이용해서 객체를 찾는다. 만일 찾지 못하면 현재 클래스로더로instantiate()
메서드를 호출하는데, 이때 빈의 이름을 인자로 넣는다. 이 인스턴스가 실패하면 예외가 발생한다.type
: 클래스의 타입을 지정하는 생략 가능한 속성으로, 객체가 이 속성으로 지정된 타입이 아니 면ClassCastException
이 발생한다.
setProperty
<jsp:setProperty>
액션은 자바빈에 속성 값을 할당 한다. name 속성에 기술된 이름에 해당하는 빈 클래스는 <jsp:useBean>
을 이용해서 이 태그가 사용되기 전에 미리 정의되어 있어야 한다.
<jsp:setProperty name="beanName" prop_expr />
name
:<jsp:useBean>
태그에 의해 정의된 빈 인스턴스의 이름-
prop_expr
:property="*"
property="property_Name"
property="property_Name" param="parameter_Name"
property="property_Name" value="property_Value"
property
: 값을 설정하고자 하는 빈 속성의 이름으로*
로 설정 시 ServletRequest 안의 모든 인자들 중 빈 속성과 데이터 타입이 일치하는 것을 찾아 각각의 속성들을 각각의 인자 들의 값으로 설정한다. 빈 값인 경우 속성은 변하지 않는다.param
: 빈 속성에 설정하고자 하는 값을 파라미터에서 지정하고자 할 경우 사용한다.value
: 빈 속성에 설정할 값을 지정하며 하나의 jsp:setProperty 태그가 param과 value 를 동시에 가질 수 없다.
getProperty
빈의 속성 값을 얻는데 사용 하며 빈 속성 값을 얻어 String으로 변환 후 출력스트림으로 보낸다.
<jsp:getProperty name="name" property="property_Name" />
name
: 속성을 얻고자 하는 빈 인스턴스의 이름property
: 얻고자 하는 속성의 이름