본문 바로가기
프로그래밍 놀이터/Web

Chap 03. JSP 로 시작하는 웹 프로그래밍

by 돼지왕 왕돼지 2015. 1. 3.
반응형

Chap 03. JSP 로 시작하는 웹 프로그래밍


* JSP 페이지 구성 요소


디렉티브 ( Directive )

스크립트 : 스크립트릿( Scriptlet ), 표현식( Expression ), 선언부( Declaration )

표현 언어( Expression Language )

기본 객체 ( Implicit Object )

정적인 데이터

표준 액션 태그( Action Tag )

커스텀 태그( Custom Tag ) 와 표준 태그 라이브러리 ( JSTL )



-

디렉티브


page

JSP 페이지 정보 지정

문서 타입, 출력 버퍼 크기, 에러 페이지 등 입력

taglib

태그 라이브러리 지정

include

특정 영역에 다른 문서를 포함



-

스크립트 요소


표현식( Expression ) : 값 출력

스크립트릿( Scriptlet ) : 자바 코드 실행

선언부 ( Declaration ) : 자바 메서드(함수)를 만든다.



-

기본 객체( Implicit Object )


request

response

session

application

page

...



-

표현 언어( Expression Language; EL )


JSP 페이지 내부에서 사용되는 간단한 스크립트 언어



-

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


액션 태그<jsp:include> 와 같은 형태를 취한다.

커스텀 태그는 태그 형태로 JSP 기능을 확장시킨다.

커스텀 태그 중에서 자주 사용되는 것들을 별도로 표준화한 태그 라이브러리가 JSTL ( JSP Standard Tag Library ) 이다.




* page 디렉티브


contentType : JSP 가 생성할 문서의 타입 지정 ( 기본 : text/html )

import : JSP 페이지에서 사용할 자바 클래스 지정

session : 세션 사용 여부 지정, true, false 값 ( 기본 : true )

buffer : 출력 버퍼 크기를 지정한다. none 의 경우 사용하지 않고, 8kb 와 같은 특정 값을 지정할 수 있다.

autoFlush : 출력 버퍼가 다 찼을 경우 자동으로 버퍼에 있는 데이터를 출력 스트림에 보내고 비울지 여부를 나타낸다. true, false 값을 갖는다. ( 기본 : true )

info : JSP 페이지에 대한 설명을 입력한다.

errorPage : 에러가 발생할 때 보여줄 페이지를 지정한다.

isErrorPage : 에러 페이지인지 여부를 지정한다. true, false 값을 갖는다.  ( 기본값 false )

pageEncoding : 캐릭터 인코딩 지정

isELIgnored : 표현언어 지원여부를 지정한다. true, false 값을 갖는다. ( 기본값 : false )

deferredSyntaxAllowedAsLiteral : #{} 을 통해 문자가 문자열 값으로 사용되는 것 허용여부를 지정한다. true, false 값을 갖는다. ( 기본값 : false )

trimDirectiveWhitespaces : 출력 결과에서 템플릿 텍스트의 공백 문자 제거여부를 지정한다. true, false 값을 갖는다. ( 기본값 : false )



-

contentType 속성과 캐릭터 셋


<%@ page contentType="text/html; charset=euc-kr" %>


contentType 은 text/html, text/xml, text/plain, text/json 등이 온다.


charset 은 ISO-8859-1 이 기본값으로, 대소문자 구분 없이 euc-kr 등을 입력하여 사용 가능하다.



-

import 속성


<%@ page import="java.util.Calendar, java.util.Date" %>


or


<%@ page import="java.util.Calendar" %>

<%@ page import="java.util.Date" %>



-

trimDirectiveWhitespaces 속성을 이용한 공백처리


<%@ page trimDirectiveWhitespaces="true" %>



-

JSP 페이지의 인코딩과 pageEncoding 속성


웹 컨테이너가 JSP 페이지를 읽어올 때 사용할 캐릭터 셋 결정 과정


1. 기본 인코딩을 이용해서 파일을 처음부터 읽으며, page 디렉티브의 pageEncoding 속성을 검색한다.

2. pageEncoding 속성이 값을 갖고 있다면, 속성의 값을 파일을 읽어올 때 사용할 캐릭터 셋으로 사용한다.

3. pageEncoding 속성이 없다면, contentType 속성을 검색한다. contentType 속성이 존재하고 charset 을 이용해서 캐릭터 셋을 지정했다면, 파일을 읽어올 때 사용할 캐릭터 셋으로 charset 에 지정한 값을 사용한다.

4. 모두 해당되지 않을 경우 ISO-8859-1 을 캐릭터 셋으로 사용한다.


즉, 우선순위가 pageEncoding > contentType charset > 기본값 ISO-8859-1


JSP 페이지를 읽을 때와 response encoding 값을 다르게 하고 싶다면, 아래와 같이 하면 된다.


<%@ page contentType="text/html; charset=utf-8" %>

<%@ page pageEncoding="euc-kr" %>


page loading 은 euc-kr 로 진행되고, response 값은 utf-8 로 encoding 된다.







* 스크립트 요소


-

스크립트릿 ( Scriptlet )


JSP 페이지에서 자바 코드를 실행할 때 사용되는 코드 블록이다.

<% 자바코드 %> 과 같이 사용한다.



-

