서블릿의 세 가지 기본 기능
- 클라이언트로부터 요청을 얻음
- 데이터베이스 연동과 같은 비즈니스 로직을 처리함
- 처리된 결과를 클라이언트에 응답
서블릿 요청과 응답 수행 API 기능
- 요청과 관련된 API : javax.servlet.http.HttpServletRequest 클래스
- 응답과 관련된 API : javax.servlet.http.HttpServletResponse 클래스
<form> 태그를 이용해 서블릿에 요청 예
<form name="frmLogin" method="get" action="login" encType="UTF-8">
아이디 : <input type="text" name="user_id"><br>
비밀번호 : <input type="password" name="user_pw"> <br>
<input type="submit" value="로그인"> <input type="reset" value="다시입력">
</form>
--> 로그인 버튼 클릭 시 <form> 태그의 action 속성에 지정한
JSP나 서블릿으로 name/value 전송
form 태그와 관련된 여러가지 속성
- name : form 태그의 이름을 지정 / 여러개의 form이 존재할 경우 구분하는 역할 / 자바스크립트에서 form 태그에 접근할 때 자주사용
- method : form 태그 안에서 데이터를 전솔할 때 전송 방법을 지정 / GET 또는 POST로 지정 (기본 GET)
- action : form 태그에서 데이터를 전송할 서블릿이나 JSP를 지정 / 서블릿으로 전송할 때는 매핑 이름을 사용
- encType : form 태그에서 전송할 데이터의 encoding 타입을 지정 / 파일을 업로드 할 때는 multipart/form-data로 지정
doGet을 이용하여 <form>태그에서 전송한 값을 받는법
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
System.out.println("아이디 : " +user_id);
System.out.println("비밀번호 : "+user_pw);
여러개의 값을 전송할 때의 요청 처리
- getParameterValues() 메서드를 이용
- 전송되는 데이터가 많을 경우 name의 값을 기억할 필요없이 getParameterNames() 메서드를 이용해 name을 얻음
getParameterValues() 메서드 이용
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
System.out.println("아이디 : "+user_id);
System.out.println("비밀번호 :"+user_pw);
String[] subject = request.getParameterValues("subject");
for(String str : subject) {
System.out.println("선택한 과목 : " + str);
}
}
getParameterNames() 메서드 이용
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
Enumeration enu = request.getParameterNames();
while(enu.hasMoreElements()) {
String name = (String)enu.nextElement();
String[] values = request.getParameterValues(name);
for(String value : values) {
System.out.println("name = "+name+", value = " + value);
}
}
}
응답 처리 방법
- doGet()이나 doPost()메서드 안에서 처리
- javax.servlet.http.HttpServletResponse 객체를 이용
- setContentType()을 이용해 클라이언트에게 전송할 데이터 종류(MIME-TYPE)을 지정함
- 클라이어트(웹 브라우저)와 서블릿의 통신은 자바 I/O의 스트림을 이용
MINE-TYPE : 톰캣 컨테이너에 미리 지정해 놓은 데이터 종류로 서블릿에서 브라우저로 전송 시 설정해서 사용
EX)
- HTML로 전송시 : text/html
- 일반 텍스트로 전송시 : text/plain
- XML 데이터로 전송시 : application/xml
서블릿 응답 처리 순서
setContentType()를 이용해 MIME-TYPE 지정 -> 데이터를 출력할 PrintWriter 객체 생성 -> 출력 데이터를 HTML형식으로 만듬 -> PrintWriter의 print()나 println()을 이용해 데이터 출력
response의 setContentType()를 통해 MIME-TYPE을 지정하고
PrintWriter을 통해 응답하는 방법
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String id = request.getParameter("user_id");
String pw = request.getParameter("user_pw");
String data = "<html>";
data += "<body>";
data += "아이디: " + id;
data += "<br>";
data += "비밀번호: " + pw;
data += "</body>";
data += "</html>";
out.print(data);
GET과 POST의 차이
- GET은 주소창에 값이 보이고 POST는 보이지 않는다.