'05.JSP'에 해당되는 글 65건

  1. 2008.08.07 형변환
  2. 2008.08.07 [정리 ]JSP 동작
  3. 2008.08.07 jsp 함수 정리
  4. 2008.07.25 JSTL 기초, Part 2: core 분석 (한글)
  5. 2008.07.25 JSTL 기초, Part 1: Expression Language (한글)
05.JSP2008. 8. 7. 15:32
반응형
1. 숫자를 문자열로 바꾸기
   int i = 639;
   String str = String.valueOf ( i );
   String str = Integer.toString ( i );
   String str = i.toString ( );

2. 문자열을 숫자로 바꾸기
   String str = "639";
   int i = Integer.valueOf ( str ).intValue ( );
   int i = Integer.parseInt ( str );
   long i = Long.parseLong ( str )
   double j = Double.valueOf ( str ).doubleValue ( );

  
3. 기타 형변환
   Float를 Integer로 바꾸기
   float f = 3.25;
   int i = ( int ) f;
   double d = ( double ) i; // float 형
  
   Object를 int 타입으로 형변환 하기 ... 바로 안되므로 String으로 바꾼후 int로 형변환 한다.
   Integer.parseInt ( vector.elementAt ( 0 ).toString () );
 
 
 
 
}
 
 

VIP석 120,000원 / R석 100,000원 / S석 60,000원 / A석 40,000원




