자바(JAVA)/JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)

JAVA/JSP 32. 표현 언어(EL: Expression Language) - 인스턴스 메소드 호출, 정적 메소드 호출

개발학생 2025. 4. 21. 15:14
반응형

1. 인스턴스 메소드 호출

  • EL에서 자바 코드를 직접 사용할 수는 없지만, 메소드를 호출할 수 있는 방법을 제공함

1) 호출할 메소드 준비

  • Java Resources/src/el에 MyELClass.java 파일 생성
package el;

public class MyELClass {
  // 1. getGender() 메소드가 주민번호를 매개변수로 입력받아 성별 반환
  public String getGender(String jumin) {
    String returnStr = "";
    int beginIdx = jumin.indexOf("-") + 1;

    String genderStr = jumin.subString(beginIdx, beginIdx + 1);
    int genderInt = Integer.parseInt(genderStr);
    if (genderInt == 1 || genderInt == 3)    // 2. 주민번호 뒤 7자리의 첫 번째 숫자가 1이나 3이면 남자
      returnStr = "남자";
    else if (genderInt == 2 || genderInt == 4)    // 3. 주민번호 뒤 7자리의 첫 번째 숫자가 2나 4면 여자
      returnStr = "여자";
    else
      returnStr = "주민번호 오류입니다.";
    return returnStr;
  }

  // 4. isNumber() 정적 메소드가,문자열을 매개변수로 입력받아 숫자인지 판별
  // -> 문자열에 숫자 이외 문자가 하나라도 포함되면 false, 문자열 전체가 숫자면 true 반환
  public static boolean isNumber(String value) {
    char[] chArr = value.toCharArray();
      for (int i = 0; i < chArr.length; i++) {
        if (!(chArr[i] >= '0' && chArr[i] <= '9')) {
          return false;
        }
      }
    return true;
  }

  // 5. 매개변수로 입력받은 정수만지의 구구단을, HTML 테이블로 출력
  public static String showGugudan(int limitDan) {
    StringBuffer sb = new StringBuffer();
      try {
        sb.append("<table border='1'>");
        for (int i = 2; i <= limitDan; i++) {
          sb.append("<tr>");
          for (int j = 1; j <= 9; j++) {
            sb.append("<td>" + i + "*" + j + "=" + (i * j) + "</td>");
          }
          sb.append("</tr>");
        }
        sb.append("</table>");
      } catch (Exception e) {
        e.printStackTrace();
      }
      return sb.toString();
  }
}

2) 메소드 호출하기

  • EL은 영역에 저장된 값을 가져오는 기법이므로, 호출하려면 먼저 객체를 만들어 영역에 저장해야 함
    → 그 후에, 저장된 속성명을 통해 메소드 호출 가능
  • WebContent/EL에 ELCallMethod.jsp 파일 생성
<%@ page import="el.MyELClass"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
MyELClass myClass = new MyClass();    //1. MyELClass.java 클래스로 객체 생성
pageContext.setAttribute("myClass", myClass);    //2. 1.에서 생성한 객체를 page 영역에 "myClass"라는 이름으로 저장
%>
<html>
<head><title>표현 언어(EL) - 메소드 호출</title></head>
<body>
  <h3>영역에 저장 후 메소드 호출하기</h3>
  <!-- 3. 영역에 저장된 속성명으로 객체를 지칭해 메소드 호출(아래 코드 2줄)-->
  001225-3000000 => ${ myClass.getGender("001225-3000000") } <br />
  001225-2000000 => ${ myClass.getGender("001225-2000000") }
</body>
</html>

3) ELCallMethod.jsp 파일을 [Run As] → [Run On Server]로 실행한 결과

2. 정적 메소드 호출

1) 클래스명을 통한 정적 메소드 호출

  • 자바 & EL에서 정적 메소드는, 객체 생성 없이 클래스명으로 직접 호출하는 것이 가능함
  • WebContent/EL의 ELCallMethod.jsp 파일에 코드 추가
<%@ page import="el.MyELClass"%>

...

<body>

