티스토리 뷰

Daylogs/Java

jsp EL & 표준액션

ohgyun 2008. 12. 18. 23:07

출처: http://lazyartist.springnote.com/pages/788330

EL(expression language)

형식

  1. ${...}

EL 표현식은 항상 중괄호로 묶고 제일 앞에 달러($)기호를 붙입니다.

 

도트(.) 연산자 사용

  1. ${person.name}
  1. 표현식에서 도트 연산자 왼쪽은 반드시 맵 또는 빈이여야 함
  2. 표현식에서 도트 연산자 오른쪽은 반드시 맵의 키이거나 빈 프로퍼티여야 합
  3. 오른쪽에 오는 값은 식별자로서 일반적인 자바 명명 규칙을 따라야 합니다.  

 

[] 연산자 사용

도트 연산자는 왼쪽에는 맵이나 빈 밖에 올 수 없으며, 오른쪽에 오는 것도 자바 명명 규칙을 따라야 합니다.

그러나 []연산자는 왼쪽에 리스트나 배열도 올 수 있습니다.

  1. ${musicList["something"]} 
  1. []연산자의 왼편에는 맵, 빈, 배열, 리스트 변수가 올 수 있습니다. 
  2. []연산자 안의 값이 문자열(따옴표로 묶여 있다면) 이라면, 이것은 맵 키가 될 수 있고, 빈 프로퍼티 또는 리스트나 배열 인덱스가 될 수 있습니다. 

 

빈과 맵이라면 둘 다 사용가능
  1. ${musicMap.Ambient}
  2. ${musicMap["Ambient"]}

 

문자열이 아닐경우
  1. 1. ${musicMap[Ambient]}
  2. 2. ${musicMap["Ambient"]}
  1. 문자열이 아닐경우 평가하여 Ambient라는 속성이 있을 경우 이 속성의 값을 키 값으로 사용한다.
  2. 문자열일 경우 단순히 Ambient라는 이름의 키 값을 찾는다.

 

포함 관계일 필요는 없다.
  1. ${musicList[number[0]} 

먼저 number라는 속성에서 값을 찾고 musicList[찾은값]으로 다시 값을 찾기 때문에 musicList에 number가 들어있지 않아도 된다.

 

EL에서 param 속성

해당 파라미터 이름으로 값이 하나 밖에 없을 때 EL 내장 객체인 param을 사용하면 그 값을 읽을 수 있음.

  1. ${param.name} 

 

하지만 해당 파라미터의 이름으로 그 값이 하나 이상일 때는 param 대한 paramValues를 사용

  1. ${paramValues.food[0]}
  2. ${paramValues.food[1]}

 

EL 내장 객체

  1. 생존범위 속성 맵

    1. pageScope 
    2. requestScope 
    3. sessionScope 
    4. applicationScope 
  2. 요청 파라미터 맵 

    1. param 
    2. paramValues 
  3. 요청 헤더 맵 

    1. header 
    2. headerValues 
  4. 쿠키 맵 

    1. cookie 
  5. 컨텍스트 초기화 파라미터 맵(서블릿 초기화 파라미터 아님) 

    1. initParam 
  6. 실제 pageContext 객체에 대한 참조. 이것은 빈임

    1. pageContext

      1. pageContext 접근자

        1. getErrorData() 
        2. getPage() 
        3. getRequest() 
        4. getResponse() 
        5. getServletConfig)() 
        6. getServletContext() 
        7. getSession() 
      2. JspContext로 부터 상속받은 접근자

        1. getAttribute() 
        2. getAttributeNamesInScope() 
        3. getAttributesScope()
        4. getExpressionEvaluator() 
        5. getOut() 
        6. getVariableResolver() 

 

 Request에서 파라미터 이상의 정보를 원할 때?

host 헤더 정보 읽기

스크립팅

  1. <$= request.getHeader("host") %>

EL 내장 객체

  1. ${header["host"]}
  2. ${header.host}
  3. ${headerValues.host[]}

 

HTTP 요청 메소드가 무엇인지 알기

스크립팅

  1. <%= request.getMethod() %>

EL 내장 객체

  1.  ${pageContext.request.method}

 

 requestScope와 request 객체는 다른 녀석

requestScope는 request 정보(property)가 아닌, request 속성을 가져오기 위해 사용함.

