티스토리 뷰

프로그래밍/JSP

Servlet

안싱미 2016. 2. 3. 13:10

서블릿(Servlet)

- 서블릿은 웹에서 자바 프로그래밍을 구현하기 위해 탄생.
- 클라이언트의 요구를 받아 그에 대한 처리를 한 후 결과를 되돌려주는 서버 모듈이라고 이해하면 된다.    
  더 쉽게 말하면, 사용자에게 정보를 입력받아 적절한 HTML 문서를 돌려주는 역할 이다.
- 서블릿은 JSP에서 컨텐츠와 비즈니스로직을 분리한다.
- HTTP protocol 서비스를 지원하는 javax.servelet.http.HttpServlet 클래스를 상속하여 개발한다.

import javax.servlet.http.HttpServlet;

자바와 크게 다르지 않다. 디스플레이에 대한 것들이 모두 빠진다. 무언가를 입력이 받는 코드, 출력을 해주는 코드가 빠진다. 그렇게 된다면 비즈니스 로직만 남게된다. 그렇기 때문에 소스가 간결해지고 깔끔해지고 이해하기 쉬워진다. 그리고 지금부터는 Scanner라는 것 대신에 input type text, password, number, date 등으로 대체한다. Scanner가 가지고 있는 버그들... 한글 잘못써서 다시 시작을 해야하는 에러 때문에 스트레스 받을 필요도 없다.!

jsp도 조금도 쉬워지니까 희망을 가지고 시작해본다.

동작 순서

① 사용자가 URL을 클릭하면 HTTP Request를 Servlet Cotntainer에 보낸다.
② Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성한다.
③ 사용자가 요청한 URL을 분석하여 어느 서블릿에 대한 요청인지 찾는다. (DD를 참조하여 분석)
④ 컨테이너는 서블릿 service() 메소드를 호출하며, POST, GET여부에 따라 doGet() 또는 doPost()가 호출된다.
⑤ doGet() or doPost() 메소드는 동적인 페이지를 생성한 후 HttpServletResponse객체에 응답을 보낸다.
⑥ 응답이 완료되면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다.

Servlet 기본 포맷 

심화된 버전으로 다시 실습을 해보자. 실무에서는 Servlet 클래스에 쓰는 것이 아니라, web.xml을 활용한 forward 방식, redirect 방식을 활용한다.
3.1이 가장 최신버전이고, 실무에서는 2.5 구버전을 많이 쓴다.

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
 
package com.ktds.smahn;
 
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * Servlet implementation class AdditionServlet
 */
@WebServlet("/AdditionServlet")
//AdditionServlet : 자바가 실행될 수 있는 url 실무에서는 안쓴다.
public class AdditionServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public AdditionServlet() {
        super();
    }
 
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
 
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     * 이 파일 하나에서 요청받고 응답하는것까지 다 한다. 
     * 응답은 어디로 가는거야?
     * 
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 
        
        String f = request.getParameter("f"); // 웹브라우저가 보냈던 파라메터 f
        String s = request.getParameter("s"); // 웹브라우저가 보냈던 파라메터 s
        
        int firstNumber = Integer.parseInt(f);
        int secondNumber = Integer.parseInt(s);
        
        int additionResult = firstNumber + secondNumber;
        
        System.out.println(additionResult);
        
        response.setCharacterEncoding("UTF-8");
        
        // 브라우저로 보내는 방법
        // 1번째 방법 : 브라우저로 바로 보내는 방법
        PrintWriter out = response.getWriter();
        out.print("<!DOCTYPE html><br/>"); 
        out.print("<html>");
        out.print("<head>");
        out.print("<title>");
        out.print("서블릿이 보낸 화면</title>");
        out.println("</head>");
        out.print("<body>");
        out.print(additionResult + "입니다.");
        out.print("</body>");
        out.print("</html>");
        
        out.flush(); // 버퍼에 print했던 내용들을 브라우저로 내보내준다.
        out.close();
        
    }
 
}
 
