[MVC] 서블릿 실습

Updated:

Categories:

Tags: , ,

📌 개인적인 공간으로 공부를 기록하고 복습하기 위해 사용하는 블로그입니다.
정확하지 않은 정보가 있을 수 있으니 참고바랍니다 :😸
[틀린 내용은 댓글로 남겨주시면 복받으실거에요]

서블릿실습

get

  1. 인텔리제이에서 프로젝트 생성 → build.gradle 파일 수정해주기 (위 사진에서 아래 빨간색 박스의 내용 추가해주기)

    • 코드

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      
        plugins {
            id 'java'
            id 'war'
        }
              
        group = 'org.example'
        version = '1.0-SNAPSHOT'
              
        repositories {
            mavenCentral()
        }
              
        dependencies {
            implementation group : 'javax.servlet', name: 'javax.servlet-api', version : '3.1.0'
            testImplementation platform('org.junit:junit-bom:5.10.0')
            testImplementation 'org.junit.jupiter:junit-jupiter'
        }
              
        test {
            useJUnitPlatform()
        }
        tasks.withType(JavaCompile){
            options.encoding = 'UTF-8'
        }
      
  2. 작성이 완료되면 코끼리 아이콘이 뜸

    빌드가 설정되었으니 리로드하라는 아이콘

  3. 서블릿 작성
    1. code

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      
       import javax.servlet.annotation.WebServlet;
       import javax.servlet.http.HttpServlet;
       import javax.servlet.http.HttpServletRequest;
       import javax.servlet.http.HttpServletResponse;
       import java.io.IOException;
       import java.io.PrintWriter;
              
       @WebServlet("/hello")
       public class TestServlet extends HttpServlet{
           protected  void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
               response.setContentType("text/html");
               PrintWriter out = response.getWriter();
               out.println("<h1>Hello, World!</h1>");
           }
       }
      
      • path에 오류 생길 경우 annotation 작성하면 해결
  4. xml 작성

  5. 완료 후 clean 누르고 war 눌러서 build 해줌

  6. 빌드 후 bulid/ lips의 폴더 열어보기

  7. 폴더에 war파일 생성되었으면 잘라내기 누르기

  8. tomcat> webapps에 가서 기존 파일 삭제하고 붙여넣기(7에서 잘라낸 파일) 한 후 폴더 더블 클릭하면 압축이 풀림
  9. tomcat은 항상 켜두어야 함 (켜져 있을 경우 더블 클릭하면 자동으로 압축이 풀림)

  10. 압축이 잘 풀리면

    1. 사이트에서 localhost:8080/juneTest-1.0-SNAPSHOT/welcome 들어가기

      이렇게 들어가면 잘 나옴

  11. 다섯개 서블릿 만들어서 수동배포해보기

서블릿은 하나 실수로 잘못 빌드되어 수정하려면 다시 클린 누르고 war 빌드해서

생긴 파일들을 다시 톰캣에 옮겨서 실행해야되는데 수동배포 이거 굉장히 번거롭다…

post 실습

  1. PostHandlerServlet.java 파일 생성

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
     import java.io.*;
     import javax.servlet.*;
     import javax.servlet.http.*;
     import javax.servlet.annotation.WebServlet;
        
     @WebServlet("/postHandler")
     public class PostHandlerServlet extends HttpServlet {
         protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
             String name = request.getParameter("name");
             response.setContentType("text/html");
             PrintWriter out = response.getWriter();
             out.println("<h1>Hello, " + name + "!</h1>");
         }
     }
    
  2. webapp 폴더 내에 index. html 파일 생성

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
     <!DOCTYPE html>
     <html>
     <head>
         <title>Post Request</title>
     </head>
     <body>
     <form action="postHandler" method="post">
         <label for="name">Name:</label>
         <input type="text" id="name" name="name">
         <input type="submit" value="Submit">
     </form>
     </body>
     </html>
        
    
  3. xml 파일

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
     <?xml version="1.0" encoding="UTF-8"?>
     <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns="http://java.sun.com/xml/ns/javaee"
              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
              version="2.5">
         <display-name>ServletTest</display-name>
         <welcome-file-list>
             <welcome-file>index.html</welcome-file>
         </welcome-file-list>
     </web-app>
    
  4. clean 후 war 파일 빌드 후 빌드된 파일을 잘라내기 해서 tomcat - webapp의 기존 파일 삭제하고 다시 붙여넣기하기
  5. get요청이 아니라서 경로는 빌드된 파일명만 입력하면 됨 (http://localhost:8080/juneTest-1.0-SNAPSHOT/)

  6. 이름 타이핑 후 제출하면 posthandler http통신은 status 200


쿠키세션 실습

서블릿 실습 후

webapp에 index.jpx 파일 생성 후 코드 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE html>
<html>
<head>
    <title>Login Page</title>
</head>
<body>
    <h2>Login</h2>
    <form action="login" method="post">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username">
        <br>
        <label for="password">Password:</label>
        <input type="password" id="password" name="password">
        <br>
        <input type="checkbox" id="rememberMe" name="rememberMe">
        <label for="rememberMe">Remember Me</label>
        <br>
        <input type="submit" value="Login">
    </form>
</body>
</html>

xml파일에 index.html 되어있던 것을 index.jsp로 변경

그리고 LoginServelet, 및 ProfileServlet 생성

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
78
79
80
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String rememberMe = request.getParameter("rememberMe");

        HttpSession session = request.getSession();
        session.setAttribute("username", username);

        if ("on".equals(rememberMe)) {
            Cookie cookie = new Cookie("username", username);
            cookie.setMaxAge(60 * 60 * 24); // 1 day
            response.addCookie(cookie);
        }

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>Welcome, " + username + "</h1>");
        out.println("<a href='profile'>Go to Profile</a>");
        out.println("</body></html>");
    }
}

