JSP 공부 <1> - 기초 ~ JSTL 까지 요약 정리

Posted by oimb
2018. 9. 4. 10:18 JSP



1. 웹 페이지의 주소를 표현하기 위해 사용하는 URL의 구성 요소


http   :    //history1994.tistory.com/  category/JAVA ?abc=123

프로토콜         서버 이름                        경로             쿼리 문자열


프로토콜    : 웹 브라우저가 서버와 내용을 주고받을 때 사용할 규칙 이름이다.웹페이지의 주소를 표현할 때는 http를 사용한다.

서버 이름   : 웹페이저가 요청할 서버의 이름을 지정한다. 서버 이름은 도메인 또는 IP 주소를 입력 할 수 있다.

경로        : 웹페이지의 상세 주소에 해당한다.

쿼리 문자열 : 추가로 서버에 보내는 데이터에 해당하는데 GET 방식에 해당한다. 같은 경로에서 이 입력한 값에 따라 다른결과를 보여줘야 할 때 쿼리 문자열을 사용한다.




2. 웹 페이지 처리 과정


.    

먼저 사용자가 도메인을 통해 웹브라우저를 접근하고


 이후 DNS 서버가 해당 IP 주소를 넘겨 주면 


 이후 웹 서버에서 알맞은 동작을 수행하게된다(http://history1994.tistory.com/7?category=670131)


또  웹브라우저와 웹 서버는 서로 요청과 응답에 대한 규칙이 존재한다.


요청 규칙 : 웹 브라우저가 웹 서버에 HTML과 같은 것을 요청할 때 사용할 데이터 구성 규칙


응답 규칙 : 웹서버가 웹 브라우저에 HTML과 같은 것을 전송할 때 사용할 데이터 구성 규칙





3. JSP 페이지의 구성 요소


1. 디렉티브

- page , taglib , include


2. 스크립트 요소

- 표현식<%=%> , 스크립트릿 <%%> , 선언부 <%!%>


3. 기본 객체

- request , response , session , application , pageContext 등 


4. 표현 언어

- ${} EL


5. 표준 액션 태그와 태그 라이브러리

- <jsp:include> , <jsp:forward> , JSTL

6. 정적인 데이터

- HTML 태그, 이미지와 같은 정적 데이터


1. 디렉티브

page - JSP 페이지에 대한 정보를 입력하기 위해서 사용된다. (어떤문서를 생성? 어떤 자바 클래스를 사용? 세션? 출력 버퍼의 존재 여부)


taglib - JSTL에 사용할 태그를 선언 해주는곳


include - 디렉티브의 경우 다수의 JSP 페이지에서 공통으로 사용되는 변수를 지정하는 코드나 문장을 저장하는 용도


2. 스크립트 요소

표현식 <%=%> - 어떤 값을 출력 결과에 포함시키고자 할 때 사용된다. 


스크립트 릿 <%%> - JSP 페이지에서 자바 코드를 실행할 때 사용하는 코드 블록이다.


선언부 <%!%> - 잘 안씀 몰라두됨


사실 나중에가면 스크립트요소는 전혀 쓰지 않는다고 하지만 그래도 일단은 알고 가자.


3. 기본 객체


- request : 자바에서 가장 많이 사용되는 기본 객체이다. 웹 서버에 연결한 후 요청 정보를 전송하는데, 이 요청 정보를 제공하는 것이 바로 request 기본객체이다.


- response : request 기본 객체와 반대의 기능을 수행한다. 웹 브라우저에 보내는 응답 정보를 담는다. (헤더 정보 입력 , 리다이렉트 하기)


- out : JSP 페이지가 생성하는 모든 내용은 out 기본 객체를 통해 전송된다.( 비스크립트요소를 포함하여 표현식의 결과값도 전달된다.)


- pageContext : JSP 페이지와 일대일로 연결된 객체이다. (직접 사용하기 보다는 커스텀 태그를 구현할 때 사용된다.)


- application : 웹 어플리케이션과 관련된 기본 객체이다. 특정 웹 어플리케이션에 포함된 모든 JSP 페이지는 하나의 application 기본 객체를 공유하게 된다.


- session : HTTP 고유 세션 정보를 저장한다.(로그인 정보 등)


- config  : JSP 페이지에 대한 설정 정보를 저장한다.


- page    : JSP 페이지를 구현한 자바 클래스 인스턴스이다.


- exception : 익셉션 객체 이다. 에러 페이지에서만 사용한다.






4. 필수 이해 요소


1. JSP 처리 과정 (일반적인 과정)


그림 출처 : http://bravesuccess.tistory.com


  1.  JSP 페이지로부터 자바 코드를 생성하다.             =>    변환(translation) 단계
  2.  자바 코드를 컴파일해서 서블릿 클래스를 생성한다.    =>    컴파일(compile) 단계
  3.  서블릿에 클라이언트 요청을 전달한다.
  4.  서블릿이 요청을 처리한 결과를 응답으로 생성한다.
  5.  응답을 웹 브라우저에 전송한다..


2. 출력 버퍼와 응답


버퍼의 사용이유


1. 데이터 전송 성능 향상

2. JSP 실행 도중에 버퍼를 비우고 새로운 내용 전송가능

3. 버퍼가 다 차기 전까지 헤더 변경 가능

=> 후에 나올 forward 와 에러 페이지의 출력에 있어 연관이 있다.


설정 방법 : <%@ page buffer = "4kb" %>  // 버퍼는 킬로바이트 단위로 지정할 수 있다.

일반적으로는 따로 지정 하지는 않는다. 최소 8kb 사용 하기 때문에 충분하다.


3. 웹 어플리케이션 풀더 구성과 URL 매핑 


1. 풀더 구성

WEB-INF : 웹 어플리케이션 설정 정보를 담고 있는 web.xml 파일이 위치한다.

WEB-INF\classes (이클립스 경우 따로 설정해서 만들어줘야한다. ) : 웹 어플리케이션에서 사용하는 클래스 파일이 위치한다.

WEB-INF\lib  : 웹 어플리케이션에서 사용하는 jar 파일이 위치한다.


2. 풀더와 URL의 관계


각 풀더의 이름은 웹 어플리케이션을 실행할 때 사용되는 URL과 관련이 있다. 


- [톰캣]\webapps\[웹 경로]         =>        http://host:port/[웹 경로]


추가로 반드시 알아야 할 contextpath가 있는데 이는 따로 정리해두었으니 참고하자(http://history1994.tistory.com/27?category=668435)





5. 기본 객체와 영역


기본 객체들의 정보는 위에서 간략하게 설명 했으니 추가적으로 설명해야 되는 부분만 설명하겠습니다.


1. application 기본 객체 추가 설명

             

application 기본 객체를 이용해서 

초기화 파라미터를 정의할 수 있다.

web.xml

<context-param>

<description>파라미터 설명</description>

<param-name>파라미터 이름</param-name>

<param-value>파라미터 값</param-value>

</context-param>

이러한 초기화 파리미터를 이용해서 

웹 어플리케이션을 초기화하는 데 필요한  설정 정보를 지정하기 위해 사용된다. 에를 들어, 데이터베이스 연결과 관련된 설정 파일의 경로나, 로깅 설정파일,또는 웹 어플리케이션의 주요 속성 정보를 담고 있는 파일의 경로 등을 지정할 때 초기화 파라미터를 사용한다. 



2.  JSP 영역


PAGE 영역 : 하나의 JSP 페이지를 처리할 때 사용되는 영역      => 하나의 JSP 페이지 내에서 공유할 값을 저장한다. 주로 커스텀 태그에서 새로운 변수를 추가할 때 사용 한다


REQUEST 영역 : 하나의 HTTP 요청을 처리할 때 사용되는 영역    => 요청 처리하는 JSP 페이지 사이에서 정보를 전달하기 위해 사용된다.


SESSION 영역 : 하나의 웹 브라우저와 관련된 영역              => 사용자의 로그인 정보와 같은 것들을 저장한다.


APPLICATION 영역 : 하나의 웹 어플리케이션과 관련되어 있다    => 모든 사용자를 위해 공유할 정보를 저장한다.



그림 출처:http://gangzzang.tistory.com




6. 익셉션 처리하기


1. exception 처리

try catcy 문 이용한다


2. 에러페이지 지정하기


<%@ page errorPage = "/error/viewErrorMessage.jsp" %>        -        에러페이지 지시


<%@ page isErrorPage = "true" %>                             -        에러페이지 지정


3. 응답 상태 코드별로 에러 페이지 지정하기

<error-page>

<error-code>에러코드( 예 : 404,500)</error-code>

<location>에러페이지의 URL</location>

</error-page>

4. 익셉션 타입별로 에러 페이지 지정하기


<error-page>

<exception-type>java.lang.NullPointerException</exception-type>

<location>에러페이지의 URL</location>

</error-page>


5. 버퍼와 에러 페이지의 관계


최초 버퍼가 플러쉬되면 이후 에러가 발생하여도 응답 상태코드 200이 전달되었기 때문에 웹 브라우저는 정상적으로 응답이 도착했다고 판단하다

따라서 에러 응답 코드와 에러 페이지의 내용을 웹 브라우저에 완전하기 전송하려면 버퍼가 플러시되면 안된다.


*) 에러 페이지의 우선순위와 에러 페이지 지정 형태


1. page 디렉티브의 errorPage 속성에 지정한 에러 페이지를 보여준다.

2. JSP 페이제에서 발생한 익셉션 타입이 web.xml 파일의 <exception-type>에 지정한 에러 페이지를 보여준다

3. 에러 코드가 web.xml 파일의 <error-code>에 지정한 에러 코드와 동일한 경우 지정한 에러 페이지를 보여준다.

4. 아무것도 해당하지 않는 경우 웹 컨테이너가 제공하는 기본 에러 페이지를 보여준다.




7. 페이지 모듈화, 요청 흐름 제어


<jsp:include> , include 디렉티브를 사용하며 중복방지가 주목적이다.


1. <jsp:include> 액션 태그의 기본 사용방법


- <jsp:include page="포함할 페이지의 경로" flush="true">   flush : 지정한 jsp 페이지를 실행하기 전에 출력 버퍼를 플러시할지 여부를 지정한다. true이면 출력      버퍼를 플러시하고,false 이면 플러시하지 않는다. 기본값은 false


- 파라미터를 추가 할수 있는데 태그안에 <jsp:param name="파라미터명" value="파라미터 값">    단 이 값은 request.setCharacterEncoding("인코딩타입") 에서 명시된 타입으로 인코딩 되어진다.


- 액션 태그가 레이아웃의 한 구성 요소를 모듈화 하기 위해 사용된다.


2. include 디렉티브 기본 사용 방법


- <%@ include file="포함할 페이지의 경로"%>


- 모든 JSP 페이지에서 사용하는 변수 지정 및 중복되는 문장을 위해 사용한다.


- 디렉티브 사용 또한 중복이 될 수 있기 때문에 자동 포함 기능이 있다

<jsp-config>

  <jsp-property-group>

  <url-pattern>적용할 JSP파일의 URL 패턴을 지정</url-pattern>

  <include-prelude>지정한 패턴에 해당하는 JSP 파일의 앞에 삽입할 파일 지정</include-prelude>

  <include-coda>지정한 패턴에 해당하는 JSP 파일의 뒤에 삽입할 파일 지정</include-coda>

  </jsp-property-group>

  </jsp-config>


3. include 형식의 액션 태그와 디렉티브의 비교를 해보자


처리방식

액션태그의 경우 요청 시간에 바로 처리하는 방식

디렉티브의 경우 JSP 파일을 자바 소스로 변환할 때 처리하는 방식


데이터 전달방법

액션태그의 경우 request 기본 객체,<jsp:param>을 이용한 파라미터 전달

디렉티브의 경우 페이지 내의 변수를 선언하여 공유

기능

액션태그의 경우 별도의 파일로 요청 처리 흐름을 이동한후 다시 복귀

디렉티브의 경우 현재 파일에 삽입시킨다.

따라서 용도는

액션태그의 경우 레이아웃의 일부분을 모듈화 시키는것

디렉티브의 경우 다수의 JSP 페이지에서 공통으로 사용되는 변수를 지정하는 코드나 문장을 저장하는 용도



4. <jsp:forward> 액션 태그를 이용한 JSP 페이지 이동


동작의 차이

-  위에서 보던 include 액션 태그 방식과는 조금 다르게 동작한다. 

   forward되어진 jsp페이지가 생성한 응답 결과를 웹 브라우저에게 전달한다는 점이 다르다 또 이 과정에서 foward를 호출한 jsp 페이지는 출력버퍼     에서 비워지게 된다. 즉 <jsp:forward>의 이전 내용은 출력 버퍼에서 지워지며 이후 코드는 실행 조차 되지 않는다.


사용법 

- <jsp:forward page="이동할 페이지의 경로"/>


<jsp:param> 액션 태그를 이용

- 앞서 설명한것 같이 include의 동작 방식과 동일하다.




8. <jsp:useBean> 액션 태그 - 안씀 생략


다만 자바빈은 알 필요가 있어서 설명하겠습니다.


자바빈 프로 퍼티


- 매서드 이름을 사용해서 프로퍼티의 이름을 결정하게 된다     =>    기존 변수의 이름과 상관이 없다

  getName(),setName() 라는 매서드가 있다면 프로퍼티값은 name이 된다




9. 쿠키 와 세션


쿠키와 세션은 비슷한 역할을 수행한다 다만 어느쪽에서 데이터 정보를 유지하느냐의 차이를 보인다.

클라이언트 사이드 : 쿠키

서버 사이드      : 세션

그리고 이 둘은 해쉬맵 구조인점을 알고 있자

그리고 쿠키와 세션 모두 서버로 접근한 마지막 시간에서 일정시간동안(타임아웃) 더이상 요청이 없을때 서버에서 익스파이어 됩니다.여기서 세션은 브라우저를 닫으면 바로 익스파이어가 되는것 처럼 보일수 있는데 이는 클라이언트 입장에서 브라우저를 다닫았을때 사용하던 세션 아이디가 날아갔기 때문에 로그아웃되었다고 생각 하는것입니다.

지금부터 하나씩 살펴보면


쿠키

1. 쿠키의 구성

이름 , 값 , 유효시간 , 도메인 , 경로

여기서 이름과 값은 이상한 문자 쓰지말고 공백도 쓰지말고 영어와 숫자로 쓰자 안그러면 삽질한다


2. 쿠키 생성


Cookie cookie = new Cookie("cookieName","cookieValue");

response.addCookie(cookie);


cookieValue 저장시 인코딩 하여 저장하는데 URLEncoder.encoder("value","인코딩 방식"); 형태로 저장한다.


3. 쿠키 값 읽어오기


Cookie[] cookies = request.getCookies();  // 쿠키 배열을 리턴하게 된다.


이후 값을 디코딩해야 하는데 URLDecoder.decode(cookies[i].getValue(),"디코딩 방식") 형태로 하면 된다


4. 유효 시간


유효 시간을 설정 안해줄 경우 웹브라우저를 닫으면 바로 익스파이어되며 음수 일경우에도 이와 동일 , 그리고 0으로 설정해줄 경우 삭제된다.

양수 일경우 최종 마지막시간에서 타임아웃되기 까지는 유효하게 된다.


경로나 도메인 설정은 생략합니다.


세션


세션도 사실 쿠키와 동일하다.


1. 세션의 구성


기본 객체이다. 즉 세션 기본객체를 사용하는 것이다.


2. 세션의 생성


<%@ page session = "true" %> 가 되어져 있어야 하는데 디폴트가 true 이므로 따로 건들이지만 않음된다 그럼 알아서 생성되어짐


3. 세션 값 읽어오기


기본 객체를 사용하는 것이므로 setAttribute() 와 getAttribute()를 사용하면된다

다만 세션ID가 중요한데 

웹 브라우저마다 별도의 세션을 갖는다 따라서 이를 구분 하기 위해 고유ID를 할당하는데 이를 세션ID라고 한다.

웹 브라우저가 웹 서버에 연결할 때마다 매번 세션 ID를 보내서 웹 서버가 어떤 세션을 사용할지 판단할 수 있게한다.


웹 서버는 세션ID를 이용해서 웹 브라우저를 위한 세션을 찾기 때문에 공유할 필요가 있다. 여기서 공유하기 위해 사용하는 것이 쿠키인데

JSESSIONID 쿠키가 세션 ID를 공유하기 위해 사용하는 쿠키이다.


4. 유효 시간 


유효 시간이 존재 할때는 위에서 설명했으니 타임 아웃 되는 순간에 대해서만 설명하겠습니다.

먼저 타임아웃을 지정해주는 방법은


1)

  <session-config>

  <session-timeout>30</session-timeout>

  </session-config>

