본문 바로가기

Programming/JSP

자바 정적메소드를 EL(익스프레션언어)함수로 등록하는 방법


- 등록할 파일 : TLD 파일(ex : 웹어플리케이션/web-app/WEB-INF/tld/math-functons.tld)

 

- TLD 파일의 골격(TLD 파일 생성하기)

<taglib xmlns="http://java.sun.com/xml/ns/javaee" version="2.1">

                                (TLD 문법의 식별자)                (TLD 문법의 버전)

<tlib-version>1.0</tlib-version> -> 태그 라이브러리의 버젼

<short-name>math</short-name> -> 태그 라이브러리의 이름

<function>

<name>squareroot</name> ->  EL 함수의 이름(나름대로 정한 EL 함수의 명칭)

<function-class>java.lang.Math</function-class> -> 자바 정적메서드(static method)가 속하는 클래스 풀네임

<function-signature>double sqrt(double)</function-signature> -> 정적 메서드의 시그니처

</function>

</taglib>

 

- TLD 파일 생성을 하여도 바로 호출할 수 없다. web.xml 파일에 TLD 파일을 등록해야한다.

<web-app>

<taglib>

<taglib-uri>/math-functions.tld</taglib-uri> -> TLD 파일의 식별자 명칭

<taglib-location>tlds/math-functions.tld</taglib-location> -> TLD 파일의 실제 경로명

</taglib>

</web-app>

 

- JSP 페이지에 호출하기 위해 지시어(<%@ %>) 사용해서 등록하기

<%@taglib uri="/math-functions.tld" prefix="m" %>

 

- JSP 페이지에서 호출해서 사용하기

${m:squareroot(4)}

 설명 : java.lang.Math 클래스의 sqrt 메서드를 'squareroot' 라는 이름의 EL 함수로 등록한다!! 잊어버리자 말자.

 

----------------------------------------------------------------------------------------------------

※ 테스트를 하는데 web.xml 에 <taglib> 태그에서 오류가 발생!!!

    google 검색 결과 답변은...

web.xml 이부분에서 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

빨간색으로 나타낸 부분을 지우면 된다.
XML 스키마나 DTD 지정은 JSP/Servlet 어플리케이션 지정할 때 매우 민감하게 작용합니다. 
요즘에는 Servlet Spec 2.3 이 보통이고, 최근들어 2.4도 많이 쓰는 추세입니다. 2.2는 안쓰게 된지 오래됐습니다. 
그러니까 처음에 지정한 DOCTYPE에서 2.2로 지정하면 안됩니다.(DOCTPYE 삭제해버린다) 
Servlet 스펙 2.4(가장 최신)에서는 web.xml 에서 TLD 파일을 지정하는 기능이 없다.

내 이클립스에서 생성된 web.xml version=2.5 에서 오류가 발생하는 것이다. 

해결방법

1. 위의 빨간 밑줄 부분을 삭제한다.

2. web.xml 에 TLD 파일 지정하지않고, 바로 JSP 에서 <%@ taglib uri="tld파일경로 지정" prefix="c" %>

    TLD 설치경로 : 웹 어플리케이션 디렉터리/WEB-INF 서브디렉터리 아래이면 어느 곳이든 상관 없다.