Servlet JSP MVC Spring

[Servlet] 서블릿에서의 요청 얻기와 응답

vhxpffltm 2020. 2. 8. 21:47

서블릿은 클라이언트가 요청을하고 서블릿과 데이터베이스 연동과 같은 비지니스 로직을 처리한 후 처리된 결과를 클라이언트에 돌려주는 기능을 한다.

 

이번 시간에 서블릿의 응답과 수행 요청 처리에대해 알아보자.

 

요청 : javax.servlet.http.HttpServletRequest 클래스

응답:  javax.servlet.http.HttpServletResponse 클래스  에 정의되있다.

 

API에서 함수 이름은 doGet() 이나 doPost() 메서드의 매개변수를 통해 확인할 수 있다.

 

서블릿에서 클라이언트의 요청 얻기

서블릿/JSP 프로그래밍을 위해서 HTML이나 javascript 내용에 대해 알아두면 좋다. 이 개념을 바탕으로 요청 처리를 해보자.

 

새로운 프로젝트를 만든다. dynamic 프로젝트로 생성하고 아래 그림과 같은 경로에 클래스와 html 파일을 생성해보자.

 

 

각 파일의 코드내용은 아래와 같다.

 

login.html

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<form name="frmLogin" method="get" action="login"  encType="UTF-8"> <!-- 입력 데이터를 서블릿 매핑 이름 Login인 서블릿으로 전송 -->
       아이디  :<input type="text" name="user_id"><br> <!-- 텍스트 박스에 입력된 id를 user_id로 전송 -->
           비밀번호:<input type="password" name="user_pw" ><br><!-- 비밀번호를 user_pw로 전송 -->
    <input type="submit" value="로그인">  <input type="reset" value="다시입력">
</body>
</html>
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

LoginServlet.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package sec01.ex01;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
 
 
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init 메서드 호출");
    }
 
    public void destroy() {
        System.out.println("destroy 메서드 호출");
    }
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //request 변수는 웹 브라우저에서 전송한 정보를 톰캣 컨테이너가 HTTP..객체를 생성한 후 doGet()으로 넘겨줌  
        request.setCharacterEncoding("utf-8");     //전송된 데이터를 UTF-8로 인코딩
        String user_id=request.getParameter("user_id"); 
        String user_pw=request.getParameter("user_pw"); //getParameter 메서드로 input태그의 name속성 값으로 전송된 값을 받아옴
        System.out.println("아이디:"+user_id);
        System.out.println("비밀번호:"+user_pw);
    }
 
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

html파일은 로그인창에서 ID와 비밀번호를 입력 받은 후 서블릿으로 전송한다.

java파일은 getParameter 메서드로 전송된 ID와 비밀번호를 받아온다.

해당 프로젝트를 톰캣에 연결시키고 로컬 호스트로 접속해본다. html파일로 접속한다.

결과는 아래와 같다. 

 

 

이렇게 입력만 할수 있지 웹 페이지는 아무런 변화가 없을 것이다. 이클립스에서 여러분이 입력한 아이디와 비밀번호를 확인할 수 있다. 이렇게 서블릿을 통해 무언가를 요청하는 처리이다.

 

 

여기서 위 프로그램을 조금 더 추가하여 여러 값을 서블릿으로 전송해보자. 새로운 html파일을 아까와 같은 경로로 만들어 아래와 같이 코딩한다.

 

input.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<form name="frmInput" method="get" action="input">
   아이디  :<input type="text" name="user_id"><br>
   비밀번호:<input type="password" name="user_pw"><br>
   <input type="checkbox" name="sub" value="java" checked >자바
   <input type="checkbox" name="sub" value="C언어">C언어
   <input type="checkbox" name="sub" value="JSP">JSP
   <input type="checkbox" name="sub" value="안드로이드">안드로이드 
   <br><br>
   <!-- name 속성이 sub 라는 이름으로 모두 같다. -->
   <input type="submit" value="전송">  
   <!-- 전송 을 클릭하면 매핑 이름이 action에 설정한 input 서블릿으로 전송된다. --> 
   <input type="reset" value="초기화">
  </form>