2)

session.setMaxInactiveInterval(60*60);


두 가지 방법이 있습니다.


타임아웃 값을 0이나 음수로 설정하면 세션은 유효시간을 갖지 않으며 session.invalidate() 매서드를 호출하기 전까지 세션 객체가 서버에 유지된다 이는 이후 메모리 부족 현상을 야기할 수 있다. (그런데 어차피 알아서 삭제되게끔한다고함)

하지만 혹시 모르니 사용하지 않는 세션은 제거해주도록 하자.


쿠키와 세션에 대한 정보는 대략적으로 설명 한것 같다.



서블릿 컨텍스트와 세션


contextpath에 대해 앞서 짧게 설명했는데 , 이는 세션과도 관련이 있다.


왜냐하면 서버에서 생성한 세션 ID를 클라이언트와 공유하기 위해서 쿠키로 따로 저장해 둔다고 했고 그게 JSESSIONID라고 했다.

여기서 JSESSIONID 쿠키의 경로로 웹 어플리케이션 컨테스트 경로로 사용한다 즉 contextpath가 다르면 JSESSIONID의 값도 달라진다.


서로 다른 웹 어플리케이션이 서도 다른 JSESSIONID를 사용 한다는것은 웹 어플리케이셔이 서로 세션을 공유하지 않는다는 것을 의미한다.





