서블릿 기초
Servlet의 세가지 기본 기능
- Servlet이 수행하는 세가지 주요 기능은 다음과 같다.
- 클라이언트로부터 요청을 받는다.
- 비즈니스 로직을 처리한다.
- 처리된 결과를 클라이언트에게 응답으로 내려보낸다.
- 초기 웹 프로그램 개발에서는 서블릿이 클라이언트로부터 요청을 받아 비즈니스 작업을 처리한 후 그 결과를 클라이언트의 브라우저로 전송하는 방식으로 작업했다.
Servlet 요청과 응답 API
- 요청과 응답에 관련된 API는 모드
javax.servlet.http
패키지에 있다.HttpServletRequest
HttpServletResponse
protected void doGet(HttpServletRequest request, HttpServletResponse response) //<<<<
throws ServletException, IOException {
//...
}
- 클라이언트가 서블릿에 요청을 하면 먼저 톰캣 컨테이너가 받는다.
- 사용자의 요청이나 응답에 대한
HttpServletRequest
객체와 HttpServleyResponse
객체를 만들고 doXXX()
메소드를 호출하면 이 객체들을 전달한다. - 톰캣이 사용자 요청에 대한 정보를 모든
HttpServletRequest
객체의 속성으로 담아 메소드로 전달하므로 HttpServletRequest
에서 제공하는 메소드들은 매개변수로 넘어온 객체들을 이용해 사용자가 전송한 데이터를 받아오거나 응답할 수 있는 것이다.
Servlet에서 클라이언트의 요청을 얻는 방법
HttpServletRequest
에서 <form>
태그로 전송된 데이터를 받아오는데 사용되는 메소드String getParameter(String name)
: name의 값을 알고 있을때 전송된 값을 받아올때 사용된다.String[] getParameterValues(String name)
: 같은 name에 대해 여러개의 값을 얻을 때 사용된다.Enumeration getParameterNames()
: name 값을 모를때 사용
하나의 파라미터 요청처리; getParameter()
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인 창</title>
</head>
<body>
<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>
</body>
</html>
LoginServlet
servlet을 만든다
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
public void init() throws ServletException {
System.out.println("Call init method");
}
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("ID: " + user_id);
System.out.println("PW: " + user_pw);
}
}
- 아래는
localhost:8080/project/login.html
을 실행 했을때 결과
Call init method
ID: null
PW: null
ID: asdf
PW: asd
여러개의 값을 전송할 때 요청 처리; getParameterValues()
- input.html 코드
- InputServlet 클래스 코드;
getParameterValues()
@WebServlet("/input")
public class InputServlet extends HttpServlet {
public void init() throws ServletException {
System.out.println("Call init method");
}
@Override
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("ID: " + user_id);
System.out.println("PW: " + user_pw);
String[] subject = request.getParameterValues("subject");
for (String elem : subject) {
System.out.println("select subject: " + elem);
}
}
public void destroy() {
System.out.println("Call destroy method");
}
}
Call init method
ID: asdf
PW: asdf
select subject: java
ID: afs
PW: dfsa
select subject: jsp
ID: afs
PW: dfdfa
select subject: jsp
select subject: spring
파라미터 일괄조회; getParameterNames()
- input_gpn.html 코드
- InputGPNServlet 코드
@WebServlet("/input_gpn")
public class InputGPNServlet extends HttpServlet {
public void init() throws ServletException {
System.out.println("Call init method");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
Enumeration enums = request.getParameterNames();
while (enums.hasMoreElements()) {
String name = (String) enums.nextElement();
String[] values = request.getParameterValues(name);
for (String value : values) {
System.out.println("name: " + name + " value: " + value);
}
}
}
public void destroy() {
System.out.println("Call destroy method");
}
}
Call init method
name: user_id value: sdfafg
name: user_pw value: asdf
name: subject value: java
name: subject value: c언어
name: subject value: jsp
Servlet의 응답 처리 방법
- 서블릿에서 응답을 처리하는 방법은 다음과 같다
doGet()
이나 doPost()
안에서 처리한다HttpServletResponse
를 이용한다.setContentType()
을 이용해 클라이언트에게 전송할 MIME-TYPE을 지정한다.- 클라이언트와 서블릿 통신은 자바 I/O스트림을 이용한다.
HttpServletResponse를 이용한 서블릿 응답 실습
- 응답하는 순서는 다음과 같다
setContentType()
을 이용해 MIME타입 지정- 데이터를 출력할
PrintWriter
객체를 만든다 - 출력 데이터를 HTML형식으로 만든다
PrintWriter
의 print()
나 println()
을 이용해 데이터를 출력한다.
- login_response.html 코드
- LoginResponseServlet 코드
@WebServlet("/login_response")
public class LoginResponseServlet extends HttpServlet {
public void init() throws ServletException {
System.out.println("Call init method");
}
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 user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
System.out.println("ID: " + user_id);
System.out.println("PW: " + user_pw);
String data = "<html><body>";
data += "아이디: " + user_id + "<br/>";
data += "비밀번호: " + user_pw + "<br/>";
data += "</body></html>";
out.print(data);
}
}
웹브라우저에서 Servlet으로 데이터 전송하기
GET/POST 전송 방식
GET 방식
- servlet에 데이터를 전송할 때는 데이터가 URL뒤에 name-value 형태로 전송된다.
- 여래기의 데이터를 전송할 때는 &로 구분한다
- 전송할 수 있는 데이터는 최대 255자
- 기본 전송 방식이다
- 웹브라우저에서 직접 입력해서 전송할 수도 있다.
POST 방식
- servlet에 데이터를 전송할 때는 TCP/IP 프로토콜 데이터의 HEAD영역에 숨겨서 전송된다.
- 전송 데이터 용량이 무제한이다
- 전송시 servlet에서 또 다시 가져오는 작업을 해야한다.
POST방식으로 servlet에 요청
- login_post.html 코드
- LoginPostServlet 코드
@WebServlet("/login_post")
public class LoginPostServlet extends HttpServlet {
public void init() throws ServletException {
System.out.println("Call init method");
}
protected void doPost(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("ID: " + user_id);
System.out.println("PW: " + user_pw);
}
}
- 전송방식과 다른 메소드로 처리하면 405에러가 발생한다.
GET과 POST 요청을 동시에 처리하기
- login_handle.html 코드
- LoginHandleServlet 코드
@WebServlet("/login_handle")
public class LoginHandleServlet extends HttpServlet {
public void init() throws ServletException {
System.out.println("Call init method");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("Call doGet method");
doHandle(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("Call doPost method");
doHandle(request, response);
}
private void doHandle(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("Calll doHandle method");
request.setCharacterEncoding("UTF-8");
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
System.out.println("ID: " + user_id);
System.out.println("PW: " + user_pw);
}
}
응용방안
- servlet단에서 로그인 유효성 검사
- servlet단에서 로그인시 관리자 화면 나타내기