
1. 아파치만 실행하기
- 톰캣을 사용안하려면 컴파일 안하면 됨
- 순수하게 그림밖에 못그림

HTML 파일 생성해서 아파치만으로 HTML 파일 찾아서 응답해주기


<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>test page</h1> </body> </html>

2. 톰캣 실행하기
- 동적 페이지로 만들기
String html = " html 코드 붙여넣기 "; String html = """ html 코드 붙여넣기 """; // 자바 15이상부터 지원
package com.example.userapp; import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.time.LocalDateTime; @WebServlet("/join-form") public class JoinFormServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { LocalDateTime now = LocalDateTime.now(); String html = "<!DOCTYPE html>\n" + "<html lang=\"en\">\n" + "<head>\n" + " <meta charset=\"UTF-8\">\n" + " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n" + " <title>Document</title>\n" + "</head>\n" + "<body>\n" + " <h1>회원가입 페이지"+now+"</h1>\n" + " <hr>\n" + " <form action=\"/join\" method=\"post\">\n" + " <input type=\"text\" placeholder=\"username\" name=\"username\">\n" + " <input type=\"text\" placeholder=\"password\" name=\"password\">\n" + " <input type=\"text\" placeholder=\"email\" name=\"email\">\n" + " <button>회원가입</button>\n" + " </form>\n" + "</body>\n" + "</html>"; resp.getWriter().println(html); } }

- Servlet은 버퍼에 데이터를 담아서 자바 코드를 돌릴 수 있음
자바 변수에 html 코드를 담고 섞어놓을 수 있음
http 문장; //html 끊기 for (int i = 0; i < 5; i++) { // for문으로 5번 돌리기 html = html + " <h1>"+i+"회원가입 페이지"+now+"</h1>\n"; } html = html + "나머지 http문장";
package com.example.userapp; import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.time.LocalDateTime; @WebServlet("/join-form") public class JoinFormServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { LocalDateTime now = LocalDateTime.now(); String html = "<!DOCTYPE html>\n" + "<html lang=\"en\">\n" + "<head>\n" + " <meta charset=\"UTF-8\">\n" + " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n" + " <title>Document</title>\n" + "</head>\n" + "<body>\n"; //html 끊기 for (int i = 0; i < 5; i++) { html = html + " <h1>"+i+"회원가입 페이지"+now+"</h1>\n"; // for문으로 5번 돌아감 } html = html + "<hr>\n" + " <form action=\"/join\" method=\"post\">\n" + " <input type=\"text\" placeholder=\"username\" name=\"username\">\n" + " <input type=\"text\" placeholder=\"password\" name=\"password\">\n" + " <input type=\"text\" placeholder=\"email\" name=\"email\">\n" + " <button>회원가입</button>\n" + " </form>\n" + "</body>\n" + "</html>"; resp.getWriter().println(html); } }

너무 복잡함..css 넣는 것도 불편함…
- 현재 상태 : 페이지가 없어서 오류 남 → 페이지를 만들어야 함

- 페이지 생성하기
package com.example.userapp.user; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; @WebServlet("/join") public class JoinServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // username=ssar&password=1234&email=ssar@nate.com BufferedReader br = req.getReader(); String requestBody = ""; while(true){ String line = br.readLine(); if(line == null) break; requestBody = requestBody + line; } System.out.println(requestBody); } }


- 페이지 생성하기 - 톰켓이 제공하는 메서드 사용하기
package com.example.userapp.user; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; @WebServlet("/join") public class JoinServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // username=ssar&password=1234&email=ssar@nate.com // 1. 파싱 쉽게 하기 -> 커퍼에 키값을 찾아줌 String username = req.getParameter("username"); String password = req.getParameter("password"); String email = req.getParameter("email"); System.out.println("username : " + username); System.out.println("password : " + password); System.out.println("email : " + email); } }

버퍼는 꺼내면 소비됨 ⇒ 버퍼에 담긴 것이 없음
- 유효성 검사
package com.example.userapp.user; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; @WebServlet("/join") public class JoinServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // username=ssar&password=1234&email=ssar@nate.com // 1. 파싱 쉽게 하기 -> 버퍼에 있는 값을 split해서 key값을 찾아줌 String username = req.getParameter("username"); String password = req.getParameter("password"); String email = req.getParameter("email"); System.out.println("username : " + username); System.out.println("password : " + password); System.out.println("email : " + email); // 2. 유효성 검사(1000줄 정도 됨...) if(username.length() < 3 || username.length() > 10) { // 필터링으로 사용 resp.setHeader("Content-type", "text/html; charset=utf-8"); //헤더에 바디를 설명 resp.getWriter().println("<h1>username 글자수가 3~10 사이여야 합니다."); } }

한글 깨짐 해결 → 헤더에 바디를 설명
resp.setHeader("Content-type", "text/html; charset=utf-8");

- 메인 페이지 그리기
package com.example.userapp.user; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.BufferedReader; import java.io.IOException; @WebServlet("/join") public class JoinServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setHeader("Content-type", "text/html; charset=utf-8"); //헤더에 바디를 설명 // username=ssar&password=1234&email=ssar@nate.com // 1. 파싱 쉽게 하기 -> 버퍼에 있는 값을 split해서 key값을 찾아줌 String username = req.getParameter("username"); String password = req.getParameter("password"); String email = req.getParameter("email"); System.out.println("username : " + username); System.out.println("password : " + password); System.out.println("email : " + email); // 2. 유효성 검사(1000줄 정도 됨...) if(username.length() < 3 || username.length() > 10) { // 필터링으로 사용 resp.getWriter().println("<h1>username 글자수가 3~10 사이여야 합니다."); } // 3. DB연결 -> DAO에 연결하기 위함 // 4. DAO의 insert 메서드를 회출 // 5. 메인 페이지 그리기 String html = "<!DOCTYPE html>\n" + "<html lang=\"en\">\n" + "\n" + "<head>\n" + " <meta charset=\"UTF-8\">\n" + " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n" + " <title>Document</title>\n" + "</head>\n" + "\n" + "<body>\n" + " <h1>메인 페이지</h1>\n" + " <hr>\n" + "</body>\n" + "\n" + "</html>"; resp.getWriter().println(html); } }
Share article