10. 표현 언어 (Expression Language)


표현 언어는 값을 표현하는데 사용하는 스크립트 언어로서 표현식보가 간결하고 편리하다. JSP 2.0 버전부터 표현 언어가 JSP에 포함되었고, JSP 2.1 버전부터 표현 언어와 관련된 규약을 별도 문서로 제공하고 있다.


- JSP의 네 가지 기본 객체가 제공하는 영역의 속성 사용

- 수치,관계,논리 연산자

- 자바 클래스 메서드 호출

- 쿠키, 기본 객체의 속성등 JSP를 위한 표현 언어의 기본 객체 제공

- 람다식


1. 사용 방법


${name} name에는 값을 표현하는 식이 온다.

또 JSTL의 속성값으로 사용할 수 있다. 대신 스크립트요소(스크립트릿, 표현식, 선언부)를 제외한 나머지 부분에서 사용될 수 있다.


2. 타입


- boolean

- 정수

- 실수

- 문자열

- null


3. 기본 객체와 영역


- pageContext        JSP의 pageConmtext 기본 객체와 동일

- pageScope          pageContext에 저장된 속성 <속성,값> 매핑한단 Map 객체

- requestScope       request            ''

- sessionScope       session            ''

- applicationScope   application        ''

- param              요청 파라미터의<파라미터 이름, 값 배열> 매팡 저장한 Map 객체이다.