request 정보는 pageContext를 통해서 접근할 수 있음...

기타 나머지 모든 정보를 읽기 위해서는 pageContext를 사용함.

 

생존범위 관련 내장 객체가 도움이 될 때

명시적으로 코딩을하면 이름 충돌을 피할 수 있다.

  1. ${requestScope.person.name}

자바 명명 규칙을 지키지 않은 속성에 접근 할 수 있다.

  1. request.setAttribute("foo.person", p);
  2. ${requestScope["foo.person"].name}

 

쿠키에서 값을 출력

스크립팅

  1. <%
  2. Cookie[] cookies = request.getCookies();
  3. for(int i = 0; i< cookies.length; i++){
  4. if((cookies[i].getName()).equals("userName")){

  5. out.println(cookies[i].getValue());

  6. }

  7. }
  8. %>

EL

  1. ${cookie.userName.value} 

 

기타 정보 출력 예

  1. ip: ${pageContext.request.remoteAddr}<br>
    method : ${pageContext.request.method}<br>
    cookie : ${cookie}
    protocol : ${pageContext.request.protocol}

 

컨텍스트 초기화 파라미터 값을 출력

DD

  1. <context-param>
  2. <param-name>mainEmail </param-name>

  3. <param-value>email@email.com</param-value>

  4. </context-param>

스크립팅

  1. <%= application.getInitParameter("mainEmail") %>

EL

  1. ${initParam.mainEmail} 

 initParam은 DD의 <init-param>으로 설정된 값을 읽어오는 것이 아니라 <context-param>을 사용함. 헷갈리게 이름지어졌음...

 

 

EL 함수

  1. 정적인 공용 메서드를 제공하는 클래스를 먼저 작성 
  2. 태그 라이브러리 서술자 파일을 만듭 
  3. JSP에 taglib 지시자를 코딩 
  4. 함수를 호출하는 EL을 작성합니다. 

 

함수를 정의한 클래스

  1. package foo;
  2. public class DiceRoller{
  3. public static int rollDice(){

  4. return (int) ((Math.random() * 6) + 1);

  5. }

  6. }

태그 라이브러리 서술자(.tld)

  1. <?xml version="1.0" encoding="euc-kr" ?>
    <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
  2.     http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd>
       
    <taglib>
        <tlib-version>1.2</tlib-version>
          <uri>DiceFunction</uri>   // 태그 라이브러리의 uri와 동일
  3. <function>

  4. <name>rollIt</name>      // 사용될 함수의 이름

  5. <function-class>foo.DiceRoller</function-class>   // 실제 클래스 경로

  6. <function-signature>int rollDice()</function-signature>   // 실제 클래스의 메소드

  7. </function>

  8. </taglib>

JSP

  1. <%@ taglib prefix="mine" uri="DiceFuncfions" %>   
  2. // prefix: 해당 페이지에서 쓸 별첨 같은 것
  3. // uri: 태그 라이브러리 이름이 들어가는 부분, jsp가 EL함수를 호출하면 컨테이너가 어떤 메소드를 호출할지 찾을 때 이를 사용함.
  4. ${mine:rollIt()}   // 사용

 

 배포

WEB-INF에 TDL를 넣고 CLASS 파일을 넣으면 됨

 

기타

  1. EL 함수는 리턴 타입이 void 라도 관계없음
  2.  컨테이너는 WEB-INF 를 뒤져서 모든 .tld 파일을 찾음
  3. EL 함수가 인자를 갖기위해선 인자로 들어갈 클래스 이름을 TLD에 완전한 경로로 기입하면 됨
  1. <function-signature>
  2. int rollDice(java.util.Map)

  3. </function-signature>

 

 

<jsp:useBean>

<jsp:getProperty>를 사용하기 위해 실제 객체를 선언하고 초기화하는 태그

 

  1. <jsp:useBean id="person" class="foo.Person" type="foo.Person" scope="request" />

 

  1. jsp:useBean : 표준액션입을 나타냄
  2. id : 빈 객체 식별자를 선언
  3. class : 빈 객체의 클래스 타입을 선언함.
  4. type : 참조 변수의 타입을 지정, 추상 클래스, 인스턴스, 클래스 등을 사용 가능함.
  5. scope : 빈 객체 속성 생존범위를 지정함. 기본값은 page 
반응형
댓글
공지사항