티스토리 뷰
출처: http://lazyartist.springnote.com/pages/788330
EL(expression language)
형식
- ${...}
EL 표현식은 항상 중괄호로 묶고 제일 앞에 달러($)기호를 붙입니다.
도트(.) 연산자 사용
- ${person.name}
- 표현식에서 도트 연산자 왼쪽은 반드시 맵 또는 빈이여야 함
- 표현식에서 도트 연산자 오른쪽은 반드시 맵의 키이거나 빈 프로퍼티여야 합
- 오른쪽에 오는 값은 식별자로서 일반적인 자바 명명 규칙을 따라야 합니다.
[] 연산자 사용
도트 연산자는 왼쪽에는 맵이나 빈 밖에 올 수 없으며, 오른쪽에 오는 것도 자바 명명 규칙을 따라야 합니다.
그러나 []연산자는 왼쪽에 리스트나 배열도 올 수 있습니다.
- ${musicList["something"]}
- []연산자의 왼편에는 맵, 빈, 배열, 리스트 변수가 올 수 있습니다.
- []연산자 안의 값이 문자열(따옴표로 묶여 있다면) 이라면, 이것은 맵 키가 될 수 있고, 빈 프로퍼티 또는 리스트나 배열 인덱스가 될 수 있습니다.
빈과 맵이라면 둘 다 사용가능
- ${musicMap.Ambient}
- ${musicMap["Ambient"]}
문자열이 아닐경우
- 1. ${musicMap[Ambient]}
- 2. ${musicMap["Ambient"]}
- 문자열이 아닐경우 평가하여 Ambient라는 속성이 있을 경우 이 속성의 값을 키 값으로 사용한다.
- 문자열일 경우 단순히 Ambient라는 이름의 키 값을 찾는다.
포함 관계일 필요는 없다.
- ${musicList[number[0]}
먼저 number라는 속성에서 값을 찾고 musicList[찾은값]으로 다시 값을 찾기 때문에 musicList에 number가 들어있지 않아도 된다.
EL에서 param 속성
해당 파라미터 이름으로 값이 하나 밖에 없을 때 EL 내장 객체인 param을 사용하면 그 값을 읽을 수 있음.
- ${param.name}
하지만 해당 파라미터의 이름으로 그 값이 하나 이상일 때는 param 대한 paramValues를 사용
- ${paramValues.food[0]}
- ${paramValues.food[1]}
EL 내장 객체
생존범위 속성 맵
- pageScope
- requestScope
- sessionScope
- applicationScope
요청 파라미터 맵
- param
- paramValues
요청 헤더 맵
- header
- headerValues
쿠키 맵
- cookie
컨텍스트 초기화 파라미터 맵(서블릿 초기화 파라미터 아님)
- initParam
실제 pageContext 객체에 대한 참조. 이것은 빈임
pageContext
pageContext 접근자
- getErrorData()
- getPage()
- getRequest()
- getResponse()
- getServletConfig)()
- getServletContext()
- getSession()
JspContext로 부터 상속받은 접근자
- getAttribute()
- getAttributeNamesInScope()
- getAttributesScope()
- getExpressionEvaluator()
- getOut()
- getVariableResolver()
Request에서 파라미터 이상의 정보를 원할 때?
host 헤더 정보 읽기
스크립팅
- <$= request.getHeader("host") %>
EL 내장 객체
- ${header["host"]}
- ${header.host}
- ${headerValues.host[]}
HTTP 요청 메소드가 무엇인지 알기
스크립팅
- <%= request.getMethod() %>
EL 내장 객체
- ${pageContext.request.method}
requestScope와 request 객체는 다른 녀석
requestScope는 request 정보(property)가 아닌, request 속성을 가져오기 위해 사용함.
request 정보는 pageContext를 통해서 접근할 수 있음...
기타 나머지 모든 정보를 읽기 위해서는 pageContext를 사용함.
생존범위 관련 내장 객체가 도움이 될 때
명시적으로 코딩을하면 이름 충돌을 피할 수 있다.
- ${requestScope.person.name}
자바 명명 규칙을 지키지 않은 속성에 접근 할 수 있다.
- request.setAttribute("foo.person", p);
- ${requestScope["foo.person"].name}
쿠키에서 값을 출력
스크립팅
- <%
- Cookie[] cookies = request.getCookies();
- for(int i = 0; i< cookies.length; i++){
if((cookies[i].getName()).equals("userName")){
out.println(cookies[i].getValue());
}
- }
- %>
EL
- ${cookie.userName.value}
기타 정보 출력 예
- ip: ${pageContext.request.remoteAddr}<br>
method : ${pageContext.request.method}<br>
cookie : ${cookie}
protocol : ${pageContext.request.protocol}
컨텍스트 초기화 파라미터 값을 출력
DD
- <context-param>
<param-name>mainEmail </param-name>
<param-value>email@email.com</param-value>
- </context-param>
스크립팅
- <%= application.getInitParameter("mainEmail") %>
EL
- ${initParam.mainEmail}
initParam은 DD의 <init-param>으로 설정된 값을 읽어오는 것이 아니라 <context-param>을 사용함. 헷갈리게 이름지어졌음...
EL 함수
- 정적인 공용 메서드를 제공하는 클래스를 먼저 작성
- 태그 라이브러리 서술자 파일을 만듭
- JSP에 taglib 지시자를 코딩
- 함수를 호출하는 EL을 작성합니다.
함수를 정의한 클래스
- package foo;
- public class DiceRoller{
public static int rollDice(){
return (int) ((Math.random() * 6) + 1);
}
- }
태그 라이브러리 서술자(.tld)
- <?xml version="1.0" encoding="euc-kr" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" - http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd>
<taglib>
<tlib-version>1.2</tlib-version>
<uri>DiceFunction</uri> // 태그 라이브러리의 uri와 동일 <function>
<name>rollIt</name> // 사용될 함수의 이름
<function-class>foo.DiceRoller</function-class> // 실제 클래스 경로
<function-signature>int rollDice()</function-signature> // 실제 클래스의 메소드
</function>
- </taglib>
JSP
- <%@ taglib prefix="mine" uri="DiceFuncfions" %>
- // prefix: 해당 페이지에서 쓸 별첨 같은 것
- // uri: 태그 라이브러리 이름이 들어가는 부분, jsp가 EL함수를 호출하면 컨테이너가 어떤 메소드를 호출할지 찾을 때 이를 사용함.
- ${mine:rollIt()} // 사용
배포
WEB-INF에 TDL를 넣고 CLASS 파일을 넣으면 됨
기타
- EL 함수는 리턴 타입이 void 라도 관계없음
- 컨테이너는 WEB-INF 를 뒤져서 모든 .tld 파일을 찾음
- EL 함수가 인자를 갖기위해선 인자로 들어갈 클래스 이름을 TLD에 완전한 경로로 기입하면 됨
- <function-signature>
int rollDice(java.util.Map)
- </function-signature>
<jsp:useBean>
<jsp:getProperty>를 사용하기 위해 실제 객체를 선언하고 초기화하는 태그
- <jsp:useBean id="person" class="foo.Person" type="foo.Person" scope="request" />
- jsp:useBean : 표준액션입을 나타냄
- id : 빈 객체 식별자를 선언
- class : 빈 객체의 클래스 타입을 선언함.
- type : 참조 변수의 타입을 지정, 추상 클래스, 인스턴스, 클래스 등을 사용 가능함.
- scope : 빈 객체 속성 생존범위를 지정함. 기본값은 page