- cookie             <쿠키 이름,Cookie> 매핑을 저장한 Map 객체이다. request.getCookies()의 값인 쿠키 배열로부터 매핑을 생성한다.


ex)

${pageContext.request.contextPath} => request영역의 Contextpath를 가져온다.

주의) request영역이라해서 requestScope를 통해 가져오면 안됨 requestScope는 속성Map을 저장해놓는 곳임


4. 객체 접근


표현1.표현2 형태는 복잡한 과정을 거쳐 해석되어진다.


1. 표현1 을 값1로 변환한다.

2. 값1이 null이면 null을 리턴한다.

3. 값1이 null이 아닌 경우 표현2를 값2 로 변환한다. 값2가 null 이면 null을 리턴한다.

4. 값1이 Map, List , 배열인 경우


A. 값1이 Map

a. 값1.containsKey<값2>가 false이면 null을 리턴한다.

b. 그렇지 않으면 값1.get<값2>를 리턴한다.

B. 값1이 List나 배열이면

a. 값2가 정수값인지 검사한다. (정수값이 아닌 경우 에러 발생)

b. 값1.get<값2> 또는 Array.get<값1,값2>를 리턴한다.

c. 위 코드가 익셉션을 발생하면 에러를 발생한다.

5. 값1이 다른 객체이면

