자바(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 파일 생성 및 메소드 등록
- 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 반환
반응형