</body>
</html>
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

inputServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package sec01.ex01;
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
 
/**
 * Servlet implementation class inputServlet
 */
@WebServlet("/input")
public class inputServlet extends HttpServlet {
 
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init method 호출");
    }
 
    public void destroy() {
        System.out.println("destroy method call....");
    }
 
    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[] sub = request.getParameterValues("sub");
        //위 함수를 통해 html에서 받은 name인 sub로 전송된 값들을 문자열 배열에 저장ㄹ한다.
        for(String s : sub) {
            System.out.println("choice subject : " + s);
        }
    }
 
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

 

코드에서 필요한 부분들은 주석으로 처리하였다. 

우리는 html파일에서 전송된 값을 getParameter() 및 getParameterValues() 메서드로 받아오는 방법으로 요청을 처리하는 방법을 배웠다. 이렇게만 알아두자. 

*필자의 이클립스와 서블릿에서 한글깨짐 현상이 나타나 문제가 있어 추후에 수정하도록 하겠다. 톰캣 서버의 Context를 변경하거나 원래는 위의 코드를 작성하라고 해결책이 있지만 아직 해결하지 못하였다.

 

 

서블릿의 응답 처리 방법

 

이번에는 서블릿이 처리한 결과를 클라이언트에게 응답하는 기능을 알아보자. 

doGet()이나 doPost() 메서드 안에서 처리하며 setContentType()을 이용해 클라이언트에게 전송할 데이터 종류를 지정하며 클라이언트와 서블릿의 통신은 자바 I/O 스트림을 이용한다.

 

요청시에 봤던 함수 인자중 두번째 매개변수인 HttpServletResponse 객체를 이용해 처리한다.

 

Mime-TYPE이란 톰캣 컨테이너에서 미리 설정해 놓은 데이터 종류들이다. 미디어 코덱에서도 이같은 용어를 사용한다. 웹 브라우저는 기본적으로 HTML만 인식하므로 서블릿에서 전송하는 대부분의 데이터는 text/html로 지정한다. 

 

위에서 진행한 login.html로 테스트해보자. login.html의 <form> 태그의 action='login2' 로 바꾸어 매핑할 서블릿 매핑이름을 변경한다.

 

그리고 아래와 같이 새로운 클래스를 생성한다.

 

LoginServlet2.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package sec01.ex01;
 
 
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
 
/**
 * Servlet implementation class LoginServlet2
 */
@WebServlet("/Login2")
public class LoginServlet2 extends HttpServlet {
    
    public void init(ServletConfig config) throws ServletException {
        System.out.println("LoginServlet2의 init() 메서드 호출");
    }
    public void destroy() {
        System.out.println("LoginServlet2의 destroy() 메서드 호출");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8"); //응답할 데이터의 종류가 HTML임을 설정
        PrintWriter out = response.getWriter(); // getWriter()메서드로 출력 스트림 PrintWriter 객체를 받아옴
        String id = request.getParameter("user_id");
        String pw = request.getParameter("user_pw");
        
        String data = "<html>";
        data += "<body>";
        data += "아이디 : " + id;
        data += "<br>";
        data += "비밀번호 : " + pw;
        data += "</html>";
        data += "</body>";
        out.print(data);
        //브라우저로 출력할 데이터를 문자열로 연결해 HTML 태그로 만듬
        // PrintWriter의 print를 이용해 HTML 태그 문자열을 웹 브라우저로 출력
    }
 
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

결과는 아래와 같다.

 

 

주소로 들어가면 아이디와 비밀번호 입력폼이 뜨는데 그 결과가 웹으로 전달된것을 볼 수 있다.

 

여기까지 클라이언트의 입력한 데이터를 서블릿으로 전송하면 서블릿에서 요청을 받는 방법에 대해 알아보았다. 

 

 

Refernce

자바 웹을 다루는 기술<길벗>