서블릿 맛보기 +service()란?

Jan 31, 2024
서블릿 맛보기 +service()란?

서블릿 맛보기 +(”/*”)

notion image
💡
자카르타 EE는 톰캣 내장이 안되어있구나…
프로젝트 생성
notion image
HttpServlet 상속 받았다. 앤 이제 서블렛임

[ 반환 타입이 String ]

notion image
서블릿은 반환 타입이 String인 경우에 자동으로 Content-Type을 "text/html"로 설정해주는 기능을 제공

[ (”/*”) ]

notion image
"/*" 패턴을 사용하여 서블릿을 매핑하면, 모든 요청에 대해 해당 서블릿이 처리 됨 즉, 여기에 뭐가 들어오든 다 잡아서 service에 들어오게 만들어 준다 그래서 라우터가 있어야한다. 라우터가 없으면 서블릿이 모든 요청을 처리해야 하기 때문에 처리 과정이 복잡해짐.
 

 
서블릿은 디스패처 서블릿을 통해 라우팅을 수행한다. 디스패처 서블릿은 요청 주소를 모두 받아서 리플렉션을 사용하여 처리한다. 디스패처 서블릿은 주소 요청을 받아 해당 요청을 처리할 수 있는 컨트롤러 메서드를 찾아주는 역할을 수행. 디스패처 서블릿은 리플렉션을 사용하여 주소와 컨트롤러 메서드 간의 매핑을 구현하며, 이를 통해 클라이언트의 요청을 적절한 컨트롤러로 전달하여 처리.
 

전체 코드 - 실습?

notion image
return "<h1>hello " + name + "</h1>";

[ Dispatcher ]

package org.example.demo2; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; // 라우팅 public class Dispatcher { public static void route(String cmd, String action, HttpServletResponse resp) throws IOException { if(cmd.equals("user")){ UserController con = new UserController(); if(action.equals("login")){ String html = con.login(); resp.getWriter().println(html); }else if(action.equals("join")){ String html = con.join(); resp.getWriter().println(html); } }else if(cmd.equals("board")){ resp.getWriter().println("<h1>board</h1>"); } } }

[ FrontController ]

package org.example.demo2; 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.IOException; import java.io.PrintWriter; @WebServlet("/*") public class FrontController extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setHeader("Content-Type", "text/html; charset=utf-8"); String cmd = req.getParameter("cmd"); String action = req.getParameter("action"); Dispatcher.route(cmd, action, resp); } }

[ UserController ]

package org.example.demo2; public class UserController { public String login(){ return "<h1>login</h1>"; } public String join(){ return "<h1>join</h1>"; } }
실습 주소 적는 법 : http://localhost:8080/?cmd=user&action=user

service 호출해보기

1. 프로젝트 생성

notion image
notion image
톰캣 서버 잡기!
notion image
이렇게 초기 설정
 

3. service 호출

notion image
톰캣이 어떤 주소가 들어오면 service를 호출해줄 것 (톰캣은 설정에 따라 특정 주소로 들어오는 요청을 서블릿의 서비스 메서드를 호출하여 처리하고, 응답을 클라이언트에게 전송)
notion image
💡
service 라고 메서드 치면 오버라이드까지 촤라라락 뜸
 

 
브라우저가 열릴텐데, 거기서 엔터치면
notion image
콘솔창에 뜸! 처음엔 3~4번씩 뜰건데, 우클릭 > clear all 한 다음에 브라우저 주소창에 엔터치면 한번만 딱 뜬다. 그럼 정상
notion image
 
 

 
💡
서블렛 하려면 톰캣이 있어야한다. 스프링에는 없어도 됨. 내장되어 있어서! 컨텍스트 패스도 스프링에선 필요 없음
💡
스프링 프레임워크에서는 @RequestMapping 어노테이션을 사용하여 주소와 컨트롤러 메서드를 매핑한다.
💡
* Response 헤더에 컨텐트 타입이 없으면 브라우저가 못 읽고 다 깨짐 (Content Type은 MIME 타입으로 표현됨)
* 안녕이라고 보내면 안녕/n (readLine!)으로 보내는 것과 같으니 총 8바이트 (3+3+1+1)
* 바디를 적을 때는 헤더에 꼭 정확하게 적어줘라
* 헤더와 바디의 구분은 세미콜론(;)으로 이루어지며, 컨텐트 타입과 문자 인코딩을 함께 명시한다. ("text/html; charset=utf-8"과 같이 표현)
 

 
회원가입하면 유저네임 패스워드 같은걸 http에 담아서 요청할거임 (insert요청)
외부에서 요청하면 post요청으로 요청함
이 바디안에 회원정보를 받아서 보내거임. 헤더에는 바디의 정보를적는데,, 그게 바로 www.dlfsf.xlsf
 
 
Share article

codingb