Undergoing

커스텀 액션 - 태그 파일 본문

개발/Web Development

커스텀 액션 - 태그 파일

Halkrine 2012. 6. 5. 14:38

커스텀 액션을 만드는 방법

- 태그 파일 : 구현 간단함. 웹 컨테이너의 특정 dir에 태그 파일을 저장하면 바로 사용 가능. HTML 중심 구조. 코드 노출 쉬움

- 태그 클래스 : 구현 복잡. 태그 클래스의 소스코드를 컴파일하고, 그 결과로 생긴 클래스 파일(TLD 파일)을 웹 컨테이너의 특정 dir에 설치하고 web.xml에 저장해야 함. 완전한 자바 클래스.


선언 방식 : <%@ tag body-content = "" %>


태그 파일에서 사용할 수 있는 지시자


 이름

 역할

 tag 지시자

 웹 컨테이너가 태그 파일을 처리할 때 필요한 정보를 기술

 include 지시자  다른 태그 파일을 포함

 taglib 지시자

 태그 파일에서 사용할 다른 커스텀 액션의 태그 라이브러리에 대한 정보 기술

 attribute 지시자  커스텀 액션의 애트리뷰트에 대한 정보 기술
 variable 지시자  커스텀 액션의 변수에 대한 정보 기술


.tag 파일을 만든 후 해당 프로젝트의 WEB-INF/tags dir에 저장해야 함. <= tomcat이 아닌 프로젝트 폴더에 넣어도 실행 되는 경우가 있으나, 대개 tomcat에 같이 생성되는 구조라 tomcat 폴더도 신경써줘야 함. 구동이 안 될 경우 tomcat의 WEB-INF 폴더를 확인해야 됨.



태그 파일을 사용하기 위한 커스텀 액션 : <%!taglib prefix = "접두어" tagdir = "태그 파일이 있는 dir" %>


 Lunchmenu.jsp

<%@ page language="java" import="java.util.*" pageEncoding="EUC-KR"%>

<%@ taglib prefix ="util" tagdir = "/WEB-INF/tags"  %>


<html>

  <head>

    <title>오늘의 메뉴</title>

     </head>

  

  <body>

  <h3>오늘의 점심 메뉴입니다</h3>

  <util:line/>

  밥<br/>

  비빔밥<br/>

  된장밥<br/>

  <util:line/>

  </body>

</html> 

 Line.tag

<%@ tag body-content = "empty" %>

------------------------------------------<br> 

 * tag body-content = "empty"의 의미 : 커스텀 액션이 본체를 가질 수 없음

Attribute를 지원하는 태그 파일


 - <%@ attribute name = "attribute의 이름" type = "attribute의 타입%>


 SuperMenu.jsp

<%@ page language="java" import="java.util.*" pageEncoding="EUC-KR"%>

<%@ taglib prefix = "util" tagdir = "/WEB-INF/tags/util" %>


<html>

<head><title>오늘의 메뉴</title></head>

<body>

<util:newLine color = "blue" size = "25" />

저녁 메뉴<br>

<util:newLine color = "red" size = "20" />

국<br>

찌개<br>

탕<br>

<util:newLine color = "blue" size = "25" />

</body>

</html> 

 newLine.tag

<%@tag body-content= "empty" %>

<%@attribute name = "color" %>

<%@attribute name = "size" type = "java.lang.Integer" %>

<FONT color = ${color}>

<%

for(int cnt = 0; cnt < size; cnt++) 

{

out.print("-");

}

%>

</FONT><br> 


* 여기서 tag쪽에서 타이핑 하나 잘못 해서 에러를 냈었는데, 재미있는 건 익스플로러랑 크롬이랑 실행 결과가 달랐다. 크롬은 되도록 원형을 유지하면서 깨졌는데 익스플로러는 오류인 구문 이후부터 소스 코드가 노출되어 버림. 브라우저에 따라 차이를 보이는 코딩을 한 것도 아닐텐데 이상하다.


동적 attribute를 지원하는 태그 파일

- 커스텀 액션의 attribute 각각을 위한 attribute 지시자를 쓰는 대신 모든 attribute를 한꺼번에 선언하여 사용

- <%@tag dynamic-atttributes = "동적 attribute의 대표 이름" %>

- 커스텀 액션은 사용된 모든 attribute의 <이름, 값>을 java.util.Map 객체 안에 저장한 후 그 객체를 태그 파일로 전달. 이는 ${동적 attribute의 이름.실제로 사용된 attribute의 이름} 형식으로 값을 가져올 수 있음

- 커스텀 액션의 attribute 값만 활용하는 방법

 [Map attrs = (Map) jspContext.getAttribute("attrs");]


SatMenu.jsp 

<%@ page language="java" import="java.util.*" pageEncoding="EUC-KR"%>