cs

 


2. forward 방식

 

Data 전달 방법

RequestDispatcher rd = request.getRequestDispatcher("/result.jsp");

이 페이지가 어떤 페이지인지 노출시키고 싶지 않을 때 forward 방식을 쓴다.
url은 바뀌지 않는다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>심플 계산기</title>
</head>
<body>
 
    <form method="post" action="/AC_HelloServlet/addition2">
    <!-- Servlet은 확장자가 없어서 보안에 좋다. -->
        <input type="text" name="f" placeholder="첫 번째 숫자를 입력하세요." />
        <br />
        <input type="text" name="s" placeholder="두 번째 숫자를 입력하세요." />
        <br />
        <input type="submit" value="더하기!" />
        
    </form>
 
</body>
</html>
cs

web.xml

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
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    id="WebApp_ID" version="3.1">
    <display-name>AC_HelloServlet</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
 
    <!-- 
    Servlet 을 등록 
    이 자바파일이 url 요청을 받을 수 있도록 등록한다.
    -->
    <servlet>
        <servlet-name>AdditionServlet</servlet-name>
        <servlet-class>com.ktds.smahn.AdditionServlet</servlet-class>
    </servlet>
    
    <!-- <servlet-name>이 AdditionServlet인 것을 참조한다. -->
    <servlet-mapping>
        <servlet-name>AdditionServlet</servlet-name>
        <url-pattern>/addition</url-pattern>
    </servlet-mapping>
    
    
</web-app>
cs

AdditionResult2.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
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.ktds.smahn;
 
import java.io.IOException;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
/**
 * Servlet implementation class AdditionResult2
 */
public class AdditionResult2 extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public AdditionResult2() {
        super();
    }
 
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
 
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        String f = request.getParameter("f"); // 웹브라우저가 보냈던 파라메터 f
        String s = request.getParameter("s"); // 웹브라우저가 보냈던 파라메터 s
        
        int firstNumber = Integer.parseInt(f);
        int secondNumber = Integer.parseInt(s);
        
        int additionResult = firstNumber + secondNumber;
        
        // 보여주고 싶은 페이지를 써준다. WebContent가 가장 상위 폴더이기 때문에
        // /만 써주면 가장 상위에 있는 result.jsp페이지를 보겠다는 뜻이 된다.
        RequestDispatcher rd = request.getRequestDispatcher("/result.jsp");
        
        // "addResult" 키로 additionResult value가 result.jsp로 넘어간다.
        request.setAttribute("f", firstNumber);
        request.setAttribute("s", secondNumber);
        request.setAttribute("addResult", additionResult);
        
        // 브라우저로 내보내준다.
        rd.forward(request, response);
    }
 
}
 
cs

result.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
 
    Result 페이지 입니다.<br/>
    
    <!--
    서블릿이 보내준 데이터를 출력할 때 
    -->
    "&#36;{}" 는 EL 문법입니다(EL 문법: 서블릿이 보내준 데이터를 표현하는 언어). <br/>
    ${f} + ${s} 의 결과는 ${ addResult } ( ${f + s} ) 입니다.
</body>
</html>
cs

 


3. redirect 방식

Data 전달방법

URL(길이 제한 255글자)

4. forward + redirect 방식

forward 를 쓰면 url이랑 화면이랑 안맞는다. 그래서 내가 게시판 목록을 보고싶으면은 doWrite로 가야한다. 이상하다. 근데 에러날꺼야. 데이터가 넘어온게 없으니까. 그래서 다시 서블릿을 요청하는 것이다.

calc4.jsp --> AdditionResult3.java --> AdditionResult4.java --> list.jsp


그러면 언제 forward를 쓰고 언제 redirect를 쓰는 것인가?

성격이 다른 페이지를 보여주고 싶을 때는 redirect, 데이터를 보내고싶다고 한다면 forward를 쓴다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함