...

  <h3>클래스명을 통해 정적 메소드 호출하기</h3>
  ${ MyELClass.showGugudan(7) }    <!-- 클래스명을 통해, 정적 메소드 바로 호출: 인수를 7로 넘겼으므로 구구단이 7단까지 출력됨 -->
</body> 
</html>

*ELCallMethod.jsp 파일을 [Run As] → [Run On Server]로 실행한 결과

2) TLD를 이용한 정적 메소드 호출

  • TLD(Tag Library Descriptor)는 사용자 정의 태그나 JSTL 태그들을 설정하기 위한 XML 파일
    → 파일 확장자는 xml 대신 tld를 사용하며, WEB-INF 폴더에 작성함

(1) TLD 파일 생성 및 메소드 등록

  1. WebContent/WEB-INF에서 마우스 우클릭 후, [New] → [Other] 선택

2. [Wizards:] 부분에 “xml”을 입력하면 XML File을 선택 후 [Next] 클릭

3. 다음 화면에서 파일명을 “MyTagLib.tld”라고 입력 후 [Next] 클릭

4. “Create XML file using a DTD or XML Schema file”을 체크한 후 [Next] 클릭

5. “Select XML Catalog entry”를 선택하면 나오는 기본 항목 중, “web-jsptaglibrary_2_0.xsd”를 찾아 선택한 후 [Next] 클릭

6. [Namespace Information] 영역에서 첫 번째 항목 선택 후 [Edit] 클릭

7. [Prefix:]의 텍스트를 삭제해서 공백으로 만든 후, [OK]를 클릭해 적용

8. Prefix 열이 <no prefix>로 변경된 것을 확인한 후, [Finish]를 눌러 tld 파일 생성

9. tld파일이 다음과 같이 생성됨 (보기 편하게, 살짝 줄바꿈과 들여쓰기를 적용한 상태)

10. TLD 파일에 메소드 등록

  • TLD 파일 코드 수정
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" 
  xmlns="http://java.sun.com/xml/ns/j2ee" 
  xmlns:xml="http://www.w3.org/XML/1998/namespace" 
  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 ">
  <!-- 1. 버전과 짧은 이름 간단히 지정(아래 코드 2줄) -->
  <tlib-version>1.0</tlib-version>
  <short-name>mytag</short-name>
  <function>    <!-- 2. 메소드를 등록하기 위한 태그 -->
    <name>isNumber</name>    <!-- 3. 메소드 이름 -->
    <function-class>el.MyELClass</function-class>    <!-- 4. (패키지명을 포함한)클래스 이름 -->
    <function-signature>boolean isNumber</function-signature>    <!-- 5. (반환 타입과 매개변수를 포함한)메소드 시그니처 -->
  </function>
</taglib>

 

*메소드 시그니처 작성 규칙

  • 기본 자료형이 아니라면 패키지를 포함한 전체 경로를 써야 함
  • 어차피 public static 메소드만 등록 가능하므로, “public static”은 적지 않으며 매개 변수는 변수 이름 없이 타입만 기술해주면 됨
public static int 메소드명(String str)

-> <function-signature>int 메소드명(java.lang.String)</function-signature>


public static Object 메소드명(Date d)

-> <function-signature>java.lang.Object 메소드명(java.util.Date)</function-signature>

(2) WebContent/EL의 ELCallMethod.jsp 파일에 코드 추가

<%@ page import="el.MyELClass"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="mytag" uri="/WEB-INF/MyTagLib.tld" %>    // 1. taglib 지시어 선언: prefix 속성엔 EL에서 사용할 접두어를 지정하고, uri 속성에는 tld 파일의 경로 작성

...

<body>

...
  <h3>TLD 파일 등록 후 정적 메소드 호출하기</h3>
  <ul>
    <!-- 2. 지시어에서 선언한 접두어를 이용해 메소드 호출 -->
    <li>mytag:isNumber("100") => ${ mytag:isNumber("100") }</li>
    <li>mytag:isNumber("이백") => ${ mytag:isNumber("이백") }</li>
  </ul>
</body> 
</html>

(3) ELCallMethod.jsp 파일을 [Run As] → [Run On Server]로 실행한 결과

  • “100”은 정수 형태이므로 true를 반환하고, “이백”은 문자열이므로 false 반환

반응형