---
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/profile")
public class ProfileServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession(false);
        String username = null;

        if (session != null) {
            username = (String) session.getAttribute("username");
        }

        if (username == null) {
            Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                for (Cookie cookie : cookies) {
                    if ("username".equals(cookie.getName())) {
                        username = cookie.getValue();
                        break;
                    }
                }
            }
        }

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        if (username != null) {
            out.println("<h1>Profile Page</h1>");
            out.println("<h2>Welcome back, " + username + "</h2>");
        } else {
            out.println("<h1>No user information found. Please <a href='index.jsp'>login</a>.</h1>");
        }
        out.println("</body></html>");
    }
}

HttpSession 객체를 통해 세션가져옴




계산기-에러페이지 실습

  1. 에러페이지 실습

    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
    78
    
        
             try {
                 int number1=0;
                 int number2=0;
                 int calculateResult=0;
                 String result="";
                     if(isValidNum(number2Str)&&isValidNum(number1Str)){
                         number1 = Integer.parseInt(number1Str);
                         number2 = Integer.parseInt(number2Str);
                     }else{
                         result="숫자만 입력하세요";
        
                     }
        
                 if(!isValidOper(operatorStr)){
                     result="연산자만 입력가능합니다.";
        
                  }
                 // ArithmeticException 발생 가능
                 if(number2==0 && operatorStr.equals("/")) {
                    result="0으로 나눌 수 는 없습니다.";
        
                 }else{
                     calculateResult = calculate(number1, operatorStr, number2);
                     result=Integer.toString(calculateResult);
                 }
                 response.setContentType("text/html");
                 PrintWriter out = response.getWriter();
                 out.println("<html><body>");
                 out.println("<h1>Result: " + result + "</h1>");
                 out.println("</body></html>");
             } catch (NumberFormatException | ArithmeticException e) {
                 throw new ServletException("Invalid input or division by zero", e);
             }
         }
        
         public int calculate(int n1, String oper, int n2) {
             int result = 0;
             switch (oper) {
                 case "+":
                     result = n1 + n2;
                     break;
                 case "-":
                     result = n1 - n2;
                     break;
                 case "/":
                     result = n1 / n2;
                     break;
                 case "*":
                     result = n1 * n2;
                     break;
             }
             return result;
         }
        
         public boolean isValidNum(String num) {
             String numbers="0123456789";
             for(char c : num.toCharArray()){
                 if(numbers.indexOf(c)==-1){
                     return false;
                 }
             }
             return true;
         }
        
         public boolean isValidOper(String oper){
             String operators = "+-*/";
             int count=0;
             for(char c : oper.toCharArray()){
                 if(operators.indexOf(c)==-1){
                     count++;
                 }else{
                     return false;
                 }
             }
             return count==1;
         }
     }
    
    1. 검증이 안됨
      1. 숫자검증

      2. 나누는 수 검증

      3. oper 검증

    2. 문자처리 해야함.

      1의 b 보면 문자 처리도 안된 것 같아서

      if문이랑 한국어 나올 수 있게 아래 코드도 수정해야 함.

      1
      
       response.setContentType("text/html; charset=UTF-8");
      
    3. if 문 수정
  2. 수정

    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
    78
    79
    80
    81
    82
    83
    84
    85
    
     import javax.servlet.ServletException;
     import javax.servlet.annotation.WebServlet;
     import javax.servlet.http.HttpServlet;
     import javax.servlet.http.HttpServletRequest;
     import javax.servlet.http.HttpServletResponse;
     import java.io.IOException;
     import java.io.PrintWriter;
        
     @WebServlet("/calculate")
     public class CalculateServlet extends HttpServlet {
         protected void doPost(HttpServletRequest request, HttpServletResponse response)
                 throws ServletException, IOException {
             String number1Str = request.getParameter("number1");
             String operatorStr = request.getParameter("operator");
             String number2Str = request.getParameter("number2");
        
             try {
                 int number1=0;
                 int number2=0;
                 int calculateResult=0;
                 String result="";
        
                     if(isValidNum(number2Str)&&isValidNum(number1Str)){
                         number1 = Integer.parseInt(number1Str);
                         number2 = Integer.parseInt(number2Str);
                         if(isValidOper(operatorStr)){
                             calculateResult = calculate(number1, operatorStr, number2);
                             result=Integer.toString(calculateResult);
                         }else{
                             result="연산자만 입력가능합니다.";
                         }
                     }else{
                         result="숫자만 입력하세요";
                     }
                 // ArithmeticException 발생
                 response.setContentType("text/html; charset=UTF-8");
                 PrintWriter out = response.getWriter();
                 out.println("<html><body>");
                 out.println("<h1>Result: " + result + "</h1>");
                 out.println("</body></html>");
             } catch (NumberFormatException | ArithmeticException e) {
                 throw new ServletException("Invalid input or division by zero", e);
             }
         }
        
         public int calculate(int n1, String oper, int n2) {
             int result = 0;
             switch (oper) {
                 case "+":
                     result = n1 + n2;
                     break;
                 case "-":
                     result = n1 - n2;
                     break;
                 case "/":
                     result = n1 / n2;
                     break;
                 case "*":
                     result = n1 * n2;
                     break;
             }
             return result;
         }
        
         public boolean isValidNum(String num) {
             String numbers="0123456789";
             for(char c : num.toCharArray()){
                 if(numbers.indexOf(c)==-1){
                     return false;
                 }
             }
             return true;
         }
        
         public boolean isValidOper(String oper){
             String operators = "+-*/";
             boolean result=false;
             for(char c : oper.toCharArray()){
                 if(operators.indexOf(c)!=-1 && oper.length()==1){
                     result= true;
                 }
             }
             return result;
         }
     }
    
    1. 0으로 나눌때

    2. 연산자가 아닌 문자입력

    3. 숫자가 아닌 문자입력

  3. 추가 보완 해보기

    1. 에러에 맞는 에러페이지를 설정해주어야 함.
    2. operator를 select로 사용할 수 있음> 에러방지 가능

    index.jsp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
         <body>
             <h2>Calculator</h2>
             <h4>Please enter numbers and operator</h4>
             <form action="calculator" method="post">
                 <label for="number">Number1:</label>
                 <input type="text" id="number" name="number">
                 <select id ="operator" name="operator">
                     <option value="+">+</option>
                     <option value="-">-</option>
                     <option value="/">*</option>
                     <option value="*">/</option>
                 </select>
                 <label for="number2">Number2:</label>
                 <input type="text" id="number2" name="number2">
                 <input type="submit" value="Submit">
             </form>
         </body>
         </html>
            
    

    CalculateServlet.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
    
         String number1Str = request.getParameter("number1");
         String operatorStr = request.getParameter("operator");
         String number2Str = request.getParameter("number2");
            
         try{
            
         int number1 = Integer.parseInt(number1Str);
             int number2 = Integer.parseInt(number2Str);
             int result;
                
             switch (oper) {
                     case "+":
                         result = number1 + number2;
                         break;
                     case "-":
                         result = number1 - number2;
                         break;
                     case "/":
                         result = number1 / number2;
                         break;
                     case "*":
                         result = number * number2;
                         break;
                 }
         }
    


Comment

select 사용하는 건 사실 몰랐는데 대부분이 이런식으로 사용했다고 해서 조금 충격이었다,,
아직 html이나 이런건 익숙하지도 않고 try-catch문도 많이 사용해본 적이 없어서
for문과 if문으로 구현해내는 게 익숙해서 검증을 그런식으로 밖에 하지 못했던 것 같은데
강사님께서 어떻게든 구현해내는 것이 우선이라고 하셔서 그나마 위안이었다.
서블릿은 사용할 일이 많이 없다고 하셨으니,, 일단 스프링을 잘하는게 목표니까 오늘부터 스프링 화이팅…!







Spring 카테고리 내 다른 글 보러가기

Leave a comment