Servlet 요청 API
서블릿 요청 API
- 서블릿 기본 기능
- 클라이언트로부터 요청을 받음
- 데이터베이스 연동과 같은 비즈니스 로직 처리
- 처리된 결과를 클라이언트에게 응답
- 서블릿 요청과 응답 수행 API
javax.servlet.http
패키지에 포함
- 요청과 관련된 API :
javax.servlet.http.HttpServletRequest
클래스
- 응답과 관련된 API :
javax.servlet.http.HttpServletResponse
클래스
doGet()
/ doPost()
메소드에서 request, response 객체 사용
<form> 태그로 서블릿 요청
- <form> 태그를 이용해 브라우저에서 서블릿으로 사용자의 요청이나 데이터 전송
- 서블릿 데이터를 웹 브라우저로 전송
- <form> 태그
- action 속성 : 서블릿 또는 JSP 이름 지정
- method 속성 : GET 또는 POST (default GET)
- <input> 태그
- name 속성 사용
- name 속성명과 속성값 쌍으로 전송
- 서블릿에서 클라이언트 요청에 사용되는 메소드
- HttpServletRequest 클래스의 여러 메소드를 이용해서 전송된 데이터를 얻음
- <form> 태그로 전송된 데이터를 받아오는 메소드
String getParameter(String name)
: name의 값을 알고 있을 때 그리고 name에 대한 전송 값을 받아오는 데 사용
String[] getParameterValues(String name)
: 같은 name에 대해 여러 개의 값을 얻을 때 사용
Enumeration getParameterNames()
: name 값을 모를 때 사용
<form> 태그 사용해서 HttpServletRequest 요청 처리 예제
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form name="frmLogin" method="post" action="login" >
아이디 :<input type="text" name="user_id"><br>
비밀번호:<input type="password" name="user_pw" ><br>
<input type="submit" value="로그인"> <input type="reset" value="다시입력">
</form>
</body>
</html>
loginServlet.java
ackage com.example.servlet4;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String id = request.getParameter("user_id");
String pw = request.getParameter("user_pw");
System.out.println("아이디 : " + id);
System.out.println("비밀번호 : " + pw);
}
}
GET / POST
<form> 태그를 활용 서블릿에 데이터 전송 및 출력
bookForm.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>bookForm 예제</title>
</head>
<body>
<h2>도서정보 출력</h2>
<form method="post" action="bookInsert">
<table>
<tr>
<th>도서번호</th>
<td>
<input type="text" name="bookNo">
</tr>
<tr>
<th>도서명</th>
<td>
<input type="text" name="bookName">
</tr>
<tr>
<th>저자</th>
<td>
<input type="text" name="bookAuthor">
</tr>
<tr>
<th>가격</th>
<td>
<input type="text" name="bookPrice">
</tr>
<tr>
<th>발행일</th>
<td>
<input type="text" name="bookYear" size="4">년
<input type="text" name="bookMonth" size="2">월
<input type="text" name="bookDate" size="2">일
</tr>
<tr>
<th>재고</th>
<td>
<input type="text" name="qtyNo">
</tr>
<tr>
<th>출판사번호</th>
<td>
<input type="text" name="pubNo">
</tr>
<tr>
<td>
<input type="submit" name="submit" value="등록">
<input type="reset" name="reset" value="취소">
</td>
</tr>
</table>
</form>
</body>
</html>
BookServlet.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/bookInsert")
public class BookServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String bookNo = request.getParameter("bookNo");
String bookName = request.getParameter("bookName");
String bookAuthor = request.getParameter("bookAuthor");
String bookPrice = request.getParameter("bookPrice");
String bookYear = request.getParameter("bookYear");
String bookMonth = request.getParameter("bookMonth");
String bookDate = request.getParameter("bookDate");
String qtyNo = request.getParameter("qtyNo");
String pubNo = request.getParameter("pubNo");
System.out.println("도서 번호: " + bookNo );
System.out.println("도서 명: " + bookName );
System.out.println("저자: " + bookAuthor );
System.out.println("가격: " + bookPrice );
System.out.println("발행일: " + bookYear+"-"+ bookMonth +"-"+bookMonth);
System.out.println("재고: " + qtyNo );
System.out.println("출판사 번호: " + pubNo );
}
}
여러 개의 값을 전송할 때 요청 처리
- <input> 태그에서 text 또는 radio 버튼의 경우 1개의 값을 전송하지만, 체크박스인 경우 여러 개의 값을 선택해서 여러 개 전송
getParameterValues()
메소드 사용해서 배열로 받음
input.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>여러 가지 input 타입 표시창</title>
</head>
<body>
<form name="frmInput" method="post" action="input">
아이디 :<input type="text" name="user_id"><br>
비밀번호:<input type="password" name="user_pw"><br>
이메일 수신 여부 : <input type="radio" name="emailRcv" value="yes" checked>예
<input type="radio" name="emailRcv" value="no">아니오<br>
<input type="checkbox" name="subject" value="java" checked >자바
<input type="checkbox" name="subject" value="C언어">C언어
<input type="checkbox" name="subject" value="JSP">JSP
<input type="checkbox" name="subject" value="안드로이드">안드로이드
<br><br>
<input type="submit" value="전송">
<input type="reset" value="초기화">
</form>
</body>
</html>
inputServlet.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/input")
public class InputServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String id = request.getParameter("user_id");
String pw = request.getParameter("user_pw");
String emailRcv = request.getParameter("emailRcv");
String[] subject = request.getParameterValues("subject");
System.out.println("아이디 : " + id);
System.out.println("비밀번호 : " + pw);
System.out.println("이메일 수신 여부 : " + emailRcv);
System.out.print("관심분야 : ");
for(String sub : subject) {
System.out.print(sub + " ");
}
System.out.println();
}
}
서블릿 응답 처리
- 서블릿의 응답 처리
setContentType()
을 이용해 MIME-TYPE 지정
- 데이터를 출력할 PrintWriter 객체 생성
- 출력 데이터를 HTML 형식으로 작성
- PringWriter의 print()나 println()을 이용해 데이터 출력(웹 브라우저로 전송되어 출력)
- 서블릿 응답 처리 방법
- doGet() 또는 doPost() 메소드 안에서 처리
javax.servlet.http.HttpServletResponse
객체 이용
- setContentType()을 이용해서 클라이언트에게 전송할 데이터 종류(MIME-TYPE) 지정
response.setContentType(‘text/html;charset=utf-8”);
- 클라이언트(웹 브라우저)와 서블릿 통신은 자바 I/O 스트림을 이용 (서버에서 클라이언트로 데이터 전송에 자바 I/O 스트림을 이용)
PrintWriter
클래스 사용
- PrintWriter out = response.getWriter();
- out.print(data);
- data : 웹 브라우저로 보내는 데이터
- HTML 형식으로 출력되어야 하므로
- data에 HTML 태그 포함시켜서 전송
- HTML 문서 형식을 제대로 작성해서 전송
- 전송된 HTML 형식으로 출력
- MIME-TYPE
- 톰캣 컨테이너에 미리 지정해 놓은 데이터 종류로 서블릿에서 브라우저로 전송 시 설정해서 사용
- HTML로 전송 시 : text/html
- 웹 브라우저는 기본적으로 HTML을 인식하므로 text/html로 지정
- 일반 텍스트로 전송 시 : text/plain
- XML 데이터로 전송 시 : application/xml