A. 값2를 문자열로 변환한다.

B. 값1 객체가 값2를 이름으로 갖는 일기 가능한 프로퍼티를 포함하고 있다면 프로퍼티값을 리턴한다.

C. 두 경우가 모두 아니면 에러를 발생한다.



※ 주의 : EL에서 []의 왼쪽에는 Map , Beans , 배열 , List 타입이 올 수 있으며, [] 안의 값은 키 값 or 프로퍼티명 or 인덱스 이고

 .(도트)의 왼쪽에는  Beans이거나 Map 타입이어야만 하며 , 속성 or 키값에 접근한다.




5. 객체 탐색


앞서 각영에 속성값들을 접근할 때 사용하는 방법을 설명했는데 

영역을 지정하지않고 ${name} 형태로 이름만 정의 할경우 탐색하는 순서가 있다.

PAGE , REQUEST , SESSION , APPLICATION 영역 순으로 검사한다.


6. 연산자


일반 연산자와 같은데 empty는 알고있어야 될것같다.

empty 연산자는 검사할 객체가 텅 빈 객체인지를 검사하기 위해 사용한다. empty 연산자는 다음과 같이 사용한다.




11. 표준 태그 라이브러리(JSTL)


JSTL이란?


JSP와 같은 태그를 개발자가 추가할 수 있는 기능을 제공하는데 이를 커스텀 태그라고 한다. 커스텀 태그 중에서 많이 사용되는 것들을 모아서 JSTL(JSP Standard Tag Library) 라고 한다. 이를 사용하면 스크립트릿 코드의 사용을 줄이면서 더욱 간결하고 이해하기 쉬운 JSP 코드를 작성할 수 있다.


1. 태그의 종류


코어(c)

변수지원 , 흐름 제어 , URL 처리


