01. JSP에서 HTML문서를 생성하는 기본코드구조
JSP코드는 설정부분과 HTML문서를 생성하는 생성부분으로 나눌 수 있다.
설정부분에는 생성문서타입, 사용할커스텀태그, 사용할자바클래스 를 입력한다.
02. JSP페이지 구성요소
01.디렉티브
-JSP페이지에 대한 설정 정보를 지정할 때 사용

02.스크립트요소
-문서의 내용을 동적으로 생성하기 위한 요소

03.기본객체
- JSP에서 웹어플리케이션 프로그래밍을 하는데 필요한 기능을 제공해주는 기본객체로 request, response, session, application, page 등이 존재한다.
04.표현언어
- 표현언어는 ${ 와 } 사이에 정해진 문법을 따르는 식
05.표준액션태그와 태그 라이브러리
- 액션 택그는 <jsp:액션태그이름> 의 형태를 띠며 액션태그 종류에 따라서 서로 다른 속성과 값을 갖는다.
- 커스텀 태그는 JSP를 확장시켜주는 기능으로 개발자가 직접 개발하는 코드이다.
- 자주 사용되는 커스텀 태그를 표준화한 태그 라이브러리를 "JSTL(Javaserver Pages Standard Tag Library)"라고 한다.
03. page디렉티브
JSP페이지에 대한 정보를 입력하기 위해서 사용된다.

contentType 속성과 캐릭터셋
page디렉티브의contentType 속성은 JSP페이지가 생성할 문서의 타입을 지정한다.
MIME
Multipurpose Internet Mail Extensions의 약자로 메일, HTTP 등의 프로토콜에서 응답 데이터의 내용을 설명하기 위해 사용된다.
ex ) text/html , applicastion/json , text/xml
다음은 HTML문서를 생성하는 경우 contentType속성을 설정하는 예를 보여주고 있다. 기본값은 text/html이다.
기본 캐릭터셋은 ISO-8859-1을 사용하게 된다. ISO-8859-1은 한글을 제대로 표현할 수 없다.
따라서 EUC-KR이나 UTF-8 같이 한국어를 포함하고 있는 캐릭터셋을 사용해야 한다.
※ 저장할 때 사용한 캐릭터 인코딩과 page디렉티브의 contentType속성에 지정한 캐릭터셋이 일치하지 않을 떄 깨진다.
import 속성
JSP는 page디렉티브의 import속성을 사용해서 JSP코드에서 클래스의 단순 이름을 사용할 수 있다.

trimDirectiveWhitespaces 속성을 이용한 공백처리
JSP에서 디렉티브나 스크립트 코드로 인해 생김 줄바꿈 공백문자를 제거하기 위해서 사용한다.
JSP페이지의 인코딩과 pageEncoding속성
※ BOM : Byte Order Mark의 약자로 UTF-8이나 유니코드 등의 인코딩에서 바이트 의 순서가 리틀엔디언 인지 빅엔디언인지 여부를 알려주는 16비트값
JSP로드시 캐릭터셋을 결정하는 기본과정은 다음과 같다.
- 파일이 BOM으로 시작하지 않을 경우
1. 기본 인코딩을 이용해서 파일을 처음부터 읽고 page디렉티브의 pageEncoding속성을 검색해 속성값을 캐릭터셋으로 사용한다.
2. pageEncoding속성이 없다면 contentTypoe 속성의 charset을 이용해 캐릭터셋으로 사용한다.
3. 모두 해당되지 않을 경우 ISO-8859-1을 캐릭터셋으로 사용한다.
- 파일이 BOM으로 시작할 경우
1. BOM을 이용해서 결정된 인코딩을 이용하여 파일을 읽고 page디렉티브의 pageEncoding속성을 검색한다.다.
2. pageEncoding속성의값과 BOM을 이용해서 결정된 인코딩이 다르면 에러를 발생시킨다.
04. 스크립트요소
스크립트 요소에는 스크립트릿(Scriptlet) 표현식(Expression) 선언부(Declaration) 세가지가 있다.
스크립트릿
JSP에서 자바코드를 실행할 때 사용하는 코드 블록으로 <% 로 시작해서 %> 로 끝나며 안에 실행할 자바코드가 들어간다.
표현식
어떤 값을 출력결과에 포함시키고자 할 때 사용된다. <%= 값 %> 형식으로 사용된다.
선언부
JSP페이지의 스크립트릿이나 표현식에서 사용할 수 있는 메서드를 작성할 때는 선언부를 사용한다.
다음과 같은 형식으로 이루어져 있다.
다음과 같이 사용할 수 있다.

