[정리] EL :: Function

EL :: Function (함수)

EL도 파라미터를 사용할 수 있고.. 따라서 함수 사용도 가능합니다. (Java Bean과 다른 점이죠.) EL 문법으로 함수를 만들지는 않고 만들어 둔 자바 함수를 가져다가 사용할 수 있습니다. JSP 라는게 어짜피 MVC 패턴으로 놓고 보면 "VIEW"에 해당하는 것이기 때문에 원래 복잡한 로직은 Model, Controller에서 처리를 하는게 맞습니다. 그래서 스크립틀릿 같은게 지양되고 EL이 권장되는 거겠죠. 그럼에도 불구하고 함수를 사용할 수 있다는건 좀 아이러니 하기도 하네요.

자바에서 왜 Function(함수)라는 이름을 사용할까요? 함수와 메소드의 차이점이 뭔지 기억하신다면, 아래 메소드를 왜 클래스 멤버로 선언하는지 딱 감이 오실겁니다.


EL의 함수는 이렇게 동작합니다.

1) 자바 클래스에서 사용하고자 하는 메소드를 클래스 멤버(static)로 선언합니다.

2) WEB-INF 밑에 TLD(Tag Library Descriptor;XML 타입) 파일을 가져다 놓습니다. (이때 WEB-INF 서브 폴더면 어디든 상관 없습니다.)

3) JSP에서 <%@ taglib %> 지시자로 해당 함수를 지정한 후, EL에서 사용합니다.


그럼 순서대로 소스를 보죠..


DicePlay.java

  1. package foo;
    public class DicePlay {

    public static int rollDice() {
    int result = (int)(Math.random() * 6) + 1;
    return result;
    }

    }


DiceFunctions.tld

  1. <?xml version="1.0" encoding="UTF-8"?>
    <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <tlib-version>1.2</tlib-version>
    <short-name>DiceFunctions</short-name>
  2. <uri>DiceFunctions</uri>
    <function>
  3. <name>rollIt</name>
  4. <function-class>foo.DicePlay</function-class>
  5. <function-signature>int rollDice()</function-signature>
  6. </function>
    </taglib>


TldTest.jsp

  1. <%@ taglib prefix="mine" uri="DiceFunctions" %>
    <p>${mine:
    rollIt() }</p>

현재(8.15) 이클립스에서 버그가 있는데, 함수 호출하는 부분에서 EL Syntax Error 라고 나옵니다. https://bugs.eclipse.org/bugs/show_bug.cgi?id=280621 원인도 나와있긴 한데.. 아직 패치는 나오지 않은 것 같습니다. 아니면 저 부분을 찾아서 디버깅 후 컴파일 하는 방법도 있겠네요 (...)

2010.2.6 현재 버그 수정되었습니다.


이것도 돌아가는게 DD와 비슷한데요. 특이한 점은 TLD 파일을 WEB-INF 어디에 놓던 간에 따로 경로 지정을 안해줘도 된다는 겁니다. <@taglib> uri 속성TLD 파일의 <uri>의 내용만 맞으면 어떤 형식으로 들어가도 상관은 없습니다. 그리고 prefix 속성(맘대로 지정할 수 있습니다.)이 있기 때문에 함수를 종류나 쓰임새 별로 묶을 때 그냥 한 곳에 다 때려밖고 prefix만 잘 줘도 충분해 보입니다. XML Namespace의 장점을 잘 살려넣은듯 보이네요.

만약 함수에 파라미터를 넘겨야 하는 경우엔, tld 파일을 아래와 같이 수정합니다.

  1. <function-signature>String toUpperCase(java.lang.String)</function-signature>

+ Recent posts