XML(x)

XML 코어 , 흐름제어 , XML 변환


국제화(fmt) 

지역 , 메시지 형식 , 숫자 및 날짜 형식


데이터 베이스(sql)

SQL


함수(fn)

컬렉션 처리 , String 처리



2. 라이브러리


https://search.maven.org/

각종 라이브러리와 dependency 가 있는 곳으로 이곳에 쳐서 다운을 받는다.




코어 태그


앞서 언급 했듯이 변수지원과 흐름 제어(if-else) URL 처리를 담당한다.


사용 방법

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


변수 지원 


1. <c:set> 태그


<c:set> 태그는 EL 변수의 값이나 EL 변수의 프로퍼티 값을 지정할 때 사용된다.


<c:set var="변수명" value="값" [scope="영역"]/>

var : 값을 지정할 EL 변수의 이름을 지정한다.

value : 변수의 값을 지정한다. 표현식, EL , 정적인 텍스트를 사용해서 값을 지정할 수 있다.

scope : 영역 4개의 객체중 하나 , 디폴트는 page영역


2. 객체의 프로퍼티 값을 설정


<c:set target="대상" property="프로퍼티 이름" value="값"/>

target : 프로퍼티 값을 설정할 대상 객체를 지정한다.표현식,EL 사용 , 대상 객체는 자바빈 객체 or Map

property : 설정할 프로퍼티의 이름을 지정한다. target이 자바빈 객체인 경우 프로퍼티 이름에 해당하는 set 메서드를 제공해야 한다.

value : 프로퍼티의 값을 설정한다.


예)

1.

<c:set var="m" value="<%=new Member() %>"/>

<c:set target="${m}" property="name" value="hisLibrary"/>

${m.name}


2.

<% Map<String,String> map = new HashMap<>();%>

<c:set target="<%=map %>" property="host" value="localhost"/>

<%= prop.get("host") %> 


3. <c:remove>


set 태그로 지정한 변수를 삭제할 때 사용한다. 주의! 삭제할 변수의 scope를 지정하지 않으면 동일한 이름으로 저장된 모든 영역의 변수를 삭제한다

<c:remove var="varName" [scope="영역"]/>


4. 정리






흐름 제어


 - if, choose , forEach , forTokens 


1. <c:if> 태그


중첩된 if-else 블록과 같은 효과를 낼 순 없지만 단순한 if 블록을 쉽게 대체할 수 있기 때문에 많이 사용한다.

<c:if test="조건" [var="testResult"]>

...

</c:if>


test 속성은 true나 false에 해당하는 값이 온다. 

test 속성은 표현식이나 EL 또는 정적 문자열을 값으로 가질 수 있다.



2. <c:choose>,<c:when>,<c:otherwise> 태그


<c:choose> 태그는 자바의 switch 구문과 if-else 블록을 혼합한 형태로서 다수의 조건문을 하나의 블록에서 수행할 때 사용한다.


<c:choose>

<c:when test="${param.name =='history' }">

<li>당신의 이름은 ${param.name }입니다

</c:when>

<c:when test="${param.age > 20 }">

<li>당신은 20세 이상입니다.

</c:when>

<c:otherwise>

<li>당신은 'history'가 아니고 20세 이상이 아닙니다.

</c:otherwise>

</c:choose>


하나의 <c:when> 태그에 걸리면 이후에 태그는 실행되지 않는다. 만약 모든 <c:when> 태그의 결과값이 false 이면 <c:otherwise>를 실행한다.


3. <c:forEach> 태그


forEach 태그는 배열, Collection,Map에 저장되어 있는 값들을 순차적으로 처리 할 때 사용한다.

자바의 for,do-while 등을 대신해서 사용할 수 있다.


1.

<c:forEach var="varName" items="item">

...

${varName}

...

</c:forEach>


var는 인덱스? 와 같은 역할을 하는 변수라고 생각 하면된다.

items는 Map, 배열 , Collection이 올 수 있다. 배열의 경우는 객체의 배열뿐만 아니라 기본 데이터 타입의 배열에 대해서도 알맞게 처리를 하며 , 기본 데이터 타입은 Integer나 Double과 같은 래퍼 클래스를 사용해서 처리하게 된다.


2.

<c:forEach var="i" begin="1" end="10" [step="숫자"]>

 ${i}

</c:forEach>


자바의 for구문과 같은 효과를 낸다. i는 1부터 10까지 값을 차례대로 갖게 된다.

step속성은 증가분을 변경할 수 있게한다. 

또 items속성을 함께 사용하면 begin에서 end까지 참조할 변수의 개수(인덱스)를 제한할 수 있다.