표현식 ( Expression )


JSP 안에 어떤 값을 출력결과에 포함시키고자 할 때 사용한다.

<%= 변수 혹은 값 %> 과 같이 사용한다.



-

선언부 ( Declaration )


스크립트릿이나 표현식에서 사용할 수 있는 함수를 작성할 때 사용한다.

<%! 함수정의 %> 와 같이 사용한다.

일반적인 웹 어플리케이션에서는 선언부는 거의 사용하지 않는다. Class 로 정의해서 사용한다.




* reuqest 기본 객체


request 객체가 제공하는 기능은 다음과 같다.


- 클라이언트( 웹브라우저 ) 와 관련된 정보.

- 서버와 관련된 정보.

- 클라이언트가 전송한 요청 파라미터.

- 클라이언트가 전송항 헤더.

- 클라이언트가 전송한 쿠키.

- 속성 처리



-

클라이언트 정보 및 서버 정보 읽기.


String getRemoteAddr() : 클라이언트 IP 주소

long getContentLength()

String getCharacterEncoding()

String getContentType()

String getProtocol()

String getMethod()

String getRequestURI()

String getContexttPath() : JSP 페이지가 속한 웹 어플리케이션 경로

String getServerName()

int getServerPort()


ex)

http://localhost:8080/test/requestTest.jsp


getServerName() -> localhost

getServerPort() -> 8080

getContentPath() -> test

getRequestURI() -> test/requestTest.jsp



-

HTML 폼과 요청 파라미터의 처리


String getParameter( String name )

String[] getParamterValues( String name )

Enumeration getParameterNames()

Map getParameterMap()


cf) input type="checkbox", input type="radio" 의 경우 값이 없으면 파라미터 자체가 전송되지 않는다.

input type="text" 의 경우는 입력하지 않아도 빈 문자열( "" ) 이 전송된다.



-

POST 방식 파라미터의 decoding.


요청 파라미터와 같은 encoding 으로 decoding 을 해야하는데 이는 다음 코드를 통해 가능하며 POST 방식에만 유효하다.

GET 의 경우는 무조건 기본 charset 인 ISO-8859-1 로 decoding 한다.


request.setCharacterEncoding( "euc-kr" );


이 함수 호출은 request.getParameter 등과 같은 query method 호출 이전에 미리 실행되어야 한다.

그렇지 않으면 기본 charset 인 ISO-8859-1 로 decoding 시킨다.


a 태그 링크, form 을 통한 전송 등은 page encoding 을 따른다.


하지만 브라우저 주소창에 직접 URL 을 입력하는 경우는 브라우저마다 encoding 방법이 다르다.



-

GET 방식 파라미터의 decoding.


1. server.xml 파일에서 <Connector> 의 useBodyEncodingForURI 속성 값을 true 로 지정

2. server.xml 파일에서 <Connector> 의 URIEncoding 속성 값으로 원하는 캐릭터 셋을 지정



<Connnector port="8080"

protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443"

useBodyEncodingForURI="true"

URIEncoding="utf-8"

/>


1. 의 방법으로 useBodyEncodingForURI 속성을 true 로 주면, reqeust.setCharsetEncoding 으로 지정한 캐릭터 셋이 GET 으로 요청한 경우에도 적용된다. 


2. 의 방법으로 URIEncoding 값을 줄 경우 request.setCharsetEncoding 값은 무시되며 여기서 적용한 값이 적용된다.


두 값을 동시에 사용한 경우는 request.setCharacterEncoding() 을 사용해서 캐릭터 셋을 지정해주어야 제대로 작동한다.



-

요청 헤더 정보의 처리


String getHeader( String name )

Enumeration getHeaders( String name )

Enumeration getHeaderNames()

int getIntHeader( String name )

long getDateHeader( String name )




* response 기본 객체


다음 기능을 제공한다.


- 헤더 정보 입력

- 리다이렉트하기

- 잘 사용되지 않는 나머지 기능들



-

웹 브라우저에 헤더 정보 전송하기.


addDateHeader( String name, long date)

addHeader( String name, String value )

addIntHeader( String name, int value )

setDateHeader( String name, long date)

setHeader( String name, String value )

setIntHeader( String name, int value )

boolean containsHeader( String name )



-

웹 브라우저 캐시 제어를 위한 응답 헤더 입력


새로운 내용이 DB 에 추가되었는데도 불구하고 웹 브라우저에 출력되는 내용이 바뀌지 않는 경우가 있다.

웹 브라우저가 캐시 데이터를 출력하기 떄문이다.

웹 브라우저가 캐시를 사용하지 않게 하기 위해서는 아래와 같이 cache 관련된 header 정보를 추가해야 한다.


response.setHeader( "Pragma", "No-cache" ); // 1.0 버전을 위해서

response.setHeader( "Cache-Control", "no-cache" );

response.addHeader( "Cache-Control", "no-store" );

response.setDateHeader( "Expires", 1L );




* 리다이렉트를 이용해서 페이지 이동하기.


response.sendRedirect( String location )


리다이렉트는 최초 요청받은 페이지가 알아서 sendRedirect 로 지정한 위치의 페이지를 보여주는 것이 아니고, 브라우저한테 redirect 하는 위치로 다시 요청해서 값을 가져가라고 명령하는 형태이다.








반응형

댓글