[MVC] 서블릿 실습
Categories: Spring
📌 개인적인 공간으로 공부를 기록하고 복습하기 위해 사용하는 블로그입니다.
정확하지 않은 정보가 있을 수 있으니 참고바랍니다 :😸
[틀린 내용은 댓글로 남겨주시면 복받으실거에요]
서블릿실습
get
-
인텔리제이에서 프로젝트 생성 → 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' }
-
-
작성이 완료되면 코끼리 아이콘이 뜸
빌드가 설정되었으니 리로드하라는 아이콘
- 서블릿 작성
-
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 작성하면 해결
-
-
xml 작성
-
완료 후 clean 누르고 war 눌러서 build 해줌
-
빌드 후 bulid/ lips의 폴더 열어보기
-
폴더에 war파일 생성되었으면 잘라내기 누르기
- tomcat> webapps에 가서 기존 파일 삭제하고 붙여넣기(7에서 잘라낸 파일) 한 후 폴더 더블 클릭하면 압축이 풀림
-
tomcat은 항상 켜두어야 함 (켜져 있을 경우 더블 클릭하면 자동으로 압축이 풀림)
-
압축이 잘 풀리면
-
사이트에서 localhost:8080/juneTest-1.0-SNAPSHOT/welcome 들어가기
이렇게 들어가면 잘 나옴
-
-
다섯개 서블릿 만들어서 수동배포해보기
서블릿은 하나 실수로 잘못 빌드되어 수정하려면 다시 클린 누르고 war 빌드해서
생긴 파일들을 다시 톰캣에 옮겨서 실행해야되는데 수동배포 이거 굉장히 번거롭다…
post 실습
-
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>"); } }
-
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>
-
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>
- clean 후 war 파일 빌드 후 빌드된 파일을 잘라내기 해서 tomcat - webapp의 기존 파일 삭제하고 다시 붙여넣기하기
-
get요청이 아니라서 경로는 빌드된 파일명만 입력하면 됨 (http://localhost:8080/juneTest-1.0-SNAPSHOT/)
-
이름 타이핑 후 제출하면 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 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; } }
- 검증이 안됨
-
숫자검증
-
나누는 수 검증
-
oper 검증
-
-
문자처리 해야함.
1의 b 보면 문자 처리도 안된 것 같아서
if문이랑 한국어 나올 수 있게 아래 코드도 수정해야 함.
1
response.setContentType("text/html; charset=UTF-8");
- if 문 수정
- 검증이 안됨
-
수정
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; } }
-
0으로 나눌때
-
연산자가 아닌 문자입력
-
숫자가 아닌 문자입력
-
-
추가 보완 해보기
- 에러에 맞는 에러페이지를 설정해주어야 함.
- 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문으로 구현해내는 게 익숙해서 검증을 그런식으로 밖에 하지 못했던 것 같은데
강사님께서 어떻게든 구현해내는 것이 우선이라고 하셔서 그나마 위안이었다.
서블릿은 사용할 일이 많이 없다고 하셨으니,, 일단
스프링을 잘하는게 목표니까 오늘부터 스프링 화이팅…!
Leave a comment