본문 바로가기
Java Web Programming/6. Spring | MyBatis

[SpringMVC] has a 관계 - Annotation기반의 SpringMVC 연습 2!

by 파프리카_ 2020. 11. 9.
728x90
반응형

Maven pom 설정

/pom.xml

<dependencies>
  <!-- Spring-Web MVC Framework -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.14.RELEASE</version>
  </dependency>
</dependencies>

★web.xml과 springmvc-servlet.xml은 WEB-INF 폴더에 같이 두어야 한다! ★

DD (Deploytment Descriptor) 설정

/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
  <display-name>SpringMVC3-Annotation</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- servlet 설정 -->
  <servlet>
  	<!-- servlet-name을 기반으로 spring 파일을 찾는다. -->
  	<servlet-name>springmvc</servlet-name>
 	<!-- Libary 제공 -->
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<!-- load-on-startup 
  		 : Serlvet LifeCycle에 의거해서, 
  		   어플리케이션 최초 실행 시 해당 servlet을 객체 생성, init()까지 실행되도록 설정
  		   만약 이 태그를 기입해주지 않으면, 클라이언트 최초 요청 시점에 서블릿이 초기화된다. -->
  	<load-on-startup>1</load-on-startup>
  </servlet>
  
  <!-- servlet-mapping 설정 -->
  <servlet-mapping>
  	  <!-- SpringMVC의 Front인 DispatcherSerlvet은 
  	  	   자신의 설정 파일(springMVC 설정)을 
  	  	   [자신의 서블릿이름]-serlvet.xml로 찾도록 되었어,
  	  	   찾아서 로딩한다. -->
	  <servlet-name>springmvc</servlet-name>
	  <!-- 클라리언트 요청 url이 .do으로 마치는 요청은
	  	   모두 DispatcherSerlvet이 처리한다. -->
	  <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  
  
  <!-- POST 방식으로 전송 시, 한글처리를 위한 인코딩 설정 -->
  <filter>
  	<filter-name>EncodingFilter</filter-name>
  	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>utf-8</param-value>
  	</init-param>
  </filter>
  
  <filter-mapping>
  	<filter-name>EncodingFilter</filter-name>
  	<!-- 모든 요청에 인코딩 처리하겠다는 의미 -->
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>

Spring configure 설정

* namespace에서 context,  mvc 추가

 

1. IOC 설정

<context:component-scan> :  IOC, DI, DL에 대한 설정
 1) 컴포넌트 계열의 어노테이션이 명시된 클래스에 대해 객체를 생성하고,
 2) DI 계열 어노테이션이 명시된 대상에 대해 해당 객체를 주입하는 역할을 한다.

2. SpringMVC 설정

3. ViewResolver 설정 : client에게 응답하는 view에 대한 설정

 

/springmvc-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:context="http://www.springframework.org/schema/context"
	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/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">
	
	<!-- IOC 설정 -->
	<context:component-scan base-package="org.kosta"></context:component-scan>

	<!-- SpringMVC 설정 : annotation 기반 controller 설정 -->
	<mvc:annotation-driven/>
	
	<!-- ViewResolver 설정 : client에게 응답하는 view에 대한 설정 -->
	<bean id="ViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/views/"/>
		<property name="suffix" value=".jsp"/>
	</bean>
	
	<!-- error page 설정 -->
	<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<!-- views/error.jsp로 응답 -->
		<property name="defaultErrorView" value="error"/>
	</bean>
</beans>

Model

/org.kosta.model

 

★ MemberVO has a CarVO

- MemberVO의 instance 변수에 CarVO가 있음

 

/CarVO.java

package org.kosta.model;

public class CarVO {
	private String model;
	private int price;
	
	public CarVO() {
		super();
	}

	public CarVO(String model, int price) {
		super();
		this.model = model;
		this.price = price;
	}

	public String getModel() {
		return model;
	}

	public void setModel(String model) {
		this.model = model;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	@Override
	public String toString() {
		return "CarVO [model=" + model + ", price=" + price + "]";
	}
	
}

 

/MemberVO.java

package org.kosta.model;

public class MemberVO {
	private String id;
	private String password;
	private String name;
	private String address;
	private CarVO carVO;
	
	public MemberVO() {
		super();
	}

	public MemberVO(String id, String password, String name, String address, CarVO carVO) {
		super();
		this.id = id;
		this.password = password;
		this.name = name;
		this.address = address;
		this.carVO = carVO;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public CarVO getCarVO() {
		return carVO;
	}

	public void setCarVO(CarVO carVO) {
		this.carVO = carVO;
	}

	@Override
	public String toString() {
		return "MemberVO [id=" + id + ", password=" + password + ", name=" + name + ", address=" + address + ", carVO="
				+ carVO + "]";
	}
	 
}

View

has a 관계를 parameter로 보낼 때!

<input type="[type]" name="[class명(소문자로)].[instance변수명]">

 

/index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Home</title>
</head>
<body>
	<!-- Annotation 기반 SpringMVC 예제 -->
	<br>
	<form action="paramTestHasA.do" method="POST">
		아이디 <input type="text" name="id"><br>
		패스워드 <input type="password" name="password"><br>
		이름 <input type="text" name="name"><br>
		주소 <input type="text" name="address"><br>
		<!-- has a -->
		차 모델명 <input type="text" name="CarVO.model"><br>
		차 가격 <input type="number" name="CarVO.price"><br>
		<input type="submit" value="등록">
	</form>
	
</body>
</html>

/Views

 

 has a 관계를 requestScope로 받을 때!

${requestScope.[class명(소문자로)]}

 

/test_result2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>test_result2</title>
</head>
<body>
	<!-- Controller에서 form 데이터로 생성된 객체를
	     바로 출력할 수 있다.  
	     - 소문자로 시작하는 클래스명이 request 영역에 저장된
	       객체의 name이다.
	     -->
	${requestScope.memberVO}
</body>
</html>	

Controller

/org.kosta.Controller

 

@Controller

@RequestMapping("[method_name] .do") : @RequestMapping 어노테이션 바로 밑에 있는 메서드가 실행된다.

 

- post방식만 처리 (get방식으로 보내면 405에러)

   @PostMapping("paramtest5.do") - *spring version 4.3 이상인 환경에서 지원

 

/MyController.java

package org.kosta.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.kosta.model.MemberVO;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;

/* annotation기반 controller는 
 * 클라이언트의 다양한 요청을 하나의 컨트롤러에서 
 * 처리할 수 있다.
 */

@Controller
public class MyController {
	
	// has a 관계
	// : 매개변수로 폼 데이터를 회원객체(has a 자동차 객체) 형태로
	//   전달 받을 수 있따. 
	@PostMapping("paramTestHasA.do")
	public String paramTestHasA(MemberVO memberVO) {
		System.out.println(memberVO);
		return "test_result2";
	}
}

[ 결과 ]

> 홈화면

 

> 입력 후, test_result2.jsp 로 이동

728x90
반응형