시작하기 전) <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 구조 설명
- <%@ page %> : 지시자
- contentType="text/html : JSP 페이지로 text 형식의 html 문서를 생성한다.
- charset=UTF-8 : JSP 페이지로 문서를 생성할 때 캐릭터셋(charset)인코딩은 UTF-8로 생성하겠다.
> charset의 기본값 : ISO-8859-1(한글 깨짐)
> 따라서 UTF-8 또는 EUC-KR 인코딩을 사용(한국에서만 사용할 거면 EUC-KR로!)
- pageEncoding="UTF-8" 이 부분은 다음에 자세히 설명해주실 예정
1. GET 방식 전송과 POST 방식 전송
- form 태그에 method 기본 값은 GET 방식
- GET 방식은 요청URL에 파라미터를 붙여서 전송한다. 즉, 쿼리스트링에 ? 뒤로 날아가는 것
ex) http://localhost/jspPro/days02/ex07_ok.jsp?name=%ED%99%8D%EA%B8%B8%EB%8F%99&gender=f
- POST 방식은 데이터 영역을 이용해서 파라미터를 전송한다.
- GET 방식은 전송할 수 있는 파라미터 값의 길이 제한이 있지만, POST 방식은 데이터 영역을 이용해서 데이터를 전송하기 때문에 길이의 제한이 없다.
1-1. 요청 파라미터 인코딩
- 웹 브라우저는 웹 서버에 파라미터를 전송할 때 알맞은 캐릭터 셋을 이용해서 파라미터 값을 인코딩함
- 반대로 웹 서버는 알맞은 캐릭터 셋을 이용해서 웹 브라우저가 전송한 파라미터 데이터를 디코딩함
- 웹 브라우저가 인코딩할 때 사용한 캐릭터 셋과 웹 서버가 디코딩할 때 사용한 캐릭터 셋이 다르면, 웹 서버는 잘못된 파라미터 값을 사용하게 됨
response.setContentType("text/html; charset=UTF-8")
- 서블릿을 응답할 때 한글이 깨지지 않도록 맨 위에 설정
- 응답할 때 사용
request.setCharacterEncoding("UTF-8")
- UTF-8 데이터를 전송하면 WAS(톰캣8)는 따로 디코딩 charset을 설정하지 않으면 기본 get 방식은 UTF-8로 디코딩을 하지만, 기본 POST 방식은 ISO-8859-1로 디코딩을 하기 때문에 POST 방식은 charset을 설정해 주지 않으면 한글이 깨져서 보인다.
- 요청 후 응답 받을 때 사용
비유) A가 영어로 작성하여 WAS가 영어로 받음(CharacterEncoding) B가 일본사람이라면 일본어로 번역하여 다시 보내줄 때(ContentType)
PrintWriter out = response.getWriter()
- 응답할 때 사용하는 메서드
- out으로 출력하겠다.
- 요청을하면 html 문서를 출력해주어야 함(응답)
out.println() 으로 html 태그 출력
ex) out.println("<!DOCTYPE html>");
2. 서블릿(Servlet)
2-1. 서블릿(Servlet)이란?
- java 언어를 사용하는 웹 기술(서블릿, jsp)
- JSP 표준이 나오기 전에 만들어진 표준
2-2. 서블릿(Servlet) 구현 방법(과정)
1) [서블릿 규약]을 따르는 자바 클래스 선언
ㄱ. 자바 클래스의 접근 지정자 : public
ㄴ. javax.servlet.http.HttpServlet 클래스 상속 받아야함
ㄷ. service(), doGet(), doPost() 메서드 오버라이딩
> service 함수는 get, post 방식 모든 요청을 처리
> doGet 함수는 get 방식의 요청이 있으면 호출되어짐
> doPost 함수는 post 방식의 요청이 있으면 호출되어짐
2) 자바 코드를 컴파일해서 클래스 파일 생성
3) 클래스 파일(.class)을 반드시 WEB-INF/classes 폴더 안에 넣어둬야 한다.
* 2) + 3) 작업을 이클립스 툴을 사용하면 자동으로 컴파일 + classes 폴더에 넣기 때문에 안해도 된다.
4) web.xml(DD파일)에 서블릿 등록하는 작업(4. Servlet 등록 참조)
- web.xml 파일을 수정했으면 서버 재시작 필수, console 창에서 에러가 발생했는지 확인하기
- 서블릿을 등록하려면 2가지 설정을 해야함(4. Servlet 등록 참조)
ㄱ. 서블릿으로 사용할 클래스
ㄴ. 서블릿과 URL 간의 매핑(3. URL 패턴 매핑 규칙 참조)
> 서블릿 클래스를 요청할 때는 요청URL로 인해서 요청하는 것을 매핑이라고 함
5) 톰캣 등의 웹 서버 실행
6) 요청URL를 통해 서블릿 응답
- 요청URL? context path 뒤에 있는 URL이 요청 URL이다.
통신규약//도메인/context path/요청URL
ex) http://localhost/jspPro/요청URL
1) 서블릿 규약을 따르는 자바 클래스 선언
- 프로젝트 폴더에 src/main/java 경로에 Class 생성
- superclass에 HttpServlet 넣기
- Alt+Shift+S 단축키로 doGet, doPost, service 메서드 오버라이딩
Now.java 코드
3. URL 패턴 매핑 규칙
1) 무조건 /로 시작해서 /* 끝나는 것 == / ~~~ /* : 경로 매핑을 위해 사용
2) 무조건 *로 시작해서 그 뒤에 내가 원하는 확장자명 == *.확장자명 : 확장자에 대한 매핑을 할 때 사용
3) 오직 / 사용 == / 외에 아무것도 없음 : 모든 것을 의미함. 기본 서블릿으로 매핑
4) 위 3가지 규칙 외 나머지 다른 문자열은 정확한 매핑을 위해서 사용
요청 URL 패턴 예시)
/foo/bar/ | 1) 해당 |
/bax/* | 1) 해당 |
/catalog | 4) 해당 |
/ | 3) 해당 |
*.bop | 2) 해당 |
요청 URL | 요청 URL 패턴 | 설명 |
http://localhost/jspPro[/foo/bar/index.html] | /foo/bar/ | http://localhost/jspPro[/foo/bar/index.html]로 요청이 들어와서 URL 패턴과 일치할 시 서블릿 호출 |
http://localhost/jspPro[/foo/bar/lndex.bop] | /foo/bar/ | http://localhost/jspPro[/foo/bar/lndex.bop]로 요청이 들어와서 URL 패턴과 일치할 시 서블릿 호출 |
4. 서블릿(Servlet) 등록
1번 작업 : 서블릿으로 사용할 클래스
<servlet></servlet> 태그 안에 <servlet-name></servlet-name>태그와 <servlet-class></servlet-class> 태그를 사용하여 서블릿으로 사용할 클래스와 클래스명을 명명한다.
<description></description> 태그는 설명을 달 수 있는 태그이다.
2번 작업 : 서블릿과 URL 간의 매핑
<servlet-mapping></servlet-mapping> 태그 안에 <servlet-name></servlet-name> 태그와 <url-pattern></url-pattern> 태그를 사용하여 URL 패턴을 가진 요청URL이 들어오면 서블릿 이름을 가진 서블릿을 응답한다.
- 서블릿 규약을 따르는 자바 클래스를 선언하고 서블릿을 등록하면 Deployment Descriprot 안에 Servlet Mappings와 Servlert에서 생성한 패턴과 서블릿을 확인할 수 있다.
[ 서블릿 구현하는 예제(2,3,4번 관련) ]
- ex02.jsp / Now.java / web.xml
- web.xml에 서블릿을 등록하는 작업은 4. 서블릿 등록 참조
- Now.java는 서블릿 규약을 따르는 부분의 Now.java 코드 참고
[ex02.jsp]
> ex02.jsp를 실행시켜 아래의 a 링크 태그를 클릭하면 요청 URL을 통해 서블릿(Now.javA)이 응답하여 웹 브라우저를 띄워준다.
[응답한 서블릿 결과]
5. @WebServlet 어노테이션을 사용해서 자동으로 서블릿 등록
- 서블릿 version 2.5까지는 서블릿을 web.xml에 등록해야 서블릿 클래스 사용 가능
- 서블릿 version 3.0부터는 @WebServlet 어노테이션을 사용하면 웹 컨테이너(ex. 톰캣)이 자동으로 서블릿을 등록
- 현재 사용하고 있는 서블릿 version 확인은?
> WAS 서버 version에 따라서 달라지고 현재 본인이 사용하고 있는 tomcat 8.5는 서블릿 4.0 version이다. (톰캣은 사이트에 접속하여 각 버전의 Reference 확인하면 되어짐)
[@WebServlet 어노테이션을 사용해서 자동으로 서블릿 등록하는 법]
- src/main/java 안에서 우클릭하여 생성을 하면 위와 같은 과정을 거치지 않고 바로 서블릿을 생성할 수 있다.
- URL 매핑 패턴도 URL mappings에서 Add 클릭 후 추가할 수 있다.
- Description에는 설명하는 글을 작성
- doPost, doGet, service 선택 후 finish
[ @WebServlet 어노테이션을 사용해서 자동으로 서블릿 등록하는 예제 ]
[ex03_ok.jsp]
[ex03.jsp]
[ @WebServlet 어노테이션으로 Info.java 생성 ]
> URL mappings에서 Add 클릭 후 추가한 패턴과 Description 내용이 아래와 같이 나타남
[Info.java 전체 코드]
> href의 경로를 context path로 지정해주면 경로가 바뀌어도 잘 가져와진다. (6. request 정리 참조)
[결과]
6. JSP 기본 객체 중에 가장 많이 사용하는 request 객체
6-1. request 기본 객체가 제공하는 기능
1) 클라이언트(웹 브라우저)와 관련된 정보 읽기 기능
2) 서버와 관련된 정보 읽기 기능
3) 클라이언트가 전송한 [요청] 파라미터 읽기 기능
4) 클라이언트가 전송한 요청 헤더 읽기 기능
5) 클라이언트가 전송한 쿠키 읽기 기능
(js 쿠키 정보 : document.cookie)
6) 속성 처리 기능
6-2. 클라이언트 정보 및 서버 정보 읽기
예시)
6-3. request 기본 객체의 요청 파라미터 메서드
1) getParameter(String name) *** 가장 많이 사용 ***
2) getParameterValues(String name)
3) getParameterNames()
4) getParameterMap()
예제)
[ex07.jsp]
[ex07_ok.jsp]
[결과]
- ex07.jsp에서 체크한 라디오버튼과 체크박스의 값을 ex07_ok.jsp에도 동일하게 적용 되어짐
6-4. request 객체로 헤더 정보를 얻어올 수 있다.
- http 프로토콜의 헤드에는 부가적인 정보가 담겨있다.(웹 브라우저 종류, 선호하는 언어 등등)
1) String getHeader(String name) : 지정한 이름의 헤더 값을 구한다
2) Enumeration getHeaders(String name) : 지정한 이름의 헤더 목록 반환
3) Enumeration getHeaderNames() : 모든 헤더의 이름 반환 ***
4) int getIntHeader(String name) : 지정한 헤더의 값을 정수 값으로 반환
5) long getDateHeader(String name) : 지정한 헤더의 값을 시간 값으로 반환(1970.01.01~ms)
예시)
'TIL > View Template' 카테고리의 다른 글
[SIST] JSP_days04_부서 선택시 해당 부서의 사원 정보를 테이블로 출력하는 예제 (0) | 2022.06.18 |
---|---|
[SIST] JSP_days03_response 객체 / 리다이렉트(redirect) / 포워드(forward) / GET 방식 + 서블릿 + JDBC + 포워딩 예제(JSTL 맛보기) (0) | 2022.06.16 |
[SIST] JSP_days02_DB연동해보기(JDBC) (0) | 2022.06.15 |
[SIST] JSP_days02_예제 (0) | 2022.06.15 |
[SIST] JSP_days01 (0) | 2022.06.14 |