<%@ taglib prefix = "util" tagdir = "/WEB-INF/tags/util" %>

<html>

<head>

<title>오늘의 메뉴</title></head>

<body>

<h3>오늘은 토요일잉께 간단한 분식만 제공한당께롱</h3>

<util:doubleLine color = "green" size = "30"/>

샌드위치<br/>

우동<bR/>

<util:doubleLine color = "purple" size = "50" />

</body></html> 

DoubleLine.tag 

<%@ tag body-content= "empty" %>

<%@ tag dynamic-attributes = "attrs" %>

<Font color = ${attrs.color}>

<%

java.util.Map attrs = (java.util.Map) jspContext.getAttribute("attrs");

String str = (String) attrs.get("size");

int size = Integer.parseInt(str);

for(int cnt = 0; cnt < size; cnt++)

{

out.print("=");

}

%>


</font><br> 


* 동적 애트리뷰트를 지원하는 태그파일을 작성한다고 해서 커스텀 액션의 사용법이 달라지는 것은 아님. 다만, 동적 애트리뷰트를 지원하는 커스텀 액션은 뭐가 유효한 것인지 일일이 검사하지 않기 때문에 필요없는 애트리뷰트가 사용되더라도 문법 에러가 발생하지 않음. 어떻게 보면 더 유연성이 있어 보임. 동적 애트리뷰트를 지원하지 않는 커스텀 액션은 에러 발생.


커스텀 액션의 본체를 처리하는 태그 파일
- <%@ tag body-content="scriptless" %> : 커스텀 액션의 본체에 스크립틀릿을 쓸 수 없음을 표시

- <%@ tag body-content="tagdependent" %> : 커스텀 액션의 본체에 포함된 스크립틀릿, 익스프레션 언어, 액션이 있는 그대로 본체의 일부로 인식됨


변수를 지원하는 커스텀 액션

- <%@variable name-given = "변수 이름" %>

- NESTED, AT_BEGIN, AT_END : JSP 페이지를 통해 애트리뷰트의 값을 태그 파일이 입력받고 연산하여 다시 JSP 페이지에 결과 전송을 가능하게 해줌. 한 개만 지정 가능

 . NESTED : 커스텀 액션의 본체 안에서만 변수 사용 가능

 . AT_BEGIN : 커스텀 액션의 시작 태그 다음 위치부터 변수 사용 가능

 . AT_END : 커스텀 액션의 끝 태그 다음 위치부터 변수 사용 가능

 EX) <%@variable name-given="result" variable-class="java.lang.Integer" scope = "AT_END" %>


Maximum.jsp 

<%@ page language="java" import="java.util.*" pageEncoding="EUC-KR"%>

<%@ taglib prefix = "util" tagdir = "/WEB-INF/tags/util" %>

<html>

<head>

<title>최대값 구하기</title>

<body>

<h3>최대값 구하기</h3>

<util:max num1 = "${param.NUM1}" num2 = "${param.NUM2}"/>

최대값 : ${maximum}</body></head></html>  
max.tag

<%@ tag pageEncoding = "euc-kr" %>

<%@ tag body-content="empty"%>

<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core"%>

<%@ attribute name = "num1" type = "java.lang.Integer"%>

<%@ attribute name = "num2" type = "java.lang.Integer"%>

<%@ variable name-given = "maximum" variable-class= "java.lang.Integer" scope="AT_END" %>


<%

int result;

if(num1 > num2) result = num1;

else result = num2;

%>


<c:set var = "maximum" value = "<%=result %>" /> 


- 이렇게 할 경우 커스텀 액션의 결과를 리턶사는 maximum 변수의 이름이 태그 파일 안에 고정됨. 이 문제를 해결하려면 애트리뷰트를 이용해서 다음과 같이 변수의 이름을 지정해줌

 [ <util:max var="maximum" num1 = "25" num2 = "51" />]

 [ <%@attribute name = "var" required = "true" rtexprvalue = "false" %>] => 필수 애트리뷰트임을 표시. 애트리뷰트 값으로 스크립팅 요소나 익스프레션 언어를 사용할 수 없음을 표시

[ <%@variable name-from-attribute="var" alias = "maximum" variable-class ="java.lang.Integer" scope="AT_END" %>] => 커스텀 액션에서 변수 이름을 지정할 때 사용할 애트리뷰트 이름은 var, 태그 파일 안에서 사용할 변수 이름은 maximum



'개발 > Web Development' 카테고리의 다른 글

[struts] xml에 있는 값 불러오기  (0) 2012.08.31
web.xml 거치지 않고 Servlet 내에서 해결하기  (0) 2012.08.28
JSTL  (0) 2012.06.01
Standard Action  (0) 2012.05.31
Expression Language  (0) 2012.05.18