서블릿의 요청 처리방법
https://sy-blog.tistory.com/69
서블릿이 요청을 받아 처리한 결과를 클라이언트에게 응답하는 기능을 알아보자
서블릿에서 응답을 처리하는 방법은 다음과 같다.
1) doGet() 또는 doPost() 메소드 안에서 처리한다.
2) javax.servlet.http.HttpServletResponse 객체를 이용한다.
3) setContentType()을 이용해 클라이언트에게 전송할 데이터 종류를 지정한다.
4) 클라이언트와 서블릿의 통신은 자바 I/O의 스트림을 이용한다.
서블릿 응답 처리는 doGet() 또는 doPost() 메소드의 두번째 매개 변수인 HttpServletResponse 객체를 이용하여 처리한다.
웹 브라우저와 서블릿의 응답 과정은 자바 I/O의 기능인 스트림을 이용하여 이루어진다.
MIME-TYPE
웹 어플리케이션은 클라이언트에 해당하는 웹 브라우저와 서버에 해당하는 서블릿이 서로 데이터를 주고받으면서 실행한다.
웹 브라우저가 네트워크를 통해 서블릿에 데이터를 보내는 경우 서블릿은 네트워크로부터 데이터를 입력 받는다.
반대로 서블릿이 웹 브라우저로 데이터를 전송하는 경우에는 네트워크로 데이터를 출력한다. 즉, 네트워크에 대해 자바 I/O 스트림 클래스의 입출력 기능을 이용하면 쉽게 웹 어플리케이션의 네트워크 기능을 구현할 수 있다.
서버에서 웹 브라우저로 데이터를 전송할 때는 어떤 종류의 데이터를 전송하는지 웹 브라우저에 알려줘야 한다. 그 이유는 웹 브라우저가 전송 받을 데이터의 종류를 미리 알고 있으면 더 빠르게 처리할 수 있기 때문이다.
따라서 서버(서블릿)에서 웹 브라우저로 데이터를 전송할 때는 톰캣 컨테이너에서 미리 제공하는 여러가지 전송 데이터 종류 중 하나를 지정해서 웹 브라우저로 전송한다.
이처럼 톰캣 컨테이너에서 미리 설정해 놓은 데이터 종류들을 MIME-TYPE(마임 타입) 이라고 한다.
서버(서블릿)에서 자바I/O의 스트림 클래스를 이용하여 웹 브라우저로 데이터를 전송할 때는 MIME-TYPE을 설정해서 전송할 데이터의 종류를 지정한다.
예시)
∙ HTML로 전송 시 : text/html
∙ 일반 텍스트로 전송 시 : text/plain
∙ XML 데이터로 전송 시 : application/xml
웹 브라우저는 기본적으로 HTML만 인식하므로 서블릿에서 전송하는 대부분의 데이터는 MIME-TYPE을 text/html로 지정한다.
HttpServeltResponse를 이용한 서블릿 응답 실습
login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
</head>
<body>
<form name="formLogin" 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.java
package sec01.ex01;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
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("/login")
public class LoginServlet extends HttpServlet {
public LoginServlet() {
super();
// TODO Auto-generated constructor stub
}
public void init(ServletConfig config) throws ServletException {
System.out.println("init 메소드 호출");
}
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);
}
public void destroy() {
System.out.println("destroy 메소드 호출");
}
}
GET 방식은 이렇게 구현이 간편하지만 어떤 데이터를 전송하는지가 모두 노출되기 때문에 보안상으로는 좋지 않다.
POST 방식으로 서블릿에 요청
login.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
</head>
<body>
<form name="formLogin" method="post" action="login2" 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>
LoginServlet2.java
package sec01.ex01;
import java.io.IOException;
import javax.servlet.ServletConfig;
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("/login2")
public class LoginServlet2 extends HttpServlet {
public void init(ServletConfig config) throws ServletException {
System.out.println("init 메소드 호출");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
}
protected void doPost(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);
}
public void destroy() {
System.out.println("destroy 메소드 호출");
}
}
웹 브라우저에서 전송되는 데이터는 TCP/IP의 헤더에 숨겨진 채 전송되므로 브라우저의 주소청을 보면 URL 뒤에는 아무것도 표시되지 않는다
'Web > JSP' 카테고리의 다른 글
Port 8080 required by Tomcat v9.0 Server at localhost is already in use. 오류 (0) | 2022.01.31 |
---|---|
자바스크립트로 서블릿에 요청하기 (0) | 2022.01.31 |
이클립스 Run On Server [Choose an existing server] 비활성화 돼있을 때 (0) | 2022.01.31 |
Servlet의 세가지 기능 (0) | 2022.01.31 |
[Servlet 이해하기] 서블릿이란? (0) | 2022.01.27 |