※ src/main/java 폴더에 xyz.itwill10.controller 패키지 생성
📢xyz.itwill10.controller 패키지에 요청 처리 클래스(Model)를 작성하고 스프링 어노테이션을 Spring Bean으로 등록
📢servlet-context.xml : appServlet 이름의 Front Controller에서 사용될 클래스의 Spring Bean을 등록하기 위한 Spring Bean Configuretion File📃servlet-context.xml
※ src/main/webapp/WEB-INF/spring/appServlet 폴더에 servlet-context.xml 수정
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!-- ================================================================================ --> <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --> <!-- servlet-context.xml : appServlet 이름의 Front Controller에서 사용될 클래스의 Spring Bean을 등록하기 위한 Spring Bean Configuretion File --> <!-- ================================================================================ --> <!-- Enables the Spring MVC @Controller programming model --> <!-- annotation-driven : @Controller 어노테이션을 사용하여 요청 처리 클래스를 Spring Bean으로 등록하고 @RequestMapping 어노테이션을 사용하여 작성된 메소드를 요청 처리 메소드로 등록하여 클라이언트 요청에 의해 요청 처리 클래스의 메소드가 호출되어 처리되도록 설정하는 엘리먼트 --> <!-- → HandlerMapping 객체를 사용하지 않아도 요청 처리 클래스의 요청 처리 메소드가 클라이언트의 요청에 의해 호출되도록 자동으로 매핑 처리 --> <annotation-driven /> <!-- ================================================================================ --> <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --> <resources mapping="/resources/**" location="/resources/" /> <!-- ================================================================================ --> <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --> <!-- InternalResourceViewResolver 클래스를 Spring Bean으로 등록 --> <!-- InternalResourceViewResolver 객체 : 클라이언트 요청에 의해 호출되는 요청 처리 메소드의 반환값(ViewName)을 제공받아 응답 가능한 JSP 문서로 변환하여 반환하는 객체 --> <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <beans:property name="prefix" value="/WEB-INF/views/" /> <beans:property name="suffix" value=".jsp" /> </beans:bean> <!-- ================================================================================ --> <!-- component-scan : 스프링 컨테이너가 스프링 어노테이션을 검색하여 처리하기 위한 엘리먼트 --> <!-- base-package 속성 : 스프링 어노테이션을 검색하기 위해 어노테이션을 사용한 클래스의 패키지를 속성값으로 설정 --> <!-- <context:component-scan base-package="xyz.itwill.controller" /> --><!-- 기존 코드 --> <!-- xyz.itwill10.controller 패키지에 요청 처리 클래스(Model)를 작성하고 스프링 어노테이션을 Spring Bean으로 등록 --> <context:component-scan base-package="xyz.itwill10.controller" /><!-- 새로 작성한 코드 --> </beans:beans>
📃HelloController.java
※ xyz.itwill10.controller 패키지에 HelloController.java 클래스 생성
package xyz.itwill10.controller; // import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; //@Controller : 요청 처리 클래스를 Spring Bean으로 등록하기 위한 어노테이션 //→ 클래스의 이름을 Spring Bean의 식별자(beanName)으로 자동 설정 - 첫문자는 소문자로 변환 //→ value 속성을 사용하여 Spring Bean의 식별자(beanName) 변경 가능 //→ Controller 인터페이스를 상속받지 않아도 요청 처리 클래스로 처리 //→ @RequestMapping 어노테이션으로 다수의 요청 처리 메소드를 작성하여 클라이언트의 요청에 대한 처리 가능 // //모델(Model) 역할을 제공하는 클래스 - 요청 처리 클래스 import org.springframework.web.servlet.ModelAndView; @Controller public class HelloController { private static final Logger logger=LoggerFactory.getLogger(HelloController.class); // //요청 처리 메소드는 Front Controller에게 반드시 뷰이름(ViewName) 제공 //→ Front Controller는 제공받느 뷰이름을 이용하여 응답 관련 정보로 변환(ViewResolver)하여 응답 처리 // //Front Controller에 의해 JSP 문서로 포워드 이동하여 응답되도록 뷰이름을 제공하는 방법 //방법1. 요청 처리 메소드의 반환형을 void로 설정한 경우 Front Controller에게 메소드의 이름을 뷰이름으로 제공 //방법2. 요청 처리 메소드의 반환형을 String로 설정한 경우 Front Controller에게 반환값을 뷰이름으로 제공 //방법3. 요청 처리 메소드의 반환형을 ModelAndView로 설정한 경우 Front Controller에게 ModelAndView 객체의 뷰이름을 저장하여 제공 //JSP 문서로 응답 처리하지 않을 경우 요청 처리 메소드의 반환형을 Model 또는 Map으로 설정 // //@RequestMapping : 클라이언트 요청을 처리하기 위한 메소드를 선언하기 위한 어노테이션 //→ 기본적으로 클라이언트의 모든 요청방식(Method - GET, POST, PUT, PATCH, DELETE 등)에 의해 호출되는 요청 처리 메소드를 작성할 경우 사용하는 어노테이션 //→ 클라이언트의 요청방식을 구분하여 요청 처리 메소드가 호출되고자 할 경우 @GetMapping, @PostMapping, @PutMapping, @PatchMapping, @DeleteMapping 등의 어노테이션 사용 //value 속성 : 클라이언트의 요청 URL 주소를 속성값으로 설정 //→ Front Controller에 의해 등록된 클라이언트 요청 URL 주소(식별자)로 요청 처리 메소드가 호출되어 클라이언트의 요청 처리 //→ 다른 속성이 없는 경우 속성값만 설정 가능 //→ 다른 요청 처리 메소드의 value 속성값과 요청 URL 주소가 중복될 경우 WAS 실행시 에러 발생 @RequestMapping(value = "/hello")//이게 있어야 밑에있는 hello()가 요청 처리 메소드가 됨 public void hello() {//요청 처리 메소드 //메소드 안에 요청 처리 명령 작성 - Service 객체의 메소드 호출 logger.info("[/hello] 페이지 요청 : HelloController 클래스의 hello() 메소드 호출");//info 레벨을 출력하려면 log4j.xml logger 엘리먼트 추가해야함 } // @RequestMapping(value = "/helloViewName") public String helloViewName() { logger.info("[/helloViewName] 페이지 요청 : HelloController 클래스의 helloViewName() 메소드 호출"); return "hello"; } // @RequestMapping(value = "/helloModelAndView") public ModelAndView helloModelAndView() { logger.info("[/helloModelAndView] 페이지 요청 : HelloController 클래스의 helloModelAndView() 메소드 호출"); // //ModelAndView 객체 : 요청에 대한 처리 결과를 속성값으로 저장하고 뷰이름을 저장하기 위한 객체 //ModelAndView modelAndView=new ModelAndView(); //modelAndView.setViewName("hello");//Setter 메소드를 이용하여 뷰이름 변경 // ModelAndView modelAndView=new ModelAndView("hello");//생성자를 이용하여 뷰이름 변경 // return modelAndView; } }
📃hello.jsp
※ WEB-INF/views 폴더에 hello.jsp 생성
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>SPRING</title> </head> <body> <h1>Hello, Spring!!!</h1> <hr> </body> </html>