kenzi
스프링 mvc흐름 본문
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>
여기서 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메서드 작업 - 텍스트 보냄
'Spring' 카테고리의 다른 글
@ModelAttribute와 model.addAttribute (0) | 2022.04.08 |
---|---|
스프링 mvc 수업정리(RESTful?url-pattern? 경로?) (0) | 2022.04.07 |
스프링 MVC (0) | 2022.04.06 |
AOP의 order란? & expression표현은 다양하다 (0) | 2022.04.06 |
오늘의 질문 정리(advice는 어려워..&ComponentScan과 Component) (0) | 2022.04.05 |