3.

items 속성값으로 List와 같은 컬렉션 or 배열을 사용할 경우 인덱스 자체를 사용해야하는 상황이 있어야할 수 있다.

<c:forEach var="item" items="<%= itemList%>" varStatus="status">

${status.index + 1}번째 항목 : ${item.name}

</c:forEach>

varStatus는 루프 정보를 담는 객체로 제공하는 프로퍼티는 다음과 같다


-index : 현재 인덱스

-count : 루프 실행 횟수

-begin : begin 속성값

-end   : end 속성값

-step  : step 속성값

-first : 현재 실행이 첫 번째 실행인 경우 true

-last  : 현재 실행이 마지막 실행인 경우 true

-current: 컬렉션 중 현재 루프에서 사용할 객체

4. 정리




4. <c:forTokens> 태그

Java.util.String.Tokenizer 클래스와 같은 기능을 제공하는 태그이다.


<c:forTokens var="token" items="문자열" delims="구분자">

${token}의 사용

</c:forTokens>


items : 속성값인 무자열을 구분자르 이용해서 나누게 된다.

var : 구분한 각 문자열을 var 속성값인 변수에 저장한다.


<c:forTokens var="token" items="빨강색,주황색,노란색.초록색.파랑색.남색" delims=",.">

${token}

</c:forTokens>

빨강색 주황색 노란색...


5. <c:url> 태그

URL을 생성해주는 기능을 제공한다.

<c:url value="URL" [var="varName"] [scope="영역"]>

<c:param name="name"  value="value">

</c:url>

var ,scope 속성은 생략 가능 var속성을 지정하지 않으면 현재 위치에 생성한 URL을 웹브라우저에 출력하게 된다. var 속성을 지정하면 생성된 URL을 저장하게된다.

value 속성은 절대 URL 과 상대 URL 의 두가지 방식으로 입력할 수 있다.

<c:param name="name" value="value"/> 이렇게 태그를 이용하여 파라미터를 URL에 추가할 수 있다.



6.<c:redirect> 태그

response.sendRedirect()처럼 지정한 페이지로 리다이렉트 시켜주는 기능을 제공한다.

<c:redirect url="URL" [context="컨텍스트경로"]>

<c:param name="이름" value="값"/>

</c:redirect>


url의 속성값에 / 로 시작하는 url을 기입하면 자동으로 contextpath값이 들어가지만 다른 context경로를 설정하고 싶다면 context속성값을 지정해주면된다.

param 또한 url을 넘길때 지정해 줄수 있다.


7. <c:out> 태그

out태그는 JspWriter에 데이터를 출력할 때 사용되는 태그이다.


<c:out value="value" [escapeXml="(true|false)"] [default="기본값"]/>


- value : JspWriter에 출력할 값을 나타낸다. 일반적으로 value 속성의 값을 String과 같은 문자열이다. 만약 java.Reader에 상속되어지는 클래스라면 Reader로부터 데이터를 읽어와             JspWriter에 값을 출력한다.

- escapeXml : 이 속성값이 true이면 규칙에 따라 문자를 변경한다. 디폴트는 true

- default : value 속성에서 지정한 값이 존재하지 않을 때 사용될 값을 지정한다.

<%

FileReader reader = null;

try{

String path = request.getParameter("path");

reader = new FileReader(getServletContext().getRealPath(path));

%>

<pre>

path 값 = <%=path %>

<c:out value="<%=reader %>" escapeXml="true"/>

</pre>

<%

}catch(IOException e){

%>

에러:<%=e.getMessage() %>

<%

}finally{

if(reader != null)

try{

reader.close();

}catch(IOException e){}

}

%>


8. <c:catch> 태그

<c:catch> 태그는 발생된 익셉션을 EL 변수에 저장할 때 사용되는 태그로서 다음과 같이 사용한다.

<c:catch var="ex">

...

익셉션이 발생할 수 있는 코드

...

</c:catch>

...

${ex}



국제화 태그


국제화 태그는 특정 지역에 따라 알맞은 메시지를 출력해야 할 때 사용한다. 



로케일 지정


1. 로케일 설정


<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<fmt:setLocale value="ko" scope="request"/>


          • value : Locale을 "언어코드_국가코드" 형식으로 지정한다. 두 글자 언어 코드는 반드시 지정해야 하며, 두 글자로 된 국가 코드를 추가로 지정할 수 있다. null인경우 JVM의 기본 로케일 또는 web.xml 파일에서 설정한 로케일을 기본 로케일로 사용한다.
          • scope : 지정한 Locale이 영향을 미치는 범위를 지정한다. 기본값은 page이다.