05. request 기본 객체
웹 브라우저에 웹 사이트의 주소를 입력하면 웹 브라우저는 해당 웹 서버에 연결한 후 요청 정보를 전송하는데 요청정보를 제공하는 것이 request 기본 객체이다.
request가 제공하는 기본 기능은 다음과 같이 구분된다.
- 클라이언트와 관련된 정보 읽기 가능
- 서버와 관련된 정보 읽기 가능
- 클라이언트가 전송한 요청 파라미터 읽기 기능
- 클라이언트가 전송한 요청 헤더 읽기 기능
- 클라이언트가 전송한 쿠키 읽기 기능
- 속성 처리 기능
5.1 클라이언트 정보 및 서버 정보 읽기
다음과 같이 확인 할 수 있다.

URL로부터 추출한 정보는 다음과 같다.

5.2 요청파라미터 처리
HTML폼과 요청 파라미터
HTML폼의 각 입력요소는 이름을 갖는다. 이름은 서버에 전송하는 요청 파라미터의 변수명으로 사용된다.
request 기본 객체의 요청 파라미터 관련 메서드
rqeuest 기본 객체는 웹 브라우저가 전송 한 파라미터를 읽어올 수 잇는 메서드를 제공한다.


입력한 데이터는 요청 파라미터로 전송되며 request 기본 객체의 메서드를 사용해서 요청 파라미터를 읽어올 수 있다.
pet파라미터에 경우 한개 이상의 입력값이 전달될 수 있기 때문에 request.getParameterValues() 메서드를 사용하여 String 배열로 읽어와야한다.
GET방식과 POST방식 전송
웹 브라우저는 GET방식과 POST방식의 두 가지 방식 중 한가지를 이용해서 파라미터를 전송한다.
GET 방식은 요청 URL에 파라미터(쿼리문자열)를 붙여서 전송한다.
ex ) http://localhost:8080/JSPStudy/viewParameter.jsp?name=%ED%99~&address=%EC%(%%84%EC%B0%A8%EA%B3%A1
쿼리문자열의 양식은 다음과 같이 구성 된다. 각각의 파라미터는 앰퍼샌드(&) 기호로 구분되며 이름과 값은 등호기호(=)로 구분한다.
이름1=값1&이름2=값2
파라미터 값을 RFC2396규약에 정의된 규칙에 따라 인코딩해서 전송하기 "EC%(%%84%E" 다음과 같이 표시된다.
EC%(%%84%E 는 파라미터값을 UTF-8로 인코딩 한 결과이다.
웹 브라우저가 GET방식으로 데이터를 전송하는 경우, 웹 브라우저에서 웹 서버로 전송되는 데이터는 다음과 같은 형식을 갖는다.
웹 브라우저는 HTTP프로토콜에 맞춰 위 코드와 같은 데이터를 전송한다.
프로토콜에 따르면 첫줄은 요청방식과 URI, HTTP프로토콜버전을 명시하도록 되어있다.
POST방식은 데이터 영역을 이용해서 파라미터를 전송한다.
데이터 영역에 파라미터 데이터가 전송되는 것을 확인 할 수 있다.
GET방식은 파라미터값의 길이에 제한이 있을 수 있으나 POST방식은 데이터 영역을 이용해서 데이터를 전송하기 때문에 파라미터 길이에 제한이 없다.
요청 파라미터 인코딩
웹 브라우저는 웹서버는 파라미터를 전송할 때 알맞은 캐릭터셋을 이용해서 파라미터 값을 인코딩한다.
반대로 웹 서버는 알맞은 캐릭터셋을 이용해서 웹브라우저가 전송한 파라미터 데이터를 디코딩 한다.
어떤 캐릭터셋을 사용할지의 여부는 두 전송방식 GET방식과 POST방식에 달라진다.
POST방식의 경우 입력폼을 보여주는 화면이 사용하는 캐릭터셋을 사용한다.
form.jsp에서 다음과 같이 캐릭터셋을 지정하고 있기 때문에 전송시 UTF-8 캐릭터셋을 이용해서 인코딩한 값을 서버에 전송한다.
JSP는 request 기본 객체의 setCharacterEncoding() 메서드를 사용해서 파라미터 값을 디코딩할 때 사용할 캐릭터셋을 지정할 수 있다.
만약 request.setCharacterEncoding() 메소드로 캐릭터셋을 지정하지 않을 경우 ISO-8859-1 캐릭터셋을 기본으로 사용한다.
request.setCharacterEncoding() 메서드는 파라미터 값을 사용하기 전에 실행해주어야 한다.
캐릭터셋을 지정하기 전에 파라미터 값을 사용하면 모든 파라미터 값을 기본 캐릭터 셋(ISO-8859-1)을 이용해서 디코딩한다.
GET 방식으로 파라미터 전송 시에는 다음과 같다.

익스플로러는 MS949 캐릭터셋을 크롬은 UTF-8 캐릭터셋을 인코딩해서 전송한다.
WAS마다 GET방식의 디코딩 결정 캐릭터셋도 다르다.
톰캣8은 UTF-8 캐릭터셋을 사용하지만 톰캣7의 경우는 ISO-8859-1을 사용한다.
또한 GET방식으로 전송 된 파라미터에 대해서는 request.setCharacterEncoding()메서드로 지정한 캐릭터 셋이 적용되지 않는다.
톰캣에서 GET방식 파라미터를 위한 인코딩 처리하기
톰캣에서 UTF-8이 아닌 다른 캐릭터셋을 이용해서 GET방식의 파라미터를 디코딩 하는 경우
톰캣/conf/server.xml 파일에서 <Connector>의 useBodyEncodingForURI 속성값을 true로 지정하여 한다. 지정 시 request.setCharacterEncoding() 메서드로 지정한 캐릭터셋을 이용하여 파라미터를 올바르게 읽어 올 수 잇게 된다.
5.3 요청 헤더 정보의 처리
HTTP 프로토콜은 헤덩 정보에 부가적인 정보를 담고 있다.
request 기본 객체는 이러한 헤덩 정보를 읽어 올 수 있는 기능을 제공하고 있다.
06. response 기본 객체
response 기본 객체는 웹 브라우저에 보내는 응답정보를 담는다.
response 기본 객체는 다음 기능을 제공한다.
- 헤더 정보 입력
- 리다이렉트 하기
6.1 웹브라우저에 헤더 정보 전송하기
response 기본 객체는 응답 정보에 헤더를 추가하는 기능을 제공한다. 헤더 관련 메서드는 다음과 같다.

6.2 웹 브라우저 캐시 제어를 위한 응답 헤더 입력
HTTP는 웹 브라우저가 응답 결과를 캐시 할 것인지에 대한 여부를 설정할 수 있다. 응답 헤더에 관련된 헤더는 다음과 같다.

다음은 캐시를 보관하지 않도록 설정하는 코드이다.
위 코드에서 Expires 응답 헤더의 값으로 long 타입 숫자를 설정했다.
이 값은 1970년 1월1일 이후를 기준으로 1/1000초 단위로 값을 입력한다.
웹 브라우저가 응답을 캐시하지 않도록 하고 싶다면 이값을 현재 시간보다 이전 값으로 지정하면 된다.
6.3 리다이렉트를 이용해서 페이지 이동하기
리다이렉트는 웹 서버가 웹 브라우저에게 다른 페이지로 이동하라고 응답하는 기능이다.
다음은 리다이렉트 예제 이다.
URL을 입력해서 테스트 시 쿼리문자열을 인코딩 한 형태로 URL를 입력해야 한다.
예를 들어 파라미터 입력 값이 자바 인 경우 '%EC%9E%90%EB%B0%94'로 변경해주는 작업을 개발자가 손으로 계산해야 한다면 괴롭겠지만
java.net.URIEncoder 클래스의 URLEncode.encode() 메서드 사용하면 파라미터 값을 쉽게 인코딩 할 수 있다.