spring mvc project를 선택하고 next를 눌러준다
변별력을 위해 패키지 이름을 3단계로 짓는다
첫번째 com 상업용
두번째 프로젝트이름
세번째 세부 모듈 또는 목적
webapp 바로 밑의 resources에는 css,js,이미지 등을 넣는다
root-context는 DB 접근 객체 생성 정보를 담는 위치로 데이터베이스 연결 정보를 넣는다
servlet-context는 스프링 MVC 프로젝트에서 웹과 관련된 설정을 정의하는 곳으로, 주로 DispatcherServlet과 관련된 설정을 포함. 이를 통해 컨트롤러, 뷰 리졸버, 리소스 매핑 등을 설정할 수 있다
왼쪽 하단의 servers에서 마우스 오른쪽 클릭-> server 로 톰캣 서버를 추가해준다
처음 실행하면 웹페이지에서 열리지 않고 suite안에서 열리게 되는데 window->preferences->web 검색하고
web browser 선택하여 external 을 체크하고 apply -> apply and close를 눌러주고 다시 run as를 실행하면 웹으로 켜진다
열리는 웹페이지는 view 밑의 home.jsp의 내용이 들어있다
스프링 MVC에서 요청 처리와 JSP 렌더링 흐름
1. 클라이언트 요청
- 클라이언트가 http://<서버주소>/pjt/로 요청을 보낸다
여기서 /pjt/는 톰캣 서버의 컨텍스트 루트에 해당하는 웹 애플리케이션 경로
2. 톰캣 서버의 요청 처리
- 톰캣 서버는 요청 URL을 분석하여 /pjt/ 경로와 일치하는 프로젝트(Web Application)를 찾는다.
- 해당 프로젝트를 실행하고, 요청을 스프링 프레임워크로 전달한다.
3. DispatcherServlet의 동작 (프론트 컨트롤러)
- 스프링 프레임워크의 핵심인 DispatcherServlet이 요청을 처리한다.
- DispatcherServlet은 내부적으로 IoC 컨테이너를 활용하며, 요청 경로(/pjt/ 뒤에 오는 슬래시 경로)를 기반으로 핸들러 매핑을 수행한다.
- 경로에 매핑된 컨트롤러(예: @RequestMapping 또는 @GetMapping)를 찾는다.
- 적합한 컨트롤러 메서드를 호출하여 비즈니스 로직을 처리한다.
4. Controller에서 응답 처리
- 호출된 컨트롤러 메서드는 요청을 처리한 뒤, 뷰(View) 이름(예: "home")을 반환한다.
- 반환된 뷰 이름은 ViewResolver를 통해 JSP 파일 경로로 변환된다.
5. ViewResolver의 역할
- ViewResolver는 뷰 이름과 설정 정보를 기반으로 JSP 파일 경로를 생성한다.
예를 들어, 뷰 이름이 "home"이면 /WEB-INF/views/home.jsp와 같은 경로를 반환한다. - ViewResolver는 JSP 파일 경로 외에도 필요한 확장자와 접두사를 관리한다.
6. JSP 렌더링
- DispatcherServlet은 ViewResolver가 반환한 경로에 있는 JSP 파일을 호출한다.
- JSP 파일이 톰캣에 의해 처리되어 HTML로 변환된 후, 클라이언트에게 응답으로 전달된다.
전체 요청 처리 흐름 요약
- 클라이언트가 /pjt/로 요청 → 톰캣이 /pjt 프로젝트를 찾음.
- 톰캣이 요청을 DispatcherServlet으로 전달.
- DispatcherServlet이 핸들러(Controller)를 호출.
- 컨트롤러에서 뷰 이름 반환 → ViewResolver가 JSP 경로 매핑.
- JSP가 톰캣에서 처리되어 최종 HTML 응답 반환.
ViewResolver가 찾는 위치가 views 이기 때문에 jsp 파일은 무조건 views 폴더 밑에 만들어줘야 한다
first.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>first jsp</title>
</head>
<body>
sample.do 포워드 되는 웹페이지 입니다
</body>
</html>
@RequestMapping 의 method = RequestMethod.GET 를 제거할경우 get이어도 post이어도 실행된다
package edu.springMVC1.controller;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Handles requests for the application home page.
*/
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
return "home";
}
// method = RequestMethod.GET 를 제거할경우 get이어도 post이어도 실행
@RequestMapping(value = "/sample.do", method = RequestMethod.GET)
public String sample(Locale locale, Model model) {
return "first";
}
}
실행 후 sample.do로 이동한 결과
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
<title>Home</title>
<meta charset="UTF-8">
</head>
<body>
<h1>
Hello world!
</h1>
<P> The time on the server is ${serverTime}. </P>
<a href="<%= request.getContextPath() %>/sample.do">sample.do로 이동</a><br>
<!-- 과제 -->
<a href="<%= request.getContextPath() %>/board/list.do">게시글 목록 페이지로 이동</a><br>
<a href="<%= request.getContextPath() %>/login.do">로그인 페이지로 이동</a><br>
<a href="<%= request.getContextPath() %>/join.do">회원가입 페이지로 이동</a><br>
</body>
</html>
package edu.springMVC1.controller;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* Handles requests for the application home page.
*/
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
return "home";
}
// method = RequestMethod.GET 를 제거할경우 get이어도 post이어도 실행
@RequestMapping(value = "/sample.do", method = RequestMethod.GET)
public String sample(Locale locale, Model model) {
return "first";
}
@RequestMapping(value = "/board/list.do", method = RequestMethod.GET)
public String boardList(Locale locale, Model model) {
return "board/list";
}
@RequestMapping(value = "/login.do", method = RequestMethod.GET)
public String login(Locale locale, Model model) {
return "user/login";
}
@RequestMapping(value = "/join.do", method = RequestMethod.GET)
public String join(Locale locale, Model model) {
return "user/join";
}
}
파일 위치
'Spring' 카테고리의 다른 글
[Spring] Spring MVC (2) | 2024.11.27 |
---|---|
[Spring] @Controller (0) | 2024.11.25 |
[Spring] AOP 어노테이션 (0) | 2024.11.23 |
[Spring] joinpoint (0) | 2024.11.22 |
[Spring] AOP (0) | 2024.11.21 |