</body>




   //입주기관, 및 검색조건에 따른 검색결과
    public Vector search() throws Exception {
        StringBuffer sbQuery = new StringBuffer();
        //쿼리생성
        String query = super.xml.getQuery(QUERY_URL, "syslog_02", "02");
        sbQuery.append(query);
        //파라미터들 가져오기
        String Start_Date = requestbox.get("Start_Date"); //시작일
        String End_Date = requestbox.get("End_Date"); //마지막일
        String biz_time= requestbox.get("biz_time");//업무시간
        String start_time = requestbox.get("start_time"); //업무시간
        String end_time= requestbox.get("end_time");//업무시간
        String select_custcomp= requestbox.get("select_custcomp");//입주기관
        String ip_hostname= requestbox.get("ip_hostname");//장비명
 String message= requestbox.get("message");//검색 메시지
        String select_Facility= requestbox.get("select_Facility");//Facility명
        String select_priority= requestbox.get("select_priority");//Priority
       //기본으로 날짜검색 파라미터

        logger.debug("시작시간: [" + Start_Date + "]");
        logger.debug("종료시간: [" + End_Date + "]");
        logger.debug("비즈타임: [" + biz_time + "]");
  logger.debug("select_Facility: [" + select_Facility + "]");
  logger.debug("select_priority: [" + select_priority + "]");

        Vector vecResultData = new Vector();
        String query_st1 = new String(sbQuery);
        sbQuery = new StringBuffer(query_st1);

// 메시지검색
  String LOG_MESSAGE = "    and A.LOG_MESSAGE like '%" + message + "%'";

// 입주기관
        String CUSTCOMP = "";
        if (select_custcomp.equals("")||select_custcomp.equals("all")){
            CUSTCOMP = "";
        } else {
            CUSTCOMP = "   and d.custcomp_name = '" + select_custcomp +"'";
        }
// Facility
        String Facility_param = "";
        if (select_Facility.equals("")||select_Facility.equals("all")){
            Facility_param = "";
        } else {
            Facility_param = "   and c.code_name = '" + select_Facility +"'";
        }
// Priority
       String Priority_param = "";
       if (select_priority.equals("")||select_priority.equals("all")){
           Priority_param = "";
       } else {
          Priority_param = "   and b.code_name = '" + select_priority +"'";
       }
// 장비명
        String HOSTNAME = "";
        if (ip_hostname.equals("")||ip_hostname.equals("all")){
            HOSTNAME = "";
        } else {
            HOSTNAME = "    and t.ip_hostname = '" + ip_hostname +"'";
        }

        String STARTDATE = "   and to_date(a.yyyymmdd,'YYYYMMDD') >= to_date(substr('" + Start_Date + "',0,8), 'YYYYMMDD')";
        String ENDDATE = "    and to_date(a.yyyymmdd,'YYYYMMDD') <= to_date(substr('" + End_Date + "',0,8), 'YYYYMMDD')";
        String STARTTIME = "";
        String ENDTIME = "";
        if (biz_time.equals("biz_time")){
            STARTTIME = "    and substr(a.hhminss,0,2) >= " + start_time ;
            ENDTIME = "    and substr(a.hhminss,0,2) <= " + end_time;
        } else {
            STARTTIME = "";
            ENDTIME = "";
        }
        String query_st2 = new String(sbQuery);
        sbQuery = new StringBuffer(query_st2);
        sbQuery.append(STARTDATE).append("\n");
        sbQuery.append(ENDDATE).append("\n");
        sbQuery.append(STARTTIME).append("\n");
        sbQuery.append(ENDTIME).append("\n");
 sbQuery.append(LOG_MESSAGE).append("\n");
        sbQuery.append(CUSTCOMP).append("\n");
        sbQuery.append(HOSTNAME).append("\n");
        sbQuery.append(Priority_param).append("\n");
        sbQuery.append(Facility_param).append("\n");
        logger.debug("검색쿼리 --> " + sbQuery);
        String param[] = null;

        vecResultData = queryIf.preparedExecuteQuery(UNMSDB2, sbQuery.toString(), param);
        logger.debug("====" + vecResultData.size() + "결과사이즈");
        return vecResultData;

Posted by 1010
05.JSP2008. 8. 7. 15:26
반응형

JSP 요청 ->  해당 페이지의 서블릿이 잇냐? -n> 메모리에 로드됫냐? -n> 메모리로드 -> 응답생성


=======================

1.선언부 : 선언하고자 할때

<%! 

// 변수 , 메소드  %>


2.표현부 : 어떤 값을 출력하고자 할때 쓰는것

<%=

// 변수표현,메소드표현,특정객체,수식 %>


예제

<%!

String s ="this is a test";

int i =1000;

Point2D.Double mypoint = new Point2D.Double(5.0,10.0);     // x,y 좌표 점객체생성

%>

<%= s %> <%= i %> <%= myPoint %>   // myPoint.toString의 효과임


===> 실행하면

"this is a test"     "1000"   "myPoint.tiString의 값이 출력"


2.스크립트릿 : 선언부와 표현식을 제외한 모든 자바코드

<%

//

%>

예제

<%

int i = 0;

for(i=9;i<5;i++)

{

%>

// 반복되는 내용

<%

}

%>


예제


<%@ page import="java.awt.geom.Point2D" %>
<%
Point2D.Double p1 = new Point2D.Double(100.0, 100.0);
Point2D.Double p2 = new Point2D.Double(150.0,100.0);
double distance = p1.distance(p2);
%>
<html>
<head></head>
<body>
<%= p1 %> 과 <%= p2 %> 사이의 거리 : <%= distance %>
</body>
</html>

================================================


주석


<!-- 내용주석 -->  : JSP가 생성하는 문서(클라이언트에 출력하는 문서)에 표현하는 주석

                             소스보기를 통해 보임


<%-- JSP 주석 -->  : 출력되는 문서에 표현 안함

                               소스보기해서 안보임 : 이걸해야겟네

<%

//스크립터 언어 주석   : 서블릿으로 변환된 *.java 내부에 보여지는 언어주석

/*

*/

%>





===========================================

디렉티브란

=>해당 JSP페이지와 관련된 정보를 나타낼때 쓰는 태그

<%@ 디렉티브 속성1="값1" 속성2="값2" ... %>


디렉티브 종류

page - 해당페이지의 전체적인 특성을 나타냄

include - 다른페이지를 포함하고자 할때 사용

taglib - 기능확장을 위해 사용할 커스텀 태그의 경로를 지정할때 사용. 사용자태그를 만들어 놓고 그걸 불러와서 사용하고자 할때 사용..


[page 디렉티브]

language : 스크립트의 언어이름 : 기본값 java

contextType : MIME타입,문자셋, : 기본값 "text/html"

info : 문자열 : 별의미없다.

import : 클래스, 패키지 이름

session : boolean값 : 기본값 true

*session이란 어떤 사이트에 로그인하면 그 사용자 정보가 서버에 보내져서 사용자 세션 객체가 생성된다. 그 이후 그 사이트의 어떤 페이지로 이동을 하든 사용자정보에 대한 세션이 계속 유지되는 상태이므로 접근이 가능하게 하는것..기본값은 true이다

buffer :  버퍼의 크기 또는 false : 기본값 8KB

autoflush : 버퍼가 꽉 차면 자동으로 flush해주냐  기본값 : ture

isThreadSafe : 해당 페이지가 쓰레드에 안전하냐 안하냐? 기본값 :true (안전하게 하겟다는 의미)

errorPage : 로컬 URL을 넣어줌 : 자신페이지에 에러가나면 어떤 페이지로 이동해서 에러를 보여주냐를 나타냄.

iserrorPage : errorPage에서 에러가 난 URL은 iserrorPage가 true가 됨

extends : 클래스 이름이 들어감 : 지금 작성하는 페이지가 어떤 클래스에서 상속을 받느냐..자동으로 JSP가 해줌.신경쓸필요없다.

pageEncoding: ISO-8859-1 기본값  euc-kr 한국어 ecu-jp 일본어

================================================

[include 디렉티브]

다른페이지의 내용을 포함하고자 할때

<%@ include file =" 포함할 페이지의 로컬 ㅕ끼" %>

*액션태크의 인클루드는 인클루드 쪽서블릿으로 제어권이 넘어가서 다시 페이지로..제어권이 넘어와서 사용

*디렉티브의 인클루드는 페이지 소스를 불러와서 서블릿으로 통채로 변환해서..사용


==============================================

[taglib 디렉티브]

jsp페이지에서 사용할 태크 라이브러러리를 지정할때 사용

사용자 정의 태그: xml...

=====================================================

[기본객체]

1.request.response,out  기본객체(컨테이너가 제공하는 객체:즉 바로 사용할수 있는개첵)


*종류

1.request : javax.servlet.SevletRequest 파라미터를 포함한 요청 데이터

즉, A페이지에서 B페이지로 제어권이 넘어갈때 같이 따라가는 객체

2.response : 요청ㅇ르 했으면 요청에 대한 응답을 생성해서 주는 객체


3.out : 출력 스트림에 내용을 출력하는 객체


4.page : 페이지 자기 자신에 대한 객체


5 config 객체 : jsp 페이지의 servletconfig 객체



6.session 객체: 사용자가 웹사이트에 접속했을때 그 사용자가 다른페이지로 이동해서 가지고 다니는 것이 세션객체

기본값 : true


7.application 객체: 전체 사이트에 관여된 객체. 서블릿 config객체로부터 구할수 있는 서블릿 컨텍스터(ex: 카운터 같은거)


8.pageContext 객채: 현재 jsp 페이지의 페이지 컨텍스터


9. exception 객체 : 에러페이지에서 사용되는 예외 객체


=======================================

[기본객체가 사용하는 메소드]

void setAttribute(key,value) 키값이 key인 객체 value를 저장한다.

Object getAttribute(key) 키값이 key인 객체를 읽어들인다.

void removeAttribute(key) 키값이 Key인 객체를 삭제한다.

Enumeration getAttributeNames() 관련된 모든 속성의 이름을 읽어들인다. (배열형태로 통채로 반환됨..이거를 enum으로 받아들인다는것)


============================================

[request 기본객체]

한번의 요청에 대해서 유효한 객체

자신의 페이지로의 요청에 대한 url,헤더,쿠키 요청과 관련된 파라미터의 정보에 접근할수 있는 메소드 제공


getParameterNames() 모든 파라미터의 이름을 구한다.

getParameter(String name) 지정한 이름을 가진 파라미터중 첫번째ㅔ 파라미터의 값을 구한다.

getParametetValues(String name) 지정한 파라미터의 모든값을 String[]으로 구한다.

=======================================================================

[요청헤더와 기타 유용한 정보를 얻을수 있는 메소드제공]

getMethod() 요청방식이 get인지 post인지 구한다

getRequestURI() 요청한 URI를 구한다.

getProtocol() 요청한 프로토콜ㅇ르 구한다.

getServletPath() 요청한 서블릿 경로를 구한다.

getQueryString() 쿼리 스트링을 구한다. (브라우저 주소줄 뒤에 ?하고 변수값 =..이런식으로붙는거)

getSErverName() 서버이름

GetServerPort 서버포트

getRemoteAddr 서버 주소

getAthType 인증스키마

getLocale 로커일

getHeader(name) 헤더중에 nameㅇ속성값ㅇ르 구한다.



================================================================

response 기본객체

jsp 페이지를 처리한 결과를 사용자에게 보낼때 사용되는 응답객체

헤더,쿠키,응답과 관련된 정보를 설정할수 있는 메소드를 제공

(쿠키가 사용자 컴터에 남아있으면 로그인안해도 서버에 그정보를 가지고 접속하면 찾아가므로..사용자에게 보여질수 있다.)

응답을 통해서 전송된느 내용의 형식을 지정하는 메소드를 제공


addCookie(Cookie) 사용자의 컴퓨터에 심을 쿠기정보를 저장하는 메소드

setHeader(name.value) 이름이 anme인 헤더를 value값으로 지정

addHeader(name.value) name 헤더를 value로 추가

setContentType(String) MIME 타입을 지정하며, 추가로 인코딩 타입 지정

getCharacterEncoding() 응답하는 내용의 캐릭터 인코딩을 구함

encodeRedirectURL(url) sendRedirect() 메소드에서 사용할 URL을 인코딩

encodeURL(name) 링크에서 사용할 URL을 인코딩

sendRedirect(url) 지정한 URLㅇ르 사용하여 리다이렉트 응답을 보냄ㄴ

===============================================================

out 기본객체

요청받은 jsp 페이지가 브라우저에 결과를 보낼때 출력을 담당하는 객체

javax.servlet.jsp.JspWriter 클래스의 인스턴스


newLine() 줄구분자를 출력

print(데이터 유형) 해당 데이터 유형의 문자열 형식을 출력

println(데이터 유형) 해당 데이터 유형의 문자열 출력,줄구분자 출력

==========================================================

page 기본객체

해당 jsp페이지가 변환된 서블릿 그 자체를 나타내는 객체

페이지의 정보를 나타내는 getServletInfo()메소드를 제공

=======================================================

config 기본객체

jsp페이지를 초기화 할때 사용되는 초기화 파라메털르 저장

서블릿ㅇ르 변환할때 저장하는 서블릿의 이름은 jsp임

=======================================================

session 기본객체

java.servlet.http.HttpSession 인터페이스의 인스턴스

getId() 클라이언트마다 주어지는 고유한 세션 ID, 서버측에서 고유한 세션ID를 클라이언트에게 부여.그걸 알고자할때 쓰는것 getId()

getCreatingTime() 세션 생성시간을 long형으로 구한다. 세션이 접속해서 세션이 생성된 시간.세션의 기간을 정해줄때 필요함.

getLastAccessedTime() 마지막 요청받은 시간을 초 단위로 구한다.

getMaxInactiveInterval() 두 요청간의 세션 유지 최대시간 초단위로 구한다.

setMaxInactiveInterval() 두 요청간의 세션유지 최대시간을 초단위로 설정한다.

isNew() 세션ID를 생성해서 리턴한다.

invalidate() 세션을 버리고 속성에 저장된 객체를 모두 풀어준다.

==================================================

application 기본객체

해당 application 전체에 사용할수 있는 정보를 저장하는 객체

해당 어플리케이션전체라는 의미는 하나의 사이트를 말함.  ex: 카운터

서블릿 컨텍스트와 같은 개념이고 전체 사이트의 정보를 저장함.

서블릿 컨텍스트를 하나의 사이트를 나타내는 이름정도로 이해하면 된다.

javax.servlet.ServletContext의 인터페이스의 인스턴스

getServerInfo()

getMajorVersion()

getMinorVersion(()

거의 사용안함.

=============================================================

pageContext 기본객체

현재 jsp페이지의 콘텍스트를 나타냄(페이지를 대표하는 이름)

다른 기본객체에 접근할수 있는 메소드를 제공

<%

HttpSession httpSession = pageContext.getSession();

%>

제어를 이동하거나 포함할수있는 메소드를 제공한다.

forward(path)    include(path)

=========================================================

exception 기본객체

jsp 에서 발생하는 예외를 나타냄

디렉티브의 isErrorPage 속성이 true인 페이지에서 접근가능

<#@ page isErrorPage="true" %>

java.lang.Throwable 클래스를 상송받은 클래스의 인스턴스

=========================================================


@@ JSP 액션태크


<jsp:useBean> <jsp:setProperty> <jsp:getProperty>

<jsp:include> <jsp:forward> <jsp:plugin>


1.빈관련 태그

jsp에서 빈을 사용할수있도록 jsp는 tag를 제공함.이걸 이용해라

<jsp:useBean> jsp 페이지에서 자바의 빈ㅇ르 사용하고자 할때 사용

<jsp:setProperty> 사용할려는 빈의 변수값 메소드값(프로퍼티) 설정할때 사용

<jsp:getProperty> 빈에 정의된 프라퍼티의 값을 불러올때 사용

<jsp:include>  다른 문서의 출력결과를 현재 페이지에 포함하고자 할때 사용(디렉티브와 차이: 제어권이 넘어감)

ex: <jsp:include page ="로컬 url" flush="true|false" />

include 디렉티브와는 달리 포함되는 페이지도 또하나의 페이지로 해석되어 존재

포함하는 페이지와 포함되는 페이지는 서로다른 pageContext객체를 가짐, 따로따로 서블릿이 생성이 되니까..당연한 소리지..

두페이지는 서로다른 request객체를 가지지만 서로 같은값을 가짐

<jsp:forward>

ex <jsp:forward page="로컬url' />

현재 페이지에서 다른 페이지로 제어권을 이동하고자 할때 사용

서로 다른 pageContext 객체를 사용

서로 다른 request를 기본객체를 할당받지만 같은 값을 가짐

<jsp:param> 태그를 사용하여 새로운 파라미터를 넘겨줄수 있음

제어권이 이동할때 이동되는 페이지로 넘겨줄수 있음.

<jsp:plugin> 자바플러그인을 사용하여 자바 애플릿을 실행하고자 할때 사용

필요한 속성은

type

code

codebase

height

width

===========================

자바빈

jsp에서 class의 메소드를 사용하고 싶을때

이 class를 <jsp:useBean id="  "  의 id로 등록하고

jsp문서내에서 이 id."클래스의 메소드" 로 사용한다.

이때 메소드도 일일이 다 등록해야하는데.jsp문서내에서 이때 사용하는게

<jsp:setProperty

가져오는게 <jsp:getProperty 이다.


==============================


@빈의 정의
특정 기능을 수행하도록 미리 정의되어진 클래스
@빈의 특징
모듈화되어 있고 재사용 가능
내부의 데이터와 로직이 캡슐화 되어있음
사용법에 대한 인터페이스만 알면 누구나 사용가능
프로그램 개발시 표준화된 인터페이스를 통해 접근하므로 현저한 시간 단축
@프라퍼티
정의-빈이 가지고 있는 데이터의 값을 설정하거나 읽어 들이는 기능을 수행한느 자바빈의 속성
종류-Setter: 빈의 속성값ㅇ르 설정하기 위한 메소드
Getter : 빈의 속성값을 읽어들이기위 한 메소드
@규약: 시작은 소문자, 단어가 바뀔때마다 대문자
외부에서 접근가능해야하느모 접근속성은 public
get또는 set다음에 데이터 멤버의 일므이 와야함(클래스가 가지고있는 변수)
특정 객체를 프로퍼티의인수로전달가능
====================================
빈관련 jsp태그
<jsp:useBean> 페이지내에서 자바비ㅏㄴ을 사용할수있도록 설정
사용가능한 속성 : id 자바식별자(객체명)
scope : 만들어진 객체를 어디에서 사용할꺼냐..page / request. seesion / application

=================================

<jsp:setProperty> 태그

<jsp:setProperty name="beanName" property="propertyName" value="propertyValue" />

ex:setX 메소드라면 여기서 X라는 이름을 위의 property에 적어주면 되는거다.

해당 속성값에 대한setProperty메소드를 호출한다.

propertyValue값을 해당 속성에 설정한다.

==================================

<jsp:getProperty>

<jsp:getProperty name="beanName" property="propertyName" />

해당 속성값에 대한 getProperyt메소드를 호출한다.

해당 속성값을 호출한다. 즉 변수의 값을 리턴하는 return문이 들어있겟다.

=============================

자바에서는 엔터프라이즈빈이라는걸 제공해주니 이걸 사용법만 알면 가져다 쓸수있다..함 찾아봐보장..

===========================================

[빈 컴포넌트 사용하기]

빈 컴포넌트의 영역

스크립트와 빈태그의 혼합

====================

빈 컴포넌트의 영역

-page 영역: 페이지의 요청과 동시에 생성.소멸과 동시에 빈 객체도 소멸

 scope영역을 생략할경우에도 이값으로 설정

-request 영역

브라우저의 한번 요청이 완료될때가지 존재

하나의 jsp페이지로 구성된 경우 page영역과 request영역은 동일한 효과를 지님

포함되는 페이지에서 빈 객체를 사용하기 위해서는 반드시 빈객체가 먼저 생성되어 있어야 함

-sesssion영역

세션이 살아있는한 빈 컴포넌트도 살아있다는 소리

사용자의 중요한 정보는 DB또는 다른 저장장치를 이용해서 하는것이 일반적. DB에 사용자정보가 있다가 빈객체에 이 정보넣고. 세션이 살아있는동안 사용하다가..세션이 죽으면 빈객체도 없어지므로 사용자 정보도 DB에만남게 되는것임

-application영역(하나의 사이트를 말함)

jsp 컴테이너를 종료하기 전까지는 서버에 존재함(톰캣.레진..)

서버의 모든 사용자에게 공통적으로 사용되므로 사용자 개인 정보는 sessioh영역에 저장하는것이 일반적

application영역에는 conter 같은것을 넣어라

=====================================

스크립트와 빈태그의 혼합

1.빈캐그만을 이용한 경우

<jsp:useBean id="test" class="passday.bean.TestBean" />

<jsp:getProperty name="test" property="testPrpperty" />

2.스크립트를 이용한 경우

<jsp:useBean id="test" class="passday.bean.TestBean" />

<%= test.gettestProperty() %>



Posted by 1010
05.JSP2008. 8. 7. 15:24
반응형

1. 주석달기

    <!-- -->

    <%-- --%>


2. 선언태그

    <%! %>


3. 표현식

    <%= %>


4. 지시어

    <%@ include file=“파일의 위치(URL)" %>

    page 지시어

    <%@ page [language="java"]

            [extends="pagckage.class"]                   (java.util.Data)

            [import="{package.class | package.*},..."]     (java.util.*)

            [session="true | false"]

            [buffer = "none|8kb|sizekb"]

            [autoFlush="true|fase]

            [isThreadSafe="true|false]

            [info="text"]

            [errorPage="relativeURL"]

            [contentType="mimeType[;charset=characterset]"|

                                   "text/html;charset=euc-kr"]

            [isErrorPage="true|false"]

    %>


5.Taglib 지시어

    <%@ taglib uri="URIToTagLibary" prefix="tagPrefix" %>


6. Request 객체의 메소드

    javax.servlet.http.HttpServletRequest

getAttribute(String name)

속성값 반환

getAttributeNames()

request 객체에 있는 모든 속성값의 배열을 반환

getCharacterEncoding()

post 형식으로 전송된 자료의 문자인코딩방식을 반환

getContentType()

request의 mime타임의 밧을 문자열로 반환

getInputStream()

Post형식으로 전송된 자료의 inputStream으로 반환

getLocale()

request의 우선적 지역정보를 반환

getLocales()

접속할수 있는 모든 클라이너트 지역정보를 배열로반환

getParameter(String name)

html문서의 폼으로 넘어온 정보의 값을 반환

public String getParameter(String name)

getParameterNames()

html문서의 폼으로 넘어온 정보로부터 폼들의 이름을 배열로 반환

public Enumeration getParameterNames()

getContentLength()

전송된 자료의 길이를 반환

getParameterValues(String name)

html문서의 폼으로 넘어온 모든 정보의 값을 반환

public String[] getParamterValues(String name)

getProtocol()

사용되는 프로토콜의 종류를 문자열로 반환

getReader()

post 형식으로 전송된 자료를 읽을 Reader를 반환

getRemoteAdd()

접속한 클라이언트의 ip 어드레스값을 문자열로 반환

getRemoteHost()

접속한 클라이언트의 도메인이름을 문자열로 반환

getServerName()

request를 처리하는 서버의 이름을 문자열로 반환

getServerPort()

request를 처리하는 소버의 포트번호를 정수형으로 반환

isSecure()

보안모드가 적용되는 클라이언트와 접속되어있는지 여부를 논리값반환

getAuthType()

인증형에 대한 값을 문자열로 반환

getContextPath()

어플리케이션 디렉토리의 url을 문자열로 반환

getCookies()

클라이언트부터 전송된 쿠키에 대한 정보를 반환

getMethod()

get,post인지를 문자열로 반환

public String getMethod()

getQueryString()

request의 QueryString값을 문자열로 반환

public String getQueryString()

getRequestedSession()

세션아이디의 값을 문자열로 반환

getProtocol()

사용되는 프로토콜의 종류를 문자열로 반환

getSession()

현재 세션 객체를 반환

public HttpSession getSession()



7. Response 객체의 메소드

javax.servlet.http.HttpServletResponse

flushBuffer()

버퍼에 저장되는 있는 내용을 클라이언트에 전송

getBufferSize()

출력 버퍼의 크기를 정수 자료형으로 반환

getCharacterEncoding()

Response시 사용하는 문자 인코딩 방법으로 문자열 자료형으로 반환

getLocale()

지역정보를 java.util.Local 클래스의 객체형으로 반환

getOutputStream()

클라이언트에 자료를 전송하는 출력 스트립의 객체를 반환

isCommitted()

클라이언트에 어떤 내용으로 버퍼로부터 전송했으면 true로 반환

setBufferSize(int size)

출력 버퍼의 크기를 설정

setContentType(String type)

응답시 사용할 Content Type을 설정

setLocale(Locale locale)

지역정보를 임의로 설정함

addCookie(Cookie cookie)

쿨라이언트에게 새로운 쿠키정보를 전송함

sendError(int sc)

상태 코드에 따른 Http 에러 페이지를 클라이언트에게 전송함

sendRedirect(String location)

현재 페이지에서 문서를 다른 페이지로 이동시킴


8. Session 객체의 메소드


javax.servlet.http.HttpSession

getAttribute(String name)

Session에 저장된있는 속성값중 name에 해당값을

Object의 객체형으로 반환

getAttributeName()

Session객체에 값을 저장하고 있는 각각의 속성의 이름 모두를

Enumeration객체형으로 반환

getCreatonTime()

클라이언트가 접속하여 생성된 Session의 생성 시간을 long형으로 반환

public long getCreationTime()

getId()

클라이언트에 할당된 Session의 ID값을 문자열 형으로 반환

public String getId()

getLastAccessedTime()

현재의 세션이 jsp 페이지에 접근한 최근 접속시간을 long형으로 반환

public long getLastAccessedTime()

getMaxInactiveInterval()

사용자가 세션을 부여받은후 아무것도 하지 않을 경우 자동적으로 세션을

종료하도록 설정된 시간의 값을 정수형으로 반환

public int getMaxInactiveInterval()

invalidate()

현재 실행중인 세션을 무효화(종료)

public void invalidate()

isNew()

현재 실행중인 세션이 새로운것인지를 대한 여부를 논리값을 반환

public boolean isNew()

removeAttribute(String name)

현재 세션이 저장되어있는 속성값들중 지정한 속성의 값을 지움

setAttribute(String name,Object value)

현재 세션이 새로운 이름의 속성을 만들고 그 속성에 값을 할당함

setMaxInactiveInterval(int seconds)

세션을 할당받고 아무런 액션이 없을 경우 세션이 자동으로 종료하는

시간을 설정함

public void setMaxInactiveInterval(int seconds)

9. Out 객체


javax.servlet.jsp.JspWriter


10.  Application객체

javax.servlet.ServletContext

getAttribute(String name)

Application 속성값중에 name에 해당하는 값을 Object의 객체형으로 반환

getAttributeNames()

Application 저장되어 있는 속성명들을 열거 자료형으로 반환

getInitParameter(String name)

Application이 초기화될때 설정된 파라미터 값을 가져옴

getInitParameterNames()

Application이 초기화될때 설정된 파라미터의 이름을 열거 자료형으로 반환

getMimeType(String url)

지정한 위치에있는 파일의 MimeType을  문자열형으로 반환함

getServerInfo()

서버의 정보를 문자열형으로 반환

public String getServerInfo()

removeAttribute()

Application의 속성을 제거함

setAttribute(String name,Object value)

Application의 속성을 설정함



11. PageContext 객체

javax.servlet.jsp.PageContext

findAttribute()

모든 Scope내에서 속성을 찾아옴

getException()

예외처리 객체를 가져옴

public abstract Exception getException()

getOut()

Out객체를 가져옴

public abstract JspWriter getOut()

getPage()

Page 객체를 가져옴

public abstract Object getPage()

getRequest()

Request 객체를 가져옴

public abstract ServletRequest getRequest()

getResponse()

Response 객체를 가져옴

public abstract ServletResponse getResponse()

getServletConfig()

Config 객체를 가져옴

public abstract ServletConfig getServletConfig()

getServletContext()

Application 객체를 가져옴

public abstract ServletContext getServletContext()

getSession()

Session 개게를 가져옴

public abstract HttpSession getSession()


12. 예외처리


1)페이지 예외처리

   

<%@ page errorPage="error.jsp" %>

<%@ page isErrorPage="true" %>

<%=exception.toString() %>

try {}catch(Exception e){}finally{}


13. 기타


FileReader클래스 

<%@ page import="java.io.*" errorPage="error.jsp" contentType="text/html;charset=euc-kr" %>

read()

문자열을 하나씩 읽어옴/끝에 도달 -1반환

read(char[] cbuf,int off, int len)

문자를 지정한 위치에서 지정한 길이만큼 읽어옴

read(char[] cbuf)

문자를 한꺼번에 지정한 버펀의 크기만큼 읽어옴


FileWriter클래스 

write(int c)

Ascii코드형식으로 되어있는 문자하나를 파일에 써 넣음

write(char[] cbuf,int off,int len)

버퍼에 저장되어 있는 문자 자료를 지정한 위치에 지정한 길이 만큼씀

write(char[] cbuf)

버퍼에 저장되어있는 자료를 한꺼번에 파일에 씀

write(String str)

String의 객체에 저장되어있는 자료를 파일에 씀

write(String str,int off,int len)

String의 객체에 저장되어있는 자료를 지정한 위치에 지정한 길이만큼 씀

FileWriter testWrite = new FileWriter();

testWriter.close() //닫아 주어야 함


▶문자열->숫자형

int num;

num = Integer.parseInt("12345",진수);

▶숫자형->문자열

String num;

num = Integer.toString(12345);


14. Driver정보

getDriver

시스템에 설치된 드라이브정보를 열거형으로 반환



15. Driver로딩

Class.forName("드라이브 이름“)

ODBC -Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

MSsql -Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

Mysql - Class.forName("org.gjt.mm.mysql.Driver")

Oracle - Class.forName("oracle.jdbc.driver.OracleDriver");

16. 데이터베이스 연결명령어 작성

ODBC - "jdbc:odbc:database_name"

MSsql - "jdbc:microsoft:sqlserver://ip_address:1433;DataBaseName=pubs";

Mysql - "jdbc:mysql://ip_address:3306/database_name"

Oracle - "jdbc:oracle:thin:@ip_address:1521:ORCL"


getConnection(String url,String user,String password)

데이터베이스 연결하고 그 연결객체를 반환

getConnection(String url)

데이터베이스를 연결하고 그 연결객체를 반환


17. Jsp의 Action 태그

▶<jsp:useBean>

<jsp:userBean id="beanInstanceName" scope="page | requst | session | application"

{

   class="package.class" |

   type="package.class" |

   class="package.class" type="package.class" |

   beanName="{package.class | <%=expression %>}"

   type="package.class"

}

   { /> | >other elements </jsp:useBean>}

▶<jsp:setProperty>

<jsp:setProperty name="beanInstanceName"

   {

     property="*" |

     property="propertyName"[param="parameterName"]|

     property="propertyName" value="{string | <%=expression %>}"

   }

  />

▶<jsp:getProperty>

<jsp:getProperty name="beanInstanceName" property="propertyName" />


▶<jsp:include>

<jsp:include page="{relativeURL | <%=expression%>}" flush="true" />

or

<jsp:include page="{relativeURL | <%=expression%>}" flush="true">

  <jsp:param name="parameterName" value="{parameterValue | <%=expression%>}" />

</jsp:include>

▶<jsp:forward>

<jsp:forward page={"relativeURL" | "<%=expression %>"} />

or

<jsp:forward page={"relativeURL" | "<%=expression %>"}>

<jsp:param name="parameterName" value="{parameterValue | <%=expression %>}" />

</jsp:forward>

response.sendRedirect("/test/test.jsp?usrname=jssdd");

▶<jsp:plugin>

<jsp:plugin

     type="bean | applet"

      code="classFileName"

      codebase="classFileDirectoryName"

      [name="instanceName"]

      [archive="URIToArchive,..."]

      [align="bottom | top | middle | left | right "]

      [height="displayPixels"]

      [width="displayPixels"]

      [hspace="leftRightPixels"]

      [vspace="topBottomPixels"]

      [jreversion="JREVersionNumber | 1.1"]

      [nspluginurl="URLToPlugin"]

      [iepluginurl="URLToPlugin"]

      [<jsp:params>

         [<jsp:param name="parameterName" value="{parameterValue | <%=expression %>}" /> ]+

      </jsp:params> ]

      [<jsp:fallback>text message for user </jsp:fallback>]

</jsp:plugin>



18. Cookie의 클래스에서 사용할수 있는 메소드


Cookie(String name,String value)

Cookie 클래스의 생성자 매개변수 name,value를 이용해 해당하는

이름과 값을 가진 쿠키를 생성

getDomain()

쿠키의 도메인을 반환

public String getDomain()

setDomain(String _domain)

쿠키의 도메인을 설정

public void setDomain(String domain)

getMaxAge()

쿠키의 수명을 반환

public int getMaxAge()

setMaxAge(int _expir)

쿠키의 수명을 설정

public void setMaxAge(int seconds)

getName

쿠키의 이름을 반환

public String getName()

getPath()

쿠키의 유효한 URL의 일부를 반환

public String getPath()

setPath(String _path)

쿠키의 경로를 설정함

public void setPath(String path)

getSecure()

쿠키의 보안 채널을 통해 전달되는지의 여부를 반환

public boolean getSecure()

setSecure(boolean _flag)

쿠키를 보안 채널을 통해 전달할 것인지의 여부를 반환

public void setSecure(boolean b)

getValue()

쿠키의 값을 반환

public String getValue()

setValue(String value)

쿠키의 값을 설정함

public void setValue(String value)

getVersion()

쿠키의 버전을 반환, 기본값 0

public int getVersion()

setVersion(int ver)

쿠키의 버전을 설정, 0 이나 1 설정

public void setVersion(int version)

Cookie myCookie = new Cookie("userName", "박선영“);
myCookie.setMaxAge(60*60*24); //하루


19. Exception 객체

getMessage()

에러 메시지 리턴

public String getMessage()

printStackTrace()

에러 출력 스트림으로 스택 틀레이스 정보 출력

public void printStackTrace()

printStackTrace(PrintWriter out)

스택 트레이스 정보를 파라미터로 지정 객체 out으로 출력

public void printStackTrace(PrintWriter out)

printStackTrace(PrintStream out)

스택 트레이스 정보를 파라미터로 지정 객체 out으로 출력

public void printStackTrace(PrintStream out)

[출처] jsp 함수 |작성자 제로스엘

Posted by 1010
05.JSP2008. 7. 25. 16:24
반응형

JSTL 기초, Part 2: core 분석 (한글)

커스텀 태그를 이용한 플로우 제어와 URL 관리

developerWorks
문서 옵션
이 페이지를 이메일로 보내기

이 페이지를 이메일로 보내기


제안 및 의견
피드백

난이도 : 초급

Mark Kolb, 소프트웨어 엔지니어

2003 년 3 월 18 일
2003 년 8 월 08 일 수정

SP Standard Tag Library (JSTL) core 라이브러리는 이름이 말해주듯이, 범위(scoped) 변수를 관리하고 URL과 인터랙팅하는 등의 기본 기능과, 반복과 조건화 같은 근본적인 작동에 필요한 커스텀 태그를 제공한다. 이러한 태그들은 페이지 작성자가 직접 사용하기도 하지만 다른 JSTL 라이브러리와 함께 복잡한 표현 로직에 대한 토대를 제공한다.

이 시리즈의 첫 번째 글에서 JSTL을 처음 보았을 것이다. 거기에서 데이터에 액세스 하고 작동하기 위해 expression language (EL)의 사용법을 설명했다. 여러분이 배운 것 처럼 EL은 JSTL 커스텀 태그의 애트리뷰트에 동적 값을 할당하는데 사용된다. 따라서 빌트인 액션과 기타 커스텀 태그 라이브러리용 요청 시간 애트리뷰트 값을 지정하는 JSP 식과 같은 역할을 한다.

EL의 사용법을 설명하기 위해, core 라이브러리에서 세 개의 태그 (<c:set>, <c:remove>, <c:out>)를 소개했었다. <c:set><c:remove>는 범위 변수를 관리하는데 사용된다. <c:out>은 특별히 EL을 사용하여 계산된 값인 데이터 디스플레이에 사용된다. 기초 학습을 토대로 이제는 core 라이브러리의 나머지 태그를 볼 것이다. 두 가지 주요 카테고리로 나뉜다: 플로우 제어(플로우 제어)와 URL 관리.

예제 애플리케이션

JSTL 태그를 설명하기 위해서 실제 애플리케이션 예제를 사용할 것이다. 대중성과 인지도가 높아졌기 때문에 간단한 자바 기반의 Weblog를 사용할 것이다. (참고자료에서 JSP 페이지와 소스 코드를 다운로드 한다.) Weblog (blog)은 웹 기반 저널로서 Weblog의 작성자가 흥미를 가질만한 주제들에 대한 짧은 주석이다. 일반적으로 웹 상의 아티클이나 토의가 있는 곳 어디든 연결된다. 그림 1은 실행 중인 애플리케이션의 모습이다.


그림 1. Weblog 애플리케이션
Screenshot of the Weblog 예제 애플리케이션

스무 개 정도의 자바 클래스가 전체 구현에 필요하지만 Weblog 애플리케이션 클래스에서는 단 두개(EntryUserBean)만이 프리젠테이션 레이어에 사용된다. JSTL 예제를 이해하려면 이들 두 개의 클래스가 필요하다. 그림 2는 EntryUserBean의 클래스 다이어그램이다.


그림 2. Weblog 애플리케이션(클래스 다이어그램)
Class diagram for Weblog 예제 애플리케이션

Entry 클래스는 Weblog 내의 날짜가 나와있는 엔트리를 나타낸다. 이것의 id 애트리뷰트는 데이터베이스 내의 엔트리를 저장하고 검색하는데 사용된다. 반면 titletext 애트리뷰트는 엔트리의 실제 콘텐트를 나타낸다. 자바 Date 클래스 중 두 개의 인스턴스는 createdlastModified 애트리뷰트에 의해 레퍼런스되며 엔트리가 처음으로 만들어지고 마지막으로 편집 될 때 나타난다. author 애트리뷰트는 UserBean 인스턴스를 참조하면서 엔트리를 만든 사람을 나타낸다.

The UserBean 클래스는 애플리케이션의 권한이 있는 사용자 정보(사용자 이름, 성명, 이메일 주소)를 저장한다. 이 클래스에는 관련 데이터베이스와 인터랙팅하기 위한 id 애트리뷰트도 포함되어 있다. 마지막 애트리뷰트인 rolesString 값 리스트를 참조하면서 애플리케이션 역할과 이에 상응하는 사용자를 구분한다. Weblog 애플리케이션의 경우 일반적인 역할은 "User" (모든 일반적인 애플리케이션 사용자 역할)와 "Author" (Weblog 엔트리를 만들고 편집할 수 있는 사용자를 지정하는 역할) 이다.

이 기사의 다른 시리즈

Part 1, "expression language" (2003년 2월)
Part 3, "보여지는 것도 중요하다!" (2007년 3월)
Part 4, "SQL과 XML 콘텐트에 액세스 하기" (2007년 4월)




위로


플로우 제어(Flow control)

동적 애트리뷰트 값을 지정하는데 JSP 식 대용으로 EL이 사용될 수 있기 때문에 스크립팅 엘리먼트를 사용할 필요가 줄어들었다. 스크립팅 엘리먼트는 JSP 페이지에서 중요한 소스가 될 수 있기 때문에 간단한 대안을 제공한다는 것은 JSTL에 있어서 큰 이점이다.

EL은 JSP 컨테이너에서 데이터를 검색하고 객체 계층을 오가며 간단한 작동을 수행한다. 데이터에 접근하여 조작하는 것 외에도 JSP 스크립팅 엘리먼트의 또 다른 사용 측면은 플로우 제어이다. 특히, 페이지 작성자가 반복되거나 조건적인 콘텐트를 구현하기 위해서 스크립틀릿을 의존한다는 것은 일반적인 일이다. 하지만 그와 같은 작동은 EL의 기능을 넘어서기 때문에, core 라이브러리는 반복, 조건화, 예외 처리 등의 형태로 플로우 제어를 관리 할 다양한 사용자 액션을 제공한다.

반복

웹 애플리케이션의 측면에서, 반복(iteration)은 데이터의 모음을 가져다가 디스플레이 하는데 주로 사용된다. 주로 테이블에 리스트나 열(row) 시퀀스의 형태로 나타난다. 반복 콘텐트를 구현하는 JSTL의 기본 액션은 <c:forEach> 커스텀 태그이다. 이 태그는 두 개의 다른 유형의 반복을 지원한다: 정수 범위내의 반복(이를 테면, 자바의 for 문)과 컬렉션 내의 반복(자바의 IteratorEnumeration 클래스).

정수 범위 내에서 반복하려면 <c:forEach>(Listing 1)의 커스텀 태그의 신택스가 사용된다. beginend 애트리뷰트는 정적 정수 값 또는 정수 값을 계산하는 수식이 되어야한다. 이들은 각각 반복을 위한 인덱스의 초기 값과 반복이 멈추는 지점의 인덱스 값을 지정한다. <c:forEach>를 사용하여 정수 범위에서 반복할 때, 이 두개의 애트리뷰트가 필요하며 다른 모든 것들은 선택사항이다.


Listing 1. <c:forEach> 액션을 통한 반복 신택스
<c:forEach var="name" varStatus="name"
begin="expression" end="expression" step="expression">
body content
</c:forEach>

		

step 애트리뷰트 또한 정수 값을 갖고 있어야한다. 매번 반복한 후에 인덱스에 추가될 양(amount)을 정한다. 따라서 반복 인덱스는 begin 애트리뷰트 값에서 시작하고 step 애트리뷰트의 값에 의해 증가하며 end 애트리뷰트의 값을 초과할 때 정지한다. step 애트리뷰트가 생략되면 step 크기는 1로 초기화된다.

var 애트리뷰트가 지정되면 지정된 이름을 가진 범위 변수가 만들어지고 인덱스의 현재 값으로 할당된다. 이 범위 변수는 <c:forEach> 태그의 바디 내에서 액세스 될 수 있다. Listing 2는 <c:forEach> 액션의 예제이다.


Listing 2. <c:forEach> 태그
<table>
<tr><th>Value</th>
    <th>Square</th></tr>
<c:forEach var="x" begin="0" end="10" step="2">
  <tr><td><c:out value="${x}"/></td>
      <td><c:out value="${x * x}"/></td></tr>
</c:forEach>
</table>

		

이 예제 코드는 다섯 개 짝수의 제곱을 테이블로 만들었다. 그림 3이 그 결과이다 .


그림 3. Listing 2의 결과
Output of Listing 2

컬렉션의 멤버들 사이를 반복할 때 <c:forEach> 태그의 추가 애트리뷰트인 items 애트리뷰트가 사용된다. (Listing 3). 이러한 형식의 <c:forEach> 태그를 사용할 때, items 애트리뷰트는 유일하게 필요한 애트리뷰트이다.


>Listing 3. <c:forEach> 액션을 통한 반복 신택스
<c:forEach var="name" items="expression" varStatus="name"
 begin="expression" end="expression" step="expression">
  body content
</c:forEach>			
		

자바 플랫폼에서 제공되는 표준 컬렉션 타입은 <c:forEach> 태그에 의해 지원된다. 어레이 엘리먼트를 통해 반복할 때 이 액션을 사용할 수 있다. 표 1은 items 애트리뷰트에 의해 지원되는 값들의 리스트이다. 테이블의 마지막 열이 표시될 때, JSTL은 이것의 인터페이스(javax.servlet.jsp.jstl.sql.Result)를 정의한다.

표 1. <c:forEach> 태그의 items 애트리뷰트에서 지원되는 컬렉션

items item 값의 결과
java.util.Collection 호출에서 iterator()까지의 엘리먼트
java.util.Map java.util.Map.Entry의 인스턴스
java.util.Iterator Iterator 엘리먼트
java.util.Enumeration Enumeration 엘리먼트
Object 인스턴스 어레이 Array 엘리먼트
초기 값들의 어레이 래핑된 어레이 엘리먼트
콤마로 나뉘어진 String 서브스트링
javax.servlet.jsp.jstl.sql.Result SQL 쿼리의 열(row)

Listing 4는 컬렉션을 통한 반복에 사용되는 <c:forEach> 태그이다. entryList 라는 범위 변수가 Entry 객체의 리스트로 설정되었다. <c:forEach> 태그가 이 리스트의 각 엘리먼트를 처리한다. blogEntry 라는 범위 변수로 이것을 할당하고 두 개의 테이블 열을 만든다. 하나는 Weblog 엔트리의 title 이고 다른 하나는 이것의 text이다. 이 속성들은 한 쌍의 <c:out> 액션과 이에 상응하는 EL 식을 통해 blogEntry 변수에서 검색된다. Weblog 엔트리의 타이틀과 텍스트에 HTML이 포함되어있기 때문에 <c:out>escapeXml 애트리뷰트는 false로 설정된다. (그림 4).


Listing 4. <c:forEach> 태그를 사용하여 Weblog 엔트리 디스플레이 하기
<table>
  <c:forEach items="${entryList}" var="blogEntry">
    <tr><td align="left" class="blogTitle">
      <c:out value="${blogEntry.title}" escapeXml="false"/>
    </td></tr>
    <tr><td align="left" class="blogText">
      <c:out value="${blogEntry.text}" escapeXml="false"/>
    </td></tr>
  </c:forEach>
</table>
		


그림 4. Listing 4의 결과
Output of Listing 4

남아있는 <c:forEach> 애트리뷰트인 varStatus는 정수 범위의 반복이나 컬렉션 범위의 반복에서 똑같은 역할을 한다. var 애트리뷰트와 마찬가지로, varStatus는 범위 변수를 만드는데 사용된다. 현재 인덱스 값이나 현재 엘리먼트를 저장하는 대신에 이 변수는 javax.servlet.jsp.jstl.core.LoopTagStatus 의 인스턴스로 할당된다. 이 클래스는 일련의 속성을 정의한다. (표 2).

표 2. LoopTagStatus 객체의 속성

속성 Getter Description
current getCurrent() 현재 반복 라운드 아이템
index getIndex() 현재 반복 라운드의 제로 기반(zero-based) 인덱스
count getCount() 현재 반복 라운드의 1 기반(one-based) 인덱스
first isFirst() 현재 라운드가 반복을 통한 첫 번째 패스임을 나타내는 플래그
last isLast() 반복현재 라운드가 반복을 통한 마지막 패스임을 나타내는 플래그
begin getBegin() begin 애트리뷰트의 값
end getEnd() end 애트리뷰트의 값
step getStep() step 애트리뷰트의 값

Listing 5는 varStatus 애트리뷰트가 사용되는 방법을 나타낸 예제이다. Listing 4의 코드를 수정하여 Weblog 엔트리의 숫자세기를 타이틀을 디스플레이하는 테이블 열에 추가한다. 이것은 varStatus 애트리뷰트의 값을 지정하고 결과 범위 변수의 카운트 속성에 액세스 하면 된다. 결과는 그림 5 이다.


Listing 5. varStatus 애트리뷰트를 사용하여 Weblog 엔트리의 카운트 디스플레이하기
<table>
  <c:forEach items=
    "${entryList}" var="blogEntry" varStatus="status">
    <tr><td align="left" class="blogTitle">
      <c:out value="${status.count}"/>.
      <c:out value="${blogEntry.title}" escapeXml="false"/>
    </td></tr>
    <tr><td align="left" class="blogText">
      <c:out value="${blogEntry.text}" escapeXml="false"/>
    </td></tr>
  </c:forEach>
</table>

		


그림 5. Listing 5의 결과
Output of Listing 5

<c:forEach> 이외에도, core 라이브러리는 두 번째 반복 태그인 <c:forTokens>를 제공한다. 이것의 액션은 자바의 StringTokenizer 클래스의 JSTL 이다. <c:forTokens> 태그(Listing 6)는 컬렉션 지향 버전의 <c:forEach>와 같은 애트리뷰트를 갖고 있다. <c:forTokens>의 경우 토큰화 될 스트링은 items 애트리뷰트를 통해 지정되는 반면 토큰을 만드는데 사용되는 지정자(deliniter)는 delims 애트리뷰트를 통해 제공된다. <c:forEach> 경우와 마찬가지로, begin, end, step애트리뷰트를 사용하여 토큰이 상응하는 인덱스 값들과 매칭되는 것에 프로세스 되도록 제한 할 수 있다.


Listing 6. <c:forTokens> 액션
<c:forTokens var="name" items="expression"
    delims="expression" varStatus="name"
    begin="expression" end="expression" step="expression">
  body content
</c:forTokens>

		

조건화

동적 콘텐트를 포함하고 있는 웹 페이지라면 다양한 형식의 콘텐트를 볼 수 있는 다양한 사용자 카테고리가 필요할 것이다. Weblog에서 방문자들은 엔트리를 읽고 피드백을 제출 할 뿐만 아니라 권한을 받은 사용자는 새로운 엔트리를 게시하거나 기존 콘텐트를 편집할 수 있어야 한다.

JSP 페이지 내에 그러한 기능을 구현하고 리퀘스트 기반으로 디스플레이 하고자하는 것을 제어하도록 조건 로직을 사용함으로서 가용성과 소프트웨어 관리는 향상된다. core 라이브러리는 두 개의 다른 조건화 태그인 <c:if><c:choose>를 제공하는데 다음의 기능들을 구현한다.

이 두 가지 액션 중 좀더 단순한 <c:if>는 간단한 테스트 식을 계산한 다음 식이 true로 되었을 때만 바디 콘텐트를 처리한다. 그렇지 않다면 태그의 바디 콘텐트는 무시된다. Listing 7에서 보듯, <c:if>는 테스트의 결과를 varscope 애트리뷰트를 통해 범위 변수로 할당할 수 있다. 이 기능은 테스트 비용이 비쌀 경우 유용하다. 결과는 범위 변수에 캐시되고 <c:if>나 다른 JSTL 태그로의 연속 호출시에 검색된다.


Listing 7. <c:if> 조건 액션 신택스
<c:if test="expression" var="name" scope="scope">
  body content
</c:if>

		

Listing 8은 <c:forEach> 태그의 LoopTagStatus 객체의 first 속성으로 사용된 <c:if> 를 보여준다. 이 경우, 그림 6 에서 보듯, Weblog 엔트리의 구현 날짜는 첫 번째 엔트리 위에 디스플레이 된다. 하지만 다른 엔트리 앞에 반복되지 않는다.


Listing 8. <c:if>를 사용하여 Weblog 엔트리 날짜 디스플레이 하기
<table>
<c:forEach items=
"${entryList}" var="blogEntry" varStatus="status">
<c:if test="${status.first}">
<tr><td align="left" class="blogDate">
<c:out value="${blogEntry.created}"/>
</td></tr>
</c:if>
<tr><td align="left" class="blogTitle">
<c:out value="${blogEntry.title}" escapeXml="false"/>
 </td></tr>
<tr><td align="left" class="blogText">
<c:out value="${blogEntry.text}" escapeXml="false"/>
</td></tr>
</c:forEach>
</table>

		


그림 6. Listing 8의 결과
Output of Listing 8

Listing 8 처럼, <c:if> 태그는 조건화된 콘텐트에 대해 매우 간략한 노트를 제공한다. 디스플레이 되어야하는 콘텐트가 무엇인지를 결정해야하는 중립적인 테스트가 필요할 경우, JSTL core 라이브러리는 <c:choose> 액션을 제공한다. <c:choose> 신택스는 Listing 9와 같다.


Listing 9. <c:choose> 액션 신택스
<c:choose>
  <c:when test="expression">
    body content
  </c:when>
  ...
  <c:otherwise>
    body content
  </c:otherwise>
</c:choose>

		

테스트 되는 각 조건은 상응하는 <c:when> 태그에 의해 나타난다. testtrue로 평가된 첫 번째 <c:when> 태그의 콘텐트만 프로세스된다. 어떤 <c:when> 테스트도 true로 리턴되지 않으면 <c:otherwise> 태그의 바디 콘텐트가 프로세스 된다. <c:otherwise> 태그가 선택적이라는 것을 주목하라. <c:choose> 태그는 최대 한 개의 중첩 <c:otherwise> 태그를 가질 수 있다. 모든 <c:when> 테스트가 false가 되고 어떤 <c:otherwise> 액션도 나타나지 않으면 <c:choose> 바디 콘텐트는 프로세스 되지 않는다.

Listing 10은 <c:choose> 태그의 실행 예제이다. 여기에서 프로토콜 정보는 리퀘스트 객체에서 검색되고 간단한 스트링 비교를 사용하여 테스트된다. 테스트 결과에 따라 상응하는 텍스트 메시지가 디스플레이된다.


Listing 10. <c:choose>를 이용한 콘텐트 조건화
<c:choose>
  <c:when test="${pageContext.request.scheme eq 'http'}">
    This is an insecure Web session.
  </c:when>
  <c:when test="${pageContext.request.scheme eq 'https'}">
    This is a secure Web session.
  </c:when>
  <c:otherwise>
    You are using an unrecognized Web protocol. How did this happen?!
  </c:otherwise>
</c:choose>
		

예외 처리

마지막 플로우 제어 태그는 <c:catch>이다. 이것은 JSP 페이지 내에서 기본적인 예외처리를 담당한다. 좀더 구체적으로 말하면 이 태그의 바디 콘텐트 내에서 발생하는 모든 예외가 잡히면 무시된다. 하지만 예외가 발생하고 <c:catch> 태그의 선택적인 var 애트리뷰트가 지정되면 예외는 지정된 변수로 할당되어 페이지 자체 내에서 에러 처리를 할 수 있다. Listing 11은 <c:catch>의 신택스이다. (예제는 Listing 18이다)


Listing 11. <c:catch> 실행 신택스
<c:catch var="name">
  body content
</c:catch>
		




위로


URL 작동

JSTL core 라이브러리의 나머지 태그는 URL에 초점을 맞춘다. 이 중 첫 번째는 <c:url> 태그인데 URL 생성에 사용된다. 특히, <c:url>은 J2EE 웹 애플리케이션용 URL을 구현할 때 중요하게 쓰이는 세 가지 엘리먼트를 제공한다:

  • 현재 서블릿 콘텍스트 이름이 됨
  • 세션 관리를 위한 URL 재작성
  • 요청 매개변수 이름과 값의 URL 인코딩

value 애트리뷰트가 사용되었다. 기본 URL을 지정하기 위해서. 태그는 필요할 경우 변형한다. 이 기본 URL이 포워드 슬래시로 시작하면 서블릿 콘텍스트 이름이 만들어진다. 구체적인 콘텍스트 이름은 context 애트리뷰트를 사용하여 제공될 수 있다. 이 애트리뷰트가 생략되면 현재 서블릿 콘텍스트 이름이 사용된다. 서블릿 콘텍스트 이름이 개발 보다는 전개 시에 결정될 때 유용하다.


isting 12. <c:url> 작동 신택스
<c:url value="expression" context="expression"
    var="name" scope="scope">
  <c:param name="expression" value="expression"/>
  ...
</c:url>

		

URL 재작성은 <c:url> 작동에 의해 자동적으로 수행된다. JSP 컨테이너가 사용자의 현재 세션 아이디를 저장하고 있는 쿠키를 검사하면 재작성은 필요없다. 쿠키가 존재하지 않으면 <c:url>로 만들어진 모든 URL은 재작성되어 세션 아이디를 인코딩한다. 계속되는 요청에도 적절한 쿠키가 존재하지 않으면 <c:url>은 이 아이디를 포함하기 위한 URL 재작성을 멈춘다.

var 애트리뷰트를 위해 값이 제공되면 생성된 URL은 특정 범위 변수의 값으로 할당된다. 그렇지 않다면 결과 URL은 현제 JspWriter를 사용하여 아웃풋이 된다. 결과를 직접 산출하는 기능은 <c:url> 태그가 값으로서 나타날 수 있도록 한다. 예를들어 HTML의 <a> 태그의 href 애트리뷰트와 같다.


Listing 13. HTML 태그용 애트리뷰트 값으로 URL 생성하기
<a href="<c:url value='/content/sitemap.jsp'/>">View sitemap</a>

		

마지막으로 모든 요청 매개변수가 중첩된 <c:param> 태그를 통해 지정되면 그들의 이름과 값은 HTTP GET 요청용 표준 표기법을 사용하여 생성된 URL에 붙여진다. 또한 URL 인코딩이 수행된다. 유효 URL을 만들어내기 위해 변형되어야하는 매개변수의 이름 또는 값에 나타나는 모든 문자는 적절히 변환된다.


Listing 14. 요청 매개변수를 가진 URL 만들기
<c:url value="/content/search.jsp">
  <c:param name="keyword" value="${searchTerm}"/>
  <c:param name="month" value="02/2003"/>
</c:url>

		

Listing 14의 JSP 코드는 blog이라는 이름의 서블릿 콘텍스트에 전개되었다. 범위 변수 searchTerm의 값은 "core library"로 설정되었다. 세션 쿠키가 탐지되면 Listing 14에서 만들어진 URL은 Listing 15와 같다.


Listing 15. 세션 쿠키가 있는 상태에서 만들어진 URL
/blog/content/search.jsp?keyword=foo+bar&month=02%2F2003

		

어떤 세션 쿠키도 없으면 Listing 16의 URL이 그 결과이다. 서블릿 콘텍스트가 프리펜드 되었고 URL 인코딩이된 요청 매개변수가 붙었다.


Listing 16. 세션 쿠키 없이 만들어진 URL
/blog/content/search.jsp;jsessionid=233379C7CD2D0ED2E9F3963906DB4290
  ?keyword=foo+bar&month=02%2F2003
		




위로


중요한 콘텐트

JSP는 두 개의 빌트인 메커니즘을 갖고 있어 다른 URL에서 온 콘텐트를 JSP 페이지로 만든다. 그것이 바로 include 지시문과 <jsp:include> 작동이다. 두 경우 모두, 포함되어야 하는 콘텐트가 페이지로서 같은 웹 애플리케이션의 부분이 되어야 한다. 두 가지 태그의 주요 차이점은 include 지시문은 페이지가 컴파일하는 동안 포함된 콘텐트를 결합하고 <jsp:include> 액션은 JSP 페이지의 요청 프로세스 동안 작동한다는 것이다.

core 라이브러리의 <c:import> 액션은 더욱 일반적이면서 강력한 버전의 <jsp:include>라 할 수 있다. <jsp:include> 처럼, <c:import>는 요청 시간 작동이고 기본 태스크는 다른 웹 리소스의 콘텐트를 JSP 페이지에 삽입하는 것이다.


>Listing 17. <c:import>작동 신택스
<c:import url="expression" context="expression"
    charEncoding="expression" var="name" scope="scope">
  <c:param name="expression" value="expression"/>
  ...
</c:import>

		

임포트 되어야하는 콘텐트용 URL은 url 애트리뷰트를 통해 지정된다. 관련 URL이 허용되고 현재 페이지의 URL에 대비하여 분해된다. url 애트리뷰트의 값은 포워드 슬래시로 시작한다. 하지만 로컬 JSP 컨테이너 내에서는 절대 URL로서 인터프리팅된다. context 애트리뷰트 값 없이는 그와 같은 절대 URL은 현재 서블릿 콘텍스트에서 리소스를 참조하는 것으로 간주된다. 명확한 콘텍스트가 context 애트리뷰트를 통해 지정되면 절대(로컬) URL은 이름을 가진 서블릿 콘텍스트에 대해 분해된다.

<c:import> 액션은 로컬 콘텐트 접근에만 제한되지 않는다. 프로토콜과 호스트 이름을 포함한 전체 URI는 url 애트리뷰트의 값으로 지정될 수 있다. 사실 프로토콜은 HTTP로 제한되지 않는다. java.net.URL 클래스로 지원되는 모든 프로토콜은 <c:import>url 애트리뷰트용 값에서 사용된다. (Listing 18).

<c:import> 액션은 FTP 프로토콜을 통해 액세스 되는 문서의 콘텐트를 포함하는데 사용된다. <c:catch> 액션은 FTP 파일 전송 동안 발생하는 모든 에러를 처리하기 위해 사용된다. <c:catch>var 변수를 사용하여 예외용 범위 변수를 지정하고 <c:if>를 사용하여 값을 검사하면 된다. 예외가 발생하면 범위 변수로의 할당이 발생한다.


Listing 18. <c:import>와 <c:catch>의 결합 예제
<c:catch var="exception">
  <c:import url="ftp://ftp.example.com/package/README"/>
</c:catch>
<c:if test="${not empty exception}">
  Sorry, the remote content is not currently available.
</c:if>
		

<c:import> 액션의 마지막 두 개의 애트리뷰트는 varscope이다. var 애트리뷰트는 지정된 유알엘에서 가져온 콘텐트가 현재의 JSP 페이지에 포함되도록 하는 것이 아니라 변수에 저장되도록 한다. scope 애트리뷰트는 이 변수의 범위 지정을 제어하고 페이지 범위를 초기화한다.




위로


요청 리다이렉션(redirection)

마지막 core 라이브러리 태그는 <c:redirect>이다. 이 액션은 HTTP 리다이렉트 응답을 사용자 브라우저로 보내는데 사용되며, JSTL의 javax.servlet.http.HttpServletResponsesendRedirect() 메소드와 같다. 이 태그의 urlcontext 애트리뷰트 (Listing 19) 작동은 <c:import>urlcontext 애트리뷰트와 같다.


Listing 19. <c:redirect>action
<c:redirect url="expression" context="expression">
  <c:param name="expression" value="expression"/>
  ...
</c:redirect>

		

Listing 20은 <c:redirect> 작동 모습이다. Listing 18의 에러 메시지를 지정된 에러 페이지 리다이렉트로 대체한다. 이 예제에서 <c:redirect> 태그는 표준 <jsp:forward> 작동과 비슷한 방식으로 사용된다. 요청 디스패쳐를 통한 포워딩은 서버쪽에서 구현되지만 리다이렉트는 브라우저에서 수행된다. 개발자의 관점에서 보면 포워딩은 리다이렉팅보다 효율적이다. 하지만 <c:redirect> 액션이 좀더 유연하다. <jsp:forward>는 현재 서블릿 콘텍스트 내에서 다른 JSP 페이지로만 디스패치 할 수 있기 때문이다.


Listing 20. 예외에 대한 응답으로 리다이렉팅
<c:catch var="exception">
  <c:import url="ftp://ftp.example.com/package/README"/>
</c:catch>
<c:if test="${not empty exception}">
  <c:redirect url="/errors/remote.jsp"/>
</c:if>

		

소셜 북마크

mar.gar.in mar.gar.in
digg Digg
del.icio.us del.icio.us
Slashdot Slashdot

사용자 관점과의 주요 차이점은 리다이렉트가 브라우저로 디스플레이된 URL을 업데이트하고 북마크 설정에 영향을 미친다는 것이다. 반면 포워딩은 엔드유저에게 투명하다. <c:redirect><jsp:forward> 중의 선택은 사용자 경험에 따라 달라진다.



참고자료



필자소개

Mark Kolb는소프트웨어 엔지니어이며 Web Development with JavaServer Pages, 2nd Edition의 공동 저자이다.

Posted by 1010
05.JSP2008. 7. 25. 16:22
반응형

JSTL 기초, Part 1: Expression Language (한글)

JSP 애플리케이션용 MA 단순화하기

developerWorks
문서 옵션
이 페이지를 이메일로 보내기

이 페이지를 이메일로 보내기


제안 및 의견
피드백

난이도 : 초급

Mark A. Kolb, 소프트웨어 엔지니어

2003 년 2 월 11 일
2003 년 11 월 18 일 수정

JSP Standard Tag Library (JSTL)은 일반적인 웹 애플리케이션 기능(반복(iteration)과 조건, 데이터 관리 포맷, XML 조작, 데이터베이스 액세스)을 구현하는 커스텀 태그 라이브러리 모음이다. 소프트웨어 엔지니어인 Mark Kolb은 JSTL 태그의 사용방법을 설명한다. 표현층(presentation layer)에서 소스 코드를 제거하여 소프트웨어 관리를 단순화시키는 방법도 설명한다. 이외에도 JSTL의 단순화된 Expression Language에 대한 설명도 포함되어 있다.

JavaServer Pages (JSP)는 J2EE 플랫폼을 위한 표준 표현 레이어(presentation-layer) 이다. JSP는 페이지 콘텐트를 동적으로 생성할 수 있는 전산을 수행 할 수 있는 스크립팅 엘리먼트와 액션을 제공한다. 스크립팅 엘리먼트는 프로그램 소스 코드가 JSP 코드에 포함될 수 있도록 한다. 페이지가 사용자 요청에 대한 응답으로 렌더링 될 때 실행할 목적이다. 액션(actions)은 전산 작동을 JSP 페이지의 템플릿 텍스트를 구성하고 있는 HTML 이나 XML과 거의 흡사하게하는 태그로 인캡슐한다. JSP 스팩에 표준으로 정의된 몇 가지의 액션들이 있다. 하지만 JSP 1.1 부터 개발자들은 커스텀 태그 라이브러리 형태로 자신만의 액션들을 만들 수 있다.

JSP Standard Tag Library (JSTL)는 JSP 1.2 커스텀 태그 라이브러리 모음으로서 광범위한 서버측 자바 애플리케이션에 일반적으로 쓰이는 기본 기능들을 구현한다. JSTL은 데이터 포맷, 반복 콘텐트 또는 조건 콘텐트 같은 전형적인 표현 레이어를 위한 표준 구현을 제공하기 때문에, JSP 작성자들이 애플리케이션 개발에 집중하는데 도움이 된다.

물론, 스크립틀릿, 익스프레션, 선언 같은 JSP 스크립팅 엘리먼트를 사용하는 태스크를 구현할 수 있다. 예를 들어 조건 콘텐트(conditional content)는 세 개의 스크립틀릿(Listing 1의 하이라이트 부분)을 사용하여 구현될 수 있다. 페이지 내에 프로그램 소스 코드를 임베딩하는 것에 의존하기 때문에 스크립팅 엘리먼트가 소프트웨어 관리 태스크를 매우 복잡하게 하는 경향이있더라도 JSP 페이지는 그들을 사용한다. Listing 1의 스크립틀릿 예제는 브레이스들의 적절한 매칭에 매우 의존한다. 조건화된 콘텐트 내에 추가 스크립틀릿을 중첩하는 것은 신택스 에러가 갑자기 일어났다면 페이지가 JSP 콘테이너에 의해 컴파일 될 때 결과 에러 메시지를 합리화하는 것은 도전이 될 수 있다.


Listing 1. 스크립틀릿을 통해 조건 콘텐트 구현하기
  <% if (user.getRole() == "member")) { %>
    <p>Welcome, member!</p>
<% } else { %>
    <p>Welcome, guest!</p>
<% } %>

그와 같은 프로그램을 해결하는데에는 프로그래밍 경험이 많이 필요하다. JSP 페이지의 마크업이 페이지 레이아웃과 그래픽 디자인에 익숙한 디자이너에 의해 개발 및 관리되는데 반해 그와 같은 페이지 내의 스크립팅 엘리먼트는 문제가 생길 때 프로그래머가 개입해야한다. 하나의 파일안에 있는 코드에 대한 책임을 공유하는 것은 JSP 페이지의 개발, 디버깅, 향상을 성가신일로 만든다. JSTL은 일반적인 기능을 커스텀 태그 라이브러리의 표준 세트로 패키징했기 때문에 JSP 작성자들이 스크립팅 엘리먼트에 대한 필요를 줄이고 관련된 관리 비용을 피할 수 있도록 한다.

이 기사의 다른 시리즈

Part 2, "core 분석" (2003년 3월)
Part 3, "보여지는 것도 중요하다!" (2007년 3월)
Part 4, "SQL과 XML 콘텐트에 액세스 하기" (2007년 4월)




위로


JSTL 1.0

02년 6월에 릴리스된 JSTL 1.0은 네 개의 커스텀 태그 라이브러리(core, format, xml, sql)와 두 개의 범용 태그 라이브러리 밸리데이터(ScriptFreeTLV & PermittedTaglibsTLV)로 구성되어 있다. core 태그 라이브러리는 커스텀 액션을 제공하여 범위 변수를 통해 데이터를 관리할 수 있도록하며 페이지 콘텐트의 반복과 조건화를 수행할 수 있도록 한다. 또한 URL에서 생성 및 작동할 수 있는 태그도 제공한다. format 태그 라이브러리는 이름이 시사하는 바와 같이 데이터 특히 숫자와 날짜를 포맷하는 액션을 정의한다. 국지화 된 리소스 번들을 사용하여 JSP 페이지의 국제화도 지원한다. xml 라이브러리에는 XML을 통해 표현된 데이터를 조작할 수 있는 테그가 포함되어 있다. sql 라이브러리는 관계형 데이터베이스를 쿼리하는 액션을 정의한다.

두 개의 JSTL 태그 라이브러리 밸리데이터는 개발자들이 JSP 애플리케이션 내에서 표준을 코딩하도록 한다. ScriptFreeTLV 밸리데이터를 설정하여 JSP 페이지 내에 있는 다양한 스크립팅 엘리먼트(스크립틀릿, 표현, 선언)의 다양한 유형을 사용하는 것을 막는다. 이와 비슷하게 PermittedTaglibsTLV 밸리데이터는 애플리케이션의 JSP 페이지들에 의해 액세스된 커스텀 태그 라이브러리(JSTL 태그 라이브러리 포함)을 제한한다.

JSTL은 J2EE 플랫폼에 필요한 컴포넌트가 될 것이지만 적은 수의 애플리케이션 서버들만이 이를 포함하고 있는 것이 현실이다. JSTL 1.0의 레퍼런스 구현은 Apache Software Foundation의 Jakarta Taglibs 프로젝트의 일부로서 사용할 수 있다. (참고자료). 레퍼런스 구현에 있는 커스텀 태그 라이브러리는 JSTL 지원을 추가하기 위해 JSP 1.2와 Servlet 2.3 이상 스팩을 지원하는 모든 애플리케이션 서버에 통합될 수 있다.




위로


Expression language

JSP 1.2에서 JSP 액션의 애트리뷰트는 정적 캐릭터 스트링이나 익스프레션을 사용하여 지정된다. 예를 들어 Listing 2의 경우 정적 값들은 <jsp:setProperty> 액션의 nameproperty 애트리뷰트를 위해 지정된다. 반면 익스프레션은 이것의 값 애트리뷰트를 지정하는데 사용된다. 이 액션은 요청 매개변수의 현재 값을 이름이 붙여진 빈 속성으로 할당하는 효과를 갖고 있다. 이러한 방식으로 사용된 익스프레션은 request-time attribute values이라 일컬어지며 애트리뷰트 값을 동적으로 지정하기위한 JSP 스팩에 내장된 유일한 메커니즘이다.


Listing 2. request-time attribute value을 결합하는 JSP 액션
<jsp:setProperty name="user" property="timezonePref"
          value='<%= request.getParameter("timezone") %>'/>


request-time attribute values가 익스프레션을 사용하여 지정되기 때문에 다른 스크립팅 엘리먼트와 같은 소프트웨어 관리 문제가 일어날 수 있다. 이런 이유로 인해 JSTL 커스텀 태그는 동적 애트리뷰트 값을 지정하기 위한 대안 메커니즘을 지원한다. JSP 익스프레션을 사용하는 것 보다 JSTL 액션용 애트리뷰트 값이 단순화 된 expression language (EL)를 사용하여 지정될 수 있다. EL은 JSP 컨테이너에 있는 데이터를 검색 및 조작할 식별자, 접근자, 연산자를 제공한다. EL은 EcmaScript(참고자료)와 XML Path Language (XPath)에 약간 의존하기 때문에 신택스는 페이지 디자이너와 프로그래머 모두 에게 익숙하다. EL은 객체와 속성들을 검색하면서 간단한 작동을 수행한다. 이것은 프로그래밍 언어도 스크립팅 언어도 아니다. JSTL 태그와 결합하면 간단하고 편리한 표기를 사용하여 복잡한 작동이 표현될 수 있다. EL 익스프레션은 달러 표시($)와 중괄호 ({})를 앞에 붙여 사용하여 범위를 정한다.(Listing 3)


Listing 3. JSTL 액션: EL 익스프레션 범위 지정
<c:out value="${user.firstName}"/>


여러개의 익스프레션들과 정적 텍스트를 결합하여 스트링 연결을 통해 동적 애트리뷰트 값을 만들 수 있다.(Listing 4). 개별 익스프레션들은 식별자, 접근자, 리터럴, 연산자로 구성되어 있다. 식별자는 데이터 센터에 저장된 데이터 객체를 참조하는데 사용된다. EL은 11 개의 식별자를 보유하고 있다. 11 개의 EL 내장 객체에 상응하는 것들이다. 다른 모든 식별자들은 범위 변수를 참조하는 것으로 간주된다. 접근자는 객체의 속성 또는 컬렉션의 엘리먼트를 검색하는데 사용된다. 리터럴은 고정된 값들(숫자, 문자, 스트링, 부울, null)을 나타낸다. 연산자는 데이터와 리터럴이 결합 및 비교될 수 있도록 한다.


Listing 4. 정적 텍스트와 여러 EL 익스프레션을 결합하여 동적 애트리뷰트 값 지정하기
<c:out value="Hello ${user.firstName} ${user.lastName}"/>





위로


범위 변수(Scoped variables)

<jsp:useBean> 액션을 통한 JSP 에이피아이는 데이터가 저장될 수 있도록 하며 JSP 컨테이너 내에 네 개의 다른 범위에서 데이터가 검색될 수 있도록 한다. JSTL은 이러한 범위 내에 객체를 할당하고 제거할 추가 액션을 제공한다. 더욱이, EL은 범위 변수 같은 객체들을 검색하는 빌트인 지원을 제공한다. 특히 EL의 내장 객체 중 하나라도 상응하지 않는 EL 익스프레션에 있는 식별자는 네 개의 JSP 스콥 중 하나에 저장된 객체를 참조하는 것으로 자동 간주된다:

  • 페이지 범위
  • 요청 범위
  • 세션 범위
  • 애플리케이션 범위

페이지 범위에 저장된 객체들은 특정 요청에 대한 페이지가 프로세스 되는 동안 검색될 수 있다. 요청 범위 내에 저장된 객체들은 요청 프로세스에 참여한 모든 페이지들이 프로세스 하는 동안 검색될 수 있다. 객체가 세션 범위에 저장되어있다면 웹 애플리케이션과의 단일 인터랙트브 세션 동안 사용자가 액세스 한 페이지로 검색될 수 있다. 웹 애플리케이션이 언로드(unload) 될 때 까지 애플리케이션 범위에 저장된 객체는 모든 페이지에서 접근가능하며 모든 사용자들이 접근할 수 있다.

캐릭터 스트링을 희망하는 범위에 있는 객체로 매핑하여 범위안에 객체를 저장할 수 있다. 이러한 경우에는 같은 캐릭터 스트링을 제공하여 범위에서 객체를 검색할 수도 있다. 스트링은 범위 매핑 중 검색되고 매핑된 객체는 리턴된다. Servlet API 내에서 그와 같은 객체들은 상응하는 범위의 애트리뷰트로서 언급된다. EL의 경우 애트리뷰트와 관련된 캐릭터 스트링은 변수 이름으로 간주될 수도 있다.

EL에서 내장 객체들과 관련이 없는 식별자들은 JSP 범위에 저장된 객체들을 명명하는 것으로 간주된다. 그와 같은 식별자는 페이지 범위를 검사하고 그 다음에는 요청 범위, 세션 범위, 애플리케이션 범위 순으로 검사한다. 식별자의 이름이 그 범위에 저장된 객체 이름과 매칭되는지의 여부가 테스트된다. 첫 번째 매치는 EL 식별자의 값으로 리턴된다. EL 식별자는 범위 변수를 참조하는 것으로 간주될 수 있다.

기술적인 관점에서 보면 내장 객체로 매핑하지 않는 식별자는 PageContext 인스턴스의 findAttribute() 메소드를 사용하여 평가되면서 현재 핸들되는 요청에 대해 익스프레션이 발생하는 페이지의 프로세싱을 나타낸다. 식별자의 이름은 이 메소드에 대한 인자로서 전달된다. 이것은 같은 이름을 가진 애트리뷰트에 대한 네 개의 범위를 검색한다. 발견된 첫 번째 매치는 findAttribute() 메소드 값으로 리턴된다. 그와 같은 애트리뷰트가 네 개의 범위 중에 없으면 null이 리턴된다.

궁극적으로 범위 변수는 네 개의 EL 식별자로서 사용될 수 있는 이름을 가진 JSP 범위의 에트리뷰트라고 할 수 있다. 영숫자 이름으로 할당되는 한 범위 변수는 JSP 에 존재하는 모든 메커니즘으로 만들어져 애트리뷰트를 설정할 수 있다. 여기에는 빌트인 <jsp:useBean> 액션은 물론 setAttribute() 메소드가 포함된다. 게다가 네 개의 JSTL 라이브러리에서 정의된 많은 커스텀 태그들은 스스로 범위 변수로서 애트리뷰트 값을 설정할 수 있다.




위로


내장 객체(Implicit objects)

11 개의 EL 내장 객체용 식별자는 표 1과 같다. JSP 내장 객체와 혼동하지 말것!

표 1. EL 내장 객체

Category 식별자 설명
JSP pageContext 현재 페이지의 프로세싱과 상응하는 PageContext 인스턴스
범위 pageScope 페이지 범위 애트리뷰트 이름과 값과 관련된 Map
requestScope 요청 범위 애트리뷰트 이름과 값과 관련된 Map
sessionScope 세션 범위 애트리뷰트 이름과 값과 관련된 Map
applicationScope 애플리케이션 범위 애트리뷰트 이름과 값과 관련된 Map
요청 매개변수 param 요청 매개변수의 기본 값을 이름으로 저장하는 Map
paramValues 요청 매개변수의 모든 값을 String 어레이로서 저장하는 Map
요청 헤더 header 요청 헤더의 기본 값을 이름으로 저장하는 Map
headerValues 요청 헤더의 모든 값을 String 어레이로서 저장하는 Map
쿠키 cookie 요청에 수반되는 쿠키들을 이름으로 저장하는 Map
초기화 매개변수 initParam 웹 애플리케이션의 콘텍스트 초기화 매개변수를 이릉으로 저장하는 Map

JSP와 EL 내장 객체가 일반적인 하나의 객체를 갖는 반면(pageContext) 다른 JSP 내장 객체는 EL에서 접근 가능하다. 페이지콘텍스트가 다른 8 개의 JSP 내장 객체 모두에 액세스 할 수 있는 속성을 갖고 있기 때문이다.

남아있는 모든 EL 내장 객체들은 맵(map)이다. 이름에 상응하는 객체들을 탐색한다. 첫 번째 네 개의 맵은 이전에 언급한 다양한 애트리뷰트 범위를 나타낸다. 특정 범위 내의 식별자들을 검색하는데 사용될 수 있다. EL이 기본적으로 사용하는 순차적인 탐색 프로세스에 의존하지 않는다.

다음 네 개의 맵은 요청 매개변수와 헤더의 값을 반입하는 용도이다. HPPT 프로토콜이 요청 매개변수와 헤더가 다중 값을 가질 수 있도록 하기 때문에 각각 한 쌍의 맵이 있다. 각 쌍 중에서 첫 번째 맵은 요청 매개변수 또는 헤더에 대한 기본 값을 리턴한다. 실제 요청 시 첫 번째로 지정된 값이 무엇이든 상관없다. 두 번째 맵은 매개변수나 헤더의 값 모두 검색될 수 있도록 한다. 이 맵의 핵심은 매개변수 또는 헤더의 이름이다. 값들은 String 객체의 어레이이다.

쿠키 내장 객체는 요청으로 설정된 쿠키에 대한 접근을 제공한다. 이 객체는 요청과 관련된 모든 쿠키들의 이름을 Cookie 객체들로 매핑하면서 쿠키들의 속성을 나타낸다.

마지막 EL 내장 객체인 initParam은 웹 애플리케이션과 관련된 모든 콘텍스트 초기와 매개변수의 이름과 값을 저장하는 맵이다. 초기화 매개변수들은애플리케이션의 WEB-INF 디렉토리에 있는 web.xml 전개 디스크립터 파일을 통해 정의된다.




위로


접근자(Accessors)

EL 식별자는 내장 객체 또는 범위 변수로서 설명될 수 있기 때문에 자바 객체로 평가해야한다. EL은 상응하는 자바 클래스에서 프리머티브를 래핑/언래핑한다. 하지만 대부분의 경우 식별자들은 자바 객체에 대한 포인터가 된다.

결과적으로 이러한 객체들의 속성이나, 어레이와 컬렉션의 경우 그들의 엘리먼트에 액세스하는 것이 바람직하다. 이를 위해 EL은 두 개의 다른 접근자를 제공한다. 닷(dot) 오퍼레이터(.)와 브래킷 오퍼레이터([])이다. 이들은 속성과 엘리먼트들이 EL을 통해 연산될 수 있도록 한다.

닷 연산자는 객체의 프로퍼티에 접근하는데 사용된다. ${user.firstName} 익스프레션에서 닷 연산자는 user 식별자에 의해 참조된 객체 중 firstName이라는 이름을 가진 속성에 액세스 한다. EL은 자바 빈 규정을 사용하여 객체 속성에 접근하기 때문에 이 속성에 대한 게터(일반적으로 getFirstName())는 이 익스프레션이 정확히 계산하기 위해서 반드시 정의되어야 한다. 액세스되는 속성이 객체일 때 닷 연산자는 재귀적으로 적용될 수 있다. 예를 들어 가상의 user 객체가 자바 객체로서 구현된 address 속성을 갖고 있다면 닷 연산자는 이 객체의 속성에 액세스 하기 위해 사용될 수도 있다. ${user.address.city} 익스프레션은 이 address 객체 중 중첩된 city 속성을 리턴한다.

브래킷 연산자는 어레이와 컬렉션의 엘리먼트를 검색하는데 사용된다. 어레이와 컬렉션(java.util.List를 구현하는 컬렉션)의 경우 검색될 엘리먼트 인덱스는 브래킷 안에 나타난다. 예를 들어 ${urls[3]} 익스프레션은 이 urls 식별자에 의해 참조된 어레이 또는 컬렉션의 네 번째 엘리먼트를 리턴한다.

java.util.Map 인터페이스를 구현하는 컬렉션의 경우 브래킷 연산자는 관련 키를 사용하여 맵에 저장된 값을 찾는다. 이 키는 브래킷 내에서 지정되고 상응하는 값은 익스프레션 값으로 리턴된다. 예를 들어 ${commands["dir"]} 익스프레션은 commands 식별자에 의해 참조된 Map"dir" 키와 관련된 값을 리턴한다.

익스프레션이 브래킷안에 나타날 수 있다. 중첩된 익스프레션의 계산 결과는 컬렉션이나 어레이의 적절한 엘리먼트를 검색하는 인덱스 또는 키로 작용한다. 닷 연산자가 true라면, 브래킷 연산자도 재귀적으로 적용될 수 있다. 이는 EL이 다차원 어레이, 중첩 컬렉션, 또는 둘의 결합에서 엘리먼트를 검색 할 수 있도록 한다. 더욱이 닷 연산자와 브래킷 연산자는 상호운용성이 있다. 예를들어 한 어레이의 엘리먼트가 객체라면 브래킷 연산자는 그 어레이의 엘리먼트를 검색하는데 사용될 수 있고 닷 연산자와 결합하여 엘리먼트 속성 중 하나를 검색할 수 있다. (예를 들어 ${urls[3].protocol}).

EL이 동적 애트리뷰트 값을 정의하는 간한한 언어로서 작용한다고 볼 때, 자바 접근자와는 다른 EL 접근자의 재미있는 특성 중 하나는 null에 적용될 때 예외를 던지지 않는다는 점이다. EL 접근자가 적용되는 객체(예를 들어 ${foo.bar}${foo["bar"]}foo 식별자)가 null이면 접근자 적용 결과 역시 null이다. 이는 대부분의 경우, 도움이 되는 일이다.

마지막으로 닷 연산자와 브래킷 연산자는 상호 교환될 수 있다. 예를 들어 ${user["firstName"]}user 객체의 firstName 속성을 검색하는데 사용될 수 있다. ${commands.dir}commands 맵에서 "dir" 키와 관련된 값을 반입하는데 사용될 수 있는것과 같은 이치이다.




위로


연산자(Operators)

식별자와 접근자를 사용하여 EL은 애플리케이션 데이터(범위 변수를 통해 노출) 또는 환경 관련 정보(EL 내장 객체를 통해 노출)를 포함하고 있는 객체 계층을 트래버스 할 수 있다. 그와 같은 데이터에 간단히 접근하는 것은 많은 JSP 애플리케이션에 필요한 표현 로직을 구현하는데 종종 부적합하다.

EL에는 EL 익스프레션으로 접근된 데이터를 조작 및 비교할 여러 연산자를 포함하고 있다. 이러한 연산자들을 표 2에 요약했다.

표 2. EL 연산자

Category 연산자
산술 +, -, *, / (or div), % (or mod)
관계형 == (or eq), != (or ne), < (or lt), > (or gt), <= (or le), >= (or ge)
논리 && (or and), || (or or), ! (or not)
타당성검사 empty

산술 연산자는 더하기, 빼기, 나누기를 지원한다. 다른 연산자들도 제공된다. 나누기와 나머지 연산자들은 비 상징 이름들이라는 대안을 갖고 있다. 산술 연산자의 사용법을 설명하는 예제 익스프레션은 Listing 5에 설명되어 있다. 산술 연산자를 한 쌍의 EL 익스프레션에 적용한 결과는 그러한 익스프레션에 의해 리턴된 숫자 값에 대한 연산자에 적용한 결과이다.


Listing 5. 산술 연산자를 사용하는 EL 익스프레션
${item.price * (1 + taxRate[user.address.zipcode])}

관계형 연산자는 숫자 또는 텍스트 데이터를 비교할 수 있도록 한다. 비교 결과는 부울 값으로서 리턴된다. 논리적 연산자는 부울 값이 결합될 수 있도록 하며 새로운 부울 값을 리턴한다. EL 논리적 연산자는 중첩된 관계형 연산자 또는 논리적 연산자의 결과에 적용될 수 있다. (Listing 6).


Listing 6. 관계형 연산자 및 논리적 연산자를 사용하는 EL 익스프레션
${(x >= min) && (x <= max)}

EL 연산자는 empty 이다. 데이터의 타당성 검사에 특히 유용하다. empty 연산자는 하나의 익스프레션을 인자로 취한다.(${empty input}). 그리고 익스프레션이 empty 값으로 계산했는지의 여부를 나타내는 부울 값을 리턴한다. null로 계산한 익스프레션은 empty로 간주된다. 어떤 엘리먼트도 없는 컬렉션이나 어레이와 같다. empty 연산자는 인자가 길이가 0인 String으로 계산했다면 true로 리턴한다.

EL 연산자의 우선순위는 표 3에 정리되어 있다. Listing 5와 6에 제안된 것 처럼 괄호는 그룹 익스프레션에 사용되고 일반적인 우선순위를 따른다.

표 3. EL 연산자 우선순위 (위->아래, 왼쪽->오른쪽)

[], .
()
unary -, not, !, empty
*, /, div, %, mod
+, binary -
() <, >, <=, >=, lt, gt, le, ge
==, !=, eq, ne
&&, and
||, or




위로


리터럴(Literals)

숫자, 캐릭터 스트링, 부울, null은 EL 익스프레션에서 리터럴 값으로 지정될 수 있다. 캐릭터 스트링은 싱글 쿼트 또는 더블 쿼트로 범위가 지정된다. 부울 값은 truefalse로 계산된다.




위로


Taglib 지시문

앞서 언급했지만 JSTL 1.0에는 네 개의 커스텀 태그 라이브러리가 포함되어 있다. 익스프레션 언어로 JSTL 태그의 인터랙션을 설명하기 위해 JSTL core 라이브러리에서 여러 태그들을 검토할 것이다. 모든 JSP 커스텀 태그 라이브러리로 true가 된다면 taglib 지시문은 이 라이브러리 태그를 사용할 수 있는 페이지에 포함되어야한다. 이 특정 라이브러리에 대한 지시문은 Listing 7에 나타나있다.


Listing 7. JSTL core 라이브러리의 EL 버전용 테그립 지시문
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>

실제로 JSTL core 라이브러리에 상응하는 두 개의 Taglib 지시문이 있다. JSTL텐에서 EL은 옵션이기 때문이다. JSTL 1.0 의 네 개의 커스텀 태그 라이브러리들은 동적 애트리뷰트 값을 지정할 때 EL 대신 JSP 익스프레션을 사용하는 대안 버전을 갖고있다. 이러한 대안 라이브러리는 JSP의 전통적인 요청시간 애트리뷰트 값에 의존하기 때문에 RT 라이브러리로 일컬어진다. 반면 익스프레션 언어를 사용하는 것은 EL 라이브러리라고 한다. 개발자들은 대안 Taglib 지시문을 사용하는 각각의 라이브러리의 버전들을 구별한다. RT 버전의 코어 라이브러리를 사용하기 위한 지시문은 Listing 8에 나와있다. 하지만 지금은 EL에 집중해야 하기 때문에 지금 필요한 것은 이 지시문들 중 첫 번째 것이다.


Listing 8. RT 버전의 JSTL core 라이브러리용 태그립 지시문
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c_rt" %>




위로


변수 태그

첫 번째 JSTL 커스텀 태그는 <c:set> 액션이다. 이미 언급했듯이 범위 변수는 JSTL에서 핵심적인 역할을 하고 <c:set> 액션은 태그 기반의 매커니즘을 제공하여 범위 변수의 생성 및 설정에 쓰인다. 이 액션의 신택스는 Listing 9와 같다. var 애트리뷰트는 범위 변수 이름을 정하고 scope 애트리뷰트는 변수가 머물게 될 범위를 나타내고, value 애트리뷰트는 변수가 될 값을 지정한다. 지정된 변수가 이미 존재하면 지시된 값으로 할당된다. 그렇지 않다면 새로운 범위 변수가 만들어지고 그 값으로 초기화된다.


Listing 9. <c:set> 액션 신택스
<c:set var="name" scope="scope" value="expression"/>


scope 애트리뷰트는 선택적이며 page로 기본 설정되어 있다.

<c:set>의 두 예제는 Lisitng 10에 설명되어 있다. 첫 번째 예제에서 세션 범위 변수는 String 값으로 설정된다. 두 번째에서는 익스프레션은 숫자 값을 설정하는데 사용된다. square라는 페이지 범위 변수는 x 라는 요청 매개변수 값을 배가시킨 결과로 할당된다.


Listing 10. <c:set> 액션 예제
<c:set var="timezone" scope="session" value="CST"/>
<c:set var="square" value="${param['x'] * param['x']}"/>



애트리뷰트를 사용하는 대신 범위 변수용 값을 <c:set> 액션의 바디 콘텐트로 설정할 수 있다. 이러한 접근방식을 사용하여 Listing 10의 첫 번째 예제를 Listing 11과 같이 재작성할 수 있다. 더욱이 <c:set> 태그의 바디 콘텐트가 커스텀 태그를 적용하는 것도 가능하다. <c:set>의 바디 안에서 만들어진 모든 콘텐트는 String 값 같이 지정된 변수에 할당된다..


Listing 11. 바디 콘텐트를 통해 <c:set> 액션용 값 지정하기
<c:set var="timezone" scope="session">CST</c:set>

JSTL core 라이브러리에는 범위 변수를 관리하는 두 번째 태그(<c:remove>)가 포함되어 있다. 이름에서 시사되는 바와 같이 <c:remove> 액션은 범위 변수를 지우는데 사용되고 두 개의 애트리뷰트를 취한다. var 애트리뷰트는 제거될 변수를 명명하고 선택적인 scope 애트리뷰트는 제거되어야 할 범위를 나타낸다. (Listing 12).


Listing 12. <c:remove> 액션 예제
<c:remove var="timezone" scope="session"/>




위로


아웃풋

<c:set> 액션은 익스프레션의 결과가 범위 변수로 할당될 수 있도록 하는 반면 개발자들은 익스프레션 값을 저장하는 대신 간단히 디스플레이하기를 원한다. 이는 JSTL의 <c:out> 커스텀 태그의 몫이다. (Listing 13). 이 태그는 value 애트리뷰트에서 지정된 익스프레션을 계산한다. 그런다음 결과를 프린트한다. 선택적 default 애트리뷰트가 지정되면 value 애트리뷰트의 익스프레션이 null 또는 비어있는 String으로 계산될 때 <c:out> 액션은 값을 프린트한다.


Listing 13. <c:out> 액션 신택스
<c:out value="expression" default="expression" escapeXml="boolean"/>

escapeXml 애트리뷰트 또한 선택사항이다. "<", ">", "&" 같은 캐릭터가 <c:out> 태그에 의해 아웃풋 될 때 종료되는지의 여부를 제어한다. escapeXml이 true로 설정되어 있다면 이 캐릭터들은 상응하는 XML 인터티(<, >, &)로 바뀐다.

예를 들어, user라는 세션 범위 변수가 있다고 가정해보자. 이것은 사용자에 대한 usernamecompany라는 두 개의 속성들을 정의하는 클래스의 인스턴스이다. 이 객체는 사용자가 사이트에 접근할 때마다 세션에 할당된다. 하지만 이 두 개의 속성들은 사용자가 실제로 로그인하기 전까지 설정되지 않는다. (Listing 14). 일단 사용자가 로그인하면 "Hello"가 디스플레이 되고 뒤따라서 사용자 이름과 감탄부호가 나온다. 사용자가 로그인하기 전에 여기에서 생긴 콘텐트는 "Hello Guest!" 라는 구(phrase)가 된다. 이 경우 username 속성이 초기화되지 않았기 때문에 <c:out> 태그는 default 애트리뷰트 값을 프린트한다.


Listing 14. <c:out> 액션 예제 (디폴트 콘텐트)
Hello <c:out value="${user.username}" default=="Guest"/>!


<c:out> 태그의 escapeXml 애트리뷰트를 사용하는 Listing 15를 보자. company 속성이 자바 String 값인 "Flynn & Sons"으로 설정되었다면 이 액션에서 생긴 콘텐트는 Flynn & Sons이 된다. 이 액션이 HTML 또는 XML 콘텐트를 만드는 JSP 페이지의 일부라면 이 캐릭터의 스트링 중간에 있는 앰퍼샌트 부호는 HTML 또는 XML이 문자를 제어하고 이 콘텐트의 렌더링 또는 파싱을 방해하는것으로 해석하고 끝난다. escapeXml 애트리뷰트의 값이 true로 설정되면 생성된 콘텐트는 Flynn & Sons이 된다. 이 콘텐트를 만나는 브라우저 또는 파서는 인터프리테이션에 아무 문제가 없다. HTML과 XML이 JSP 애플리케이션에서 가장 일반적인 콘텐트 유형이라면 escapeXml 애트리뷰트의 디폴트 값이 true라는 것은 놀라운 일이 아니다.


Listing 15. <c:out> 액션 예제)
<c:out value="${user.company}" escapeXml=="false"/>





위로


디폴트 값으로 변수 설정하기

동적 데이터를 단순하게 하는 것 외에도 디폴트 값을 지정하는 <c:out>의 기능은 <c:set>을 통해 변수 값을 설정할 때에도 유용하다. 범위 변수에 할당된 값이 <c:set> 태그의 바디 콘텐트로 지정될수 있고 value 애트리뷰트로서도 가능하다. <c:out> 액션을 <c:set> 태그의 바디 콘텐트에 중첩하여 변수 할당은 이것의 디폴트 값을 이용할 수 있다. (Listing 11).

이러한 접근 방식은 Listing 16에도 설명되어 있다. 외부 <c:set> 태그의 작동은 단순하다.


Listing 16. <c:set>과 <c:out> 결합: 디폴트 변수 값 제공
<c:set var="timezone" scope=="session">
   <c:out value="${cookie['tzPref'].value}" default=="CST"/>
</c:set>

소셜 북마크

mar.gar.in mar.gar.in
digg Digg
del.icio.us del.icio.us
Slashdot Slashdot

요청에 제공된 tzPref 라는 이름의 쿠키가 없다. 내장 객체를 사용한 검색은 null이 된다는 것을 의미한다. 익스프레션은 전체적으로 null을 리턴한다. value 애트리뷰트를 계산한 값이 null 이기 때문에 <c:out> 태그는 default 애트리뷰트를 계산한 결과를 아웃풋한다.



참고자료

Posted by 1010