kenzi

스프링 mvc흐름 본문

Spring

스프링 mvc흐름

kenzi 2022. 4. 7. 18:19

1. web.xml에 서블릿 설정 

<?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_3_0.xsd"
	id="springMVC" version="3.0">

  <display-name>Archetype Created Web Application</display-name>
  
  <servlet>
  	<servlet-name>dispatcher</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
  <servlet-name>dispatcher</servlet-name>
  <url-pattern>/</url-pattern>
  </servlet-mapping>
  
  
  
  
</web-app>

- init-param으로 value지정하지 않으면 디폴트로 [servlet-name]-servlet.xml을 찾는다 

                       ----> dispatcher-servlet.xml 생성해야함 

- url-pattern을 /로 설정하여 모든 url요청이 dispatcher서블릿 타도록 설정 

 

 

 

2. dispatcher-servlet.xml로 빈 등록해주기

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
	xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
	xmlns:mvc = "http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/mvc
	http://www.springframework.org/schema/mvc/spring-mvc.xsd">
	
	
<mvc:annotation-driven />
<mvc:view-controller path="/kenzi" view-name = "kenzi"/>




<bean id = "viewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name = "prefix" value = "/WEB-INF/view/"></property>
	<property name = "suffix" value = ".jsp"></property>

</bean>


</beans>

-viewResolver로 컨트롤러에서 작업한 이후 보내줄 view경로를 prefix와 suffix로 정해주기

(여기서는 view폴더안 jsp로 보내주기로 했음) ---->view폴더 만들기 

- 5-1) 백 작업을 할 컨트롤러 빈으로 등록해주기 

 

 

3. 실행할 jsp 변경해주기  

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% response.sendRedirect(request.getContextPath()+"/kenzi"); %>
</body>
</html>

-WEB-INF폴더 밖 jsp파일만 실행 가능하므로 index.jsp파일을 실행하면 프로젝트명/view/kenzi.jsp을 타게 

Redirect해놓음 = index.jsp실행하면 => kenzi.jsp가 나옴 

 

 

4. kenzi.jsp 

<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
안녕하세요

kenzi의 연습프로젝트입니다

<li> Kenzi
<ul>
<li> <a href = "kenzi.can">kenzi.can</a></li>
<li> <a href = "kenzi.do">kenzi.do</a></li>
<li> <a href = "kenzi.anything">kenzi.anything</a></li>
</ul>

<li> model
<ul>
<li> <a href = "event/list">event/list</a>
</ul>
</li>

kenzi파일에 href로 요청보냄 (클라이언트가 요청보냄) -------> 컨테이너에 등록된 컨트롤러가 받아야함 

 

5. Controller

1) 컨테이너(dispatcher-servlet.xml)에 빈으로 controller 등록 

(controller의 위치는 controller패키지 만들어서 넣기) 

//dispatcher-servlet.xml에 추가하기

<bean class = "controller.KenziController" />

2) controller 작업 

package controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller

public class KenziController {

	@RequestMapping("kenzi.can")
	public String can(Model model) {
		model.addAttribute("greeting","안녕하세요^,^");
		return "can"; // viewResolver에 의해 경로가 앞뒤로 붙어서 /WEB-INF/view/can.jsp로 리턴된다
	}
}//end class

- @Controller 붙이기 

- @RequestMaping으로 클라이언트에서 요청받은 url이 들어오면("kenzi.can") 처리하겠다 

- return으로 view단의 jsp파일 보내주기 

(현 프로젝트/kenzi.can이라는 url 요청이 들어오면 현 프로젝트/WEB-INF/view/can.jsp를 반환해준다)

 

3) view단 작업 

//can.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${greeting }  경로가 /WEB-INF/view/can.jsp 입니다 
</body>
</html>

 

 

index.jsp실행하면 Redirect로 kenzi.jsp나오는거 확인

여기서 kenzi.can으로 들어가면 아래와 같이 나온다!(url은 kenzi.can이지만 결과는 can.jsp가 나온다) 

 

 

 

정리 : 클라이언트에서 url요청을 하면 서블릿이 컨트롤러 찾아서 컨트롤러로 보냄 

컨트롤러에서 url에 따라 메서드 실행해서 작업한 후 viewResolver에 의해 경로 제대로 설정해서 view를 보냄

=클라이언트에서 url요청 - 서블릿 - 컨트롤러 - viewResolver - view 

클라이언트에서 kenzi.can(url)요청 - 서블릿 url패턴에 의해 모든 url이 dispatcher서블릿 탐 - 서블릿에 빈으로 등록된Kenzi컨트롤러에서 url요청에 맞는 can메서드 실행 후 return값 반환 - viewResolver에 의해 경로 앞뒤가 붙어서 프로젝트명/WEB-INF/view/can.jsp를 보내줌 

 

 

 

 

 

 

 

Q) 이미 작성되어 있는 view페이지를 보내지 말고 백에서 텍스트만 보낼 순 없을까? 

controller에서 메서드 타입을 void로 하기 

//Controller

@RequestMapping("kenzi.do")
	//void를 하면 view를 return 하지않고 메서드 결과값을 보낸다  
	public void doo(HttpServletResponse response) throws IOException {
		//response의 컨텐츠타입을 text로 함으로써 텍스트를 보낸다 
		response.setContentType("text/plain");
		response.setCharacterEncoding("utf-8");
		PrintWriter writer = response.getWriter();
		writer.write("view아니고 백에서 텍스트 보내기입니다 ");
		writer.flush();
	}

 

여기서 kenzi.do  로 들어가면 아래와 같이 나온다 

정리: kenzi.do url요청이 들어옴 - 서블릿 url패턴에 의해 서블릿 탐 - 서블릿에 등록된 컨트롤러에서 kenzi.do(url)요청 받아서 doo메서드 작업 - 텍스트 보냄 

Comments