일반적으로 Accept-Language 헤더 값에 맞게 메시지를 출력하기 때문에 사용하는 경우는 드물다.


2.

<fmt:requestEncoding value="utf-8"/>

위 코드는

<%

request.setCharacterEncoding("utf-8");

%>

과 동일하다




메시지 처리


메시지 처리를 설명하기 앞서 properties 파일을 사용하여 처리해야 하기 때문에 잠깐 설명하겠습니다.

세팅 환경은 이클립스 환경이라고 가정하겠습니다.


메시지 처리를 하려면 properties 파일을 사용하여 처리하게 되는데 이 properties 파일을 각종 언어로 작성하게된 다음에 인코딩 과정을 거친후에야  사용할 수있다. 허나 플러그인을 사용하면 더욱 쉽게 이용할 수있다.

이클립스 마켓 플레이스에서 Properties Editor를 설치 하면된다. 이후 proeprties 파일을 src/resource/에 작성해주면된다.


작성시 번들이름_언어_국가.properties 형태로 만들어 주면된다. (국가코드는 생략가능) 


그렇게하면 properties파일의 아이콘이 저렇게 바뀌게 된다 그럼 준비는 끝


        • <fmt:bundle> : 태그 몸체에서 사용할 리소스 번들을 지정한다.
        • <fmt:message> : 메시지를 출력한다.
        • <fmt:setBundle> : 특정 메시지번들을 사용할 수 있도록 로딩한다.


1.<fmt:bundle> & <fmt:message>


message_ko.properties 파일 내용


TITLE = 최범균

GREETING = 아녕!

VISITOR = 아이디: {0}


<fmt:bnundle basename="resource.message">

...

<fmt:message key="GREETING"/>

...

</fmt:bundle>


          • basename : 표현식/EL 사용 가능 , String 타입 , 사용할 리소스 번들의 이름
          • preifx   : 표현식/EL 사용 가능 , String 타입 , bundle 태그의 내부에서 사용되는 message 태그의 key 속성의 값 앞에 자동으로 붙게 될 문자열

message 태그가 제공하는 속성

          • key : 읽어올 메시지의 키 값
          • var : 메시지를 저장할 변수 명
          • scope : 변수가 저장되는 영역 지정
          • bundle : <fmt:setBundle> 태그를 사용해서 로딩한 번들로부터 메시지를 읽어 올때 사용한다.


여기서 

VISITOR = 아이디: {0}

이 부분의 {0}은 message 태그 안의 param 의 value로

<fmt:message key="VISITOR">

<fmt:param value="${id}"> // {0}에 들어간다.

...                       // {1}

...                       // {2}

</fmt:message>



2.<fmt:setBundle>태그와 <fmt:message> 태그


<fmt:setBundle>을 이용하여 리소스 번들을 저장후 어디서든 사용하게할 수 있다.

<fmt:setBundle var="message" basename="resource.message"/>

...

<fmt:message bundle="${message}" key="GREETING"/>


      • basename : 표현식/EL 사용가능 , String 타입 , 읽어올 리소스 번들의 이름
      • var      : 표현식/EL 사용불가 , String 타입 , 리소스 번들을 저장할 변수명
      • scope    : 표현식/EL 사용불가 , String 타입 , 변수를 저장할 영역 




숫자 및 날짜 포매팅 처리 태그



      • 숫자 출력과 파싱 관련  : <fmt:formatNumber>, <fmt:parseNumber>
      • 날짜 출력과 파싱 관련  : <fmt:foramtDate> , <fmt:parseDate>
      • 시간대 설정 관련      :  <fmt:setTimeZone>, <fmt:timeZone>


1. <fmt:formatNumber> 태그

숫자를 양식에 맞춰 출력한다.

<fmt:formatNumber value="숫자값" [type="값타입"] [patter="패턴"] [currentCode="통화코드"] [currencySymbol="통화심볼"] [groupingUsed="(true|false)"] [var="변수명"] [scope="영역"]/>



2. <fmt:parseNumber> 태그

문자열을 숫자로 변환해주는 기능을 제공한다.


<fmt:parseNumber value="값" [type="값타입"] [pattern="패턴"] [parseLocale="통화코드"] [integerOnly="true | false"] [var="변수명"] [scope="영역"]/>




이외에도 위에서 제시한 몇가지 내용이 더 있지만 그건 필요할 때 찾아보자




참고 서적 : 최범균의 JSP 2.3 웹 프로그래밍 

이 댓글을 비밀 댓글로