[Java] 서블릿 기초-(1)
by Choi HyeSun
서블릿의 세 가지 기본 기능
- 톰캣과 같은 WAS(Web Application Server, 웹 애플리케이션 서버)가 처음 나왔을 때 웹 브라우저의 요청을 스레드 방식으로 처리하는 기술 : 서블릿
서블릿 기본 기능 수행 과정
-
서블릿의 세 가지 주요 기능
-
클라이언트로부터 요청을 받음
-
데이터베이스 연동과 같은 비즈니스 로직을 처리
-
처리된 결과를 클라이언트에 돌려줌
-
서블릿 응답과 요청 수행 API 기능
-
요청이나 응답과 관련된 API는 모두 javax.servlet.http 패키지에 있음
-
요청 관련 API : javax.servlet.http.HttpServletRequest 클래스
-
응답 관련 API : javax.servlet.http.HttpSErvletResponse 클래스
-
-
서블릿의 doGet()이나 doPost()메서드의 매개변수로 사용되는 예
-
doGet(HttpServletRequest request, HttpServletResponse response)
-
doPost(HttpServletRequest request, HttpServletResponse response)
-
-
세 가지 주요 기능에는 이렇게 동작
-
클라이언트로부터 톰캣 컨테이너가 요청을 받음
-
사용자의 요청이나 응답에 대한 HttpServletRequest 객체와 HttpServletResponse 객체를 만듦
-
서블릿의 doGet()이나 doPost() 메서드를 호출하며 만든 객체들을 전달
-
서블릿은 데이터베이스 연동과 같은 비즈니스 로직을 처리
-
처리된 결과를 클라이언트에 돌려줌
-
HttpServletRequest의 여러 가지 주요 메서드
반환형 | 메서드명 | 기능 |
---|---|---|
boolean | authenticate( HttpServletResponse response) |
현재 요청한 사용자가 ServletContext 객체에 대한 인증을 하기 위한 컨테이너 로그인 메커니즘 사용 |
String | changeSessionId() | 현재 요청과 연관된 현재 세션의 id를 변경하여 새 세션 id를 반환 |
String | getContextPath() | 요청한 컨텍스트를 가리키는 URI를 반환 |
Cookie[] | getCookies() | 클라이언트가 현재의 요청과 함께 보낸 쿠키 객체들에 대한 배열을 반환 |
String | getHeader(String name) | 특정 요청에 대한 헤더 정보를 문자열로 반환 |
Enumeration<String> | getHeaderNames() | 현재의 요청에 포함된 헤더의 name 속성을 enumeration 으로 반환 |
String | getMethod() | 현재 요청이 GET, POST 또는 PUT 방식 중 어떤 HTTP 요청인지를 반환 |
String | getRequestURI() | 요청한 URL의 컨텍스트 이름과 파일 경로까지 반환 |
String | getServletPath() | 요청한 URL에서 서블릿이나 JSP 이름을 반환 |
HttpSession | getSession() | 현재의 요청과 연관된 세션을 반환, 세션이 없다면 새로 만들어서 반환 |
HttpServletResponse의 여러 가지 주요 메서드
반환형 | 메서드명 | 기능 |
---|---|---|
void | addCookie(Cookie cookie) | 응답에 쿠키를 추가 |
void | addHeader(String name, String value) | name과 value를 헤더에 추가 |
String | encodeURL(String url) | 클라이언트가 쿠키를 지원하지 않을 때 세션 id를 포함한 특정 URL을 인코딩 |
Collection<String> | getHeaderNames() | 현재 응답이 헤더에 포함된 name을 얻어옴 |
void | sendRedirect(String location) | 클라이언트에게 리다이렉트(redirect) 응답을 보낸 후 특정 URL로 다시 요청하게 함 |
사전 공부1. HTML의 <form>태그
<form>
-
action : 이 폼을 전송할 URL 지정
-
method : 폼에 전송할 방식을 지정
-
GET : URL로 값을 받는 방식(쿼리스트링)
-
POST : 서버에 값을 URL이 아닌 body에 숨겨서 보내는 방식
-
-
autocomplete : 폼 내부 요소의 자동 완성 기능을 사용할지 안할지 결정
-
accept-charset : 폼 전송시 인코딩 방식을 명시함(utf-8, euc-kr 등)
-
enctype : 인코딩 방법 지정, 어떤 문자를 인코딩할 지 등을 결정
-
서버에 데이터를 보내는 양식이면 꼭 form 요소를 이용하는 것이 좋음
-
자바스크립트를 이용해도 되지만 접근성을 떨어뜨림
-
서버에 데이터를 보내지 않는다면 굳이 form안에 사용하지 않아도 됨
-
<input>
-
스스로 닫는 태그, 마지막을 /로 닫아줘야 함
-
type : 인풋의 형태 타입 결정
-
속성에 따라 텍스트 입력 뿐만 아니라 전송 버튼, 라디오 버튼, 체크 박스 등 여러가지로 표현 될 수 있음
-
text : 텍스트
-
submit : 해당 폼 안에 있는 값들이 해당 서버로 전송 됨
-
-
value : 기본 요소의 할당 값
-
텍스트 - 기본으로 적힌 텍스트 값
-
버튼 - 버튼에 표시되는 테스트
-
submit - value가 없으면 해당 브라우저의 기본 텍스트로 보여짐 (크롬>제출, 파이어폭스>질의보내기, IE>쿼리전송)
-
-
name : 데이터가 서버로 전송될 때 할당되는 변수의 이름
- 해당 변수로 value 값이 전송(name=”send” value=”전송” → “send=전송”)
<label>
-
해당 폼 요소에 어떤 값을 넣어야 하는지 라벨을 붙여주는 요소
-
웹 접근성 기준 상, 폼 입력 요소가 있다면 이에 해당하는 label 요소를 반드시 가지고 있어야 함
-
for 속성에 해당하는 폼 요소의 id 입력을 연결해서 연결
-
<label for=”id:>아이디 입력</label>
-
잘 매칭이 된다면 마우스로 label 클릭시 폼 입력 요소로 자동 포커싱
-
-
id값이 없다면 폼 요소를 label 안에 넣어서 표현할 수 있음
-
<label>아이디 입력<input type=”text” /></label>
-
국내 스크린 리더 프로그램에서 지원하지 않을 수도 있음
-
id와 for 속성을 매칭시켜주는 것이 좋음
-
<form> 태그 이용해 서블릿에 요청하기
<form> 태그로 서블릿에 요청하는 법
-
JSP, ASP, PHP가 나오기 전에는 HTML, CSS, 자바스크립트를 이용해 웹 프로그램을 만들었음
-
서블릿과 JSP는 이러한 HTML, CSS, 자바스크립트 같은 기존의 것을 버리는 것이 아님
-
기존의 것에 자신의 기능을 추가하여, 즉 서로 연동하여 동작
-
사용자의 요청은 HTML의 <form> 태그나 자바스크립트로부터 전송받아서 처리
-
-
여러가지 폼 태그 요소들을 이용하여 입력 서식에 입력 후 전송하면 사용자가 입력한 데이터가 서블릿으로 전송
- 서블릿은 여러 가지 메서드를 이용해서 전송된 데이터를 받아옴
<form> 태그의 여러가지 속성
-
프로세스
-
사용자가 자신의 ID와 비밀번호를 입력한 후 로그인을 클릭
-
<form> 태그의 action 속성은 데이터를 전송할 서블릿이나 JSP의 이름을 지정
-
지정된 이름이 login인 서블릿으로 ID와 비밀번호가 전송
-
-
로그인을 클릭했을 때 실제로 데이터가 전송되는 과정
- 실제 데이터는 각 <input> 태그의 name 속성 값과 쌍으로 전송
user_id=(값), user_pw=(값)
- 실제 데이터는 각 <input> 태그의 name 속성 값과 쌍으로 전송
-
<form> 태그와 관련된 여러가지 속성
속성 | 기능 |
---|---|
name | - <form> 태그의 이름을 지정 - 여러 개의 form이 존재하는 경우 구분하는 역할 - 자바 스크립트에서 <form> 태그에 접근할 때 자주 사용 |
method | - <form> 태그 안에서 데이터를 전송할 때 전송 방법을 지정 - GET 또는 POST로 지정(미지정시 GET) |
action | - <form> 태그에서 데이터를 전송할 서블릿이나 JSP를 지정 - 서블릿으로 전송할 때는 매핑 이름을 사용 |
encType | - <form> 태그에서 전송할 데이터의 encoding 타입을 지정 - 파일을 업로드할 때는 multipart/form-data로 지정 |
서블릿에서 클라이언트의 요청을 얻는 방법
-
HttpServletRequest 클래스에서 <form> 태그로 전송된 데이터를 받아오는 데 사용하는 메서드로는 아래 표 같은 것들이 있음
-
가장 많이 사용되는 것 : getParameter() 메서드
- 여러 개의 값은 배열로 값을 반환하는 : getParametervalue() 메서드
메서드 | 기능 |
---|---|
String getParameter(String name) | name의 값을 알고 있을 때 그리고 name에 대한 전송된 값을 받아오는데 사용 |
String[] getParameterValues(String name) | 같은 name에 대해 여러 개의 값을 얻을 때 사용 |
Enumeration getParameterNames() | name 값을 모를 때 사용 |
HttpServletRequest로 요청 처리 실습 - 한 개의 값을 전송
-
로그인창에서 ID와 비밀번호를 입력 받아 HttpServletRequest로 처리하는 간단한 프로그램
- 실제 이클립스에서 <form> 태그로 전송된 정보를 서블릿에서 받아와서 출력하는 과정
-
실습1. login.html 만들기
-
pro06이라는 새 프로젝트를 생성 후 servlet-api.jar를 클래스 패스에 지정
-
WebContent 폴더 하위에 사용자 정보를 입력 받을 login.html 생성 후 다음과 같이 작성
-
-
실습2. LoginServlet 클래스 만들기
-
sec01.ex01 패키지 생성
-
LoginServlet 클래스 생성, 단 애너테이션 서블릿 매핑 사용, 매핑명 : /login, 메서드 : init/doGet/destroy
-
-
실습3. 실행하기
-
pro06 프로젝트를 톰캣에 등록하여 실행
-
웹 브라우저에서 http://localhost:8090/pro06/login.html 호출
-
ID와 비밀번호 입력한 후 로그인
-
콘솔창 확인
-
서블릿이 처리한 후 응답 기능은 아직 미구현 → 웹 브라우저는 출력 없음
-
로그인시 id와 pw가 querystring으로 붙음
http://localhost:8090/pro06/login?user_id=sun&user_pw=sunny
-
HttpServletRequest로 요청 처리 실습 - 여러 개의 값을 전송
-
위의 예제를 조금 더 발전
-
하나의 name으로 여러 값을 서블릿으로 요청하는 방법
-
예) 로그인 후 수강과목을 입력하되 한 번에 여러 과목을 입력해서 등록 → 서블릿에서는 각 과목에 대해 여러 개의 값을 처리
-
-
실습1. WebContent 아래에 input.html 생성
- 실습2. sec01.ex01.InputServlet 클래스 생성 - servlet mapping /input, init/doGet/destroy
-
실습3. 실행하기(톰캣 재시작)
-
웹 브라우저에서 http://localhost:8090/pro06/input.html 호출
-
ID와 비밀번호 입력한 후 로그인
-
콘솔창 확인 (선택한 과목이 모두 나오는지 확인)
-
서블릿이 처리한 후 응답 기능은 아직 미구현 → 웹 브라우저는 출력 없음
-
로그인시 id와 pw가 querystring으로 붙음
http://localhost:8090/pro06/input?user_id=sun&user_pw=&subject=java&subject=%ED%8C%8C%EC%9D%B4%EC%8D%AC
-
HttpServletRequest로 요청 처리 실습 - getParameterNames() 메서드를 이용
-
전송된 데이터가 많아 일일이 name의 값을 기억하기 힘들 때
-
getParameterNames() 메서드 사용
-
일일히 getParameter() 메서드를 이용하는 것보다 훨씬 편하고, getParameter()는 매개변수를 모두 알아야 함
-
-
실습1. WebContent 아래에 input2.html 생성
- input1과 내용 거의 동일하고, action만 input2로 바꿔줌
- 실습2. sec01.ex01.InputServlet2 클래스 생성 - servlet mapping /input2, init/doGet/destroy
-
실습3. 실행하기(톰캣 재시작)
-
웹 브라우저에서 http://localhost:8090/pro06/input2.html 호출
-
ID와 비밀번호 입력한 후 로그인
-
콘솔창 확인 (선택한 과목이 모두 나오는지 확인)
-
서블릿이 처리한 후 응답 기능은 아직 미구현 → 웹 브라우저는 출력 없음
-
로그인시 id와 pw가 querystring으로 붙음
http://localhost:8090/pro06/input?user_id=sun&user_pw=&subject=java&subject=%ED%8C%8C%EC%9D%B4%EC%8D%AC
-
Enumeration : 객체들을 한 순간에 하나씩 처리할 수 있는 메서드를 제공하는 클래스
nextElement() → 다음 요소 반환
hasMoreElements() → 요소가 있으면 true, 없으면 false
서블릿의 응답 처리 방법
서블릿에서 응답을 처리하는 방법
-
doGet()이나 doPost() 메서드 안에서 처리
-
javax.servlet.http.HttpServletResponse 객체 이용
- doGet()이나 doPost()의 두 번째 매개변수
-
setContentType()을 이용해 클라이언트에게 전송할 데이터 종류(MIME-TYPE) 지정
-
클라이언트(웹브라우저)와 서블릿의 통신은 자바 I/O의 스트림 이용
MIME-TYPE
-
Client ↔ Servlet 네트워크를 통해 서로 데이터를 주고 받음
- 자바 I/O 스트림 클래스의 입출력 기능을 이용하면 쉽게 웹 어플리케이션의 네트워크 기능을 구현할 수 있음
-
Servlet → Client 때는 어떤 종류의 데이터를 전송하는지 웹 브라우저에게 알려줘야 함
-
웹 브라우저가 전송 받을 데이터의 종류를 미리 알고 있으면 더 빠르게 처리할 수 있음
-
톰캣 컨테이너에서 미리 설정해놓은 데이터 종류들을 MIME-TYPE(마임 타입)이라 함
Multipurpose Internet Mail Extensions; 다목적 인터넷 메일 확장(전자 우편의 데이터 형식을 정의한 표준 포맷)
-
-
자바(서블릿)에서 자바 I/O의 스트림 클래스를 이용하여 웹 브라우저로 데이터를 전송할 때는 MIME-TYPE을 설정해서 전송할 데이터의 종류를 지정
-
MIME_TYPE으로 지정하는 예
-
HTML 전송 : text/html
-
일반 텍스트 전송 : text/plain
-
XML 데이터 전송 : application/xml
-
-
웹 브라우저는 기본적으로 HTML만 인식
- 서블릿에서는 대부분 text/html을 사용
-
그 외 톰캣 컨테이너는 자주 사용하는 데이터 종류를 MIME-TYPE으로 지정
-
종류를 지정 후 사용하면 됨
-
새로운 종류의 데이터를 지정하고 싶으면 CATALINA_HOME\conf\web.xml에 추가
-
HttpServletResponse를 이용한 서비스 응답 실습
-
서블릿이 응답하는 예제
- 사용자가 입력한 ID와 비밀번호를 전송하면 서블릿이 다시 브라우저에게 응답하는 예제
-
서블릿이 클라이언트(웹 브라우저)에 응답하는 과정
-
setContentType()을 이용해 MIME-TYPE을 지정
-
데이터를 출력할 printWriter 객체를 생성
-
PrintWrite의 print()나 println()을 이용해 데이터를 출력
-
-
실습1. html과 servlet 만들기
-
WebContent에 login2.html 생성 (login.xml 복사 후 action만 login2로 변경
-
sec02.ex01 패키지에 Login2 클래스 추가, mapping url - /login2, init/doGet/destroy
전달받은 ID와 비밀번호를 HTML 태그로 만든 후 다시 브라우저로 응답
-
-
실습2. 실행하기(톰캣 재시작)
-
웹 브라우저에서 http://localhost:8090/pro06/login2.html 호출 후 id와 pw 입력
-
ID와 비밀번호 입력한 후 로그인
-
서블릿을 이용한 환율 계산기 예제 실습
-
서블릿을 이용하여 환율 계산기 구현하기
- 원화를 입력받아 외화로 변환해주는 프로그램
-
실습1. sec02.ex01.CalcServlet 생성 - mapping-url : /calc, doGet
-
최초 매핑명(/calc)으로 요청시 cammnd 값이 null이므로 환율 계산기가 나오도록
-
계산기에서 값을 입력해 요청할 경우 command 값이 calculate이므로 전달된 원화를 이용해 외화로 변환하여 결과 출력
-
-
실습2. 실행하기(톰캣 재시작)
- http://localhost:8090/pro06/calc로 요청 → 원화에 값 입력 → 변환 → 결과확인
Subscribe via RSS