mjeongriver
article thumbnail
Published 2023. 2. 1. 17:53
day75-spring TIL/Spring

1. 스프링 MVC Controller 객체 구현

 

1) @Controller, @RequestMapping을 이용한 URL 맵핑

 

* Spring-servlet 뷰 합성기 배고 모두 주석 처리 한 후 main에 homecontroller 생성

(Spring-servlet, homecontroller)

<?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"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
		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-3.1.xsd">

	  
	<!-- 디스패처 서블릿이 초기로 등록하는 설정 파일 -->

	<!-- 메인 컨트롤러를 빈으로 등록 -->
	<!--  <bean id="xxx" class="com.simple.controller.MainController" />  -->

	<!-- 핸들러 맵핑 등록 -->
	<!-- /test/aaa 요청이 들어오면 xxx bean으로 핸들러 맵핑을 시킨다. -->
	<!-- <bean
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
		<property name="mappings">
			<props> -->
				<!-- key에는 url 주소가 들어감 -->
			<!--	<prop key="/test/aaa">xxx</prop>
					<prop key="/test/bbb">xxx</prop>
			</props>
		</property>
	</bean> 
			-->
	
	<!-- 스프링 내부에 있는 어노테이션 방법으로 핸들러 맵핑과 핸들러 어댑터 기능을 제공함 -->
	<mvc:annotation-driven/>
	
	<!-- 해당 패키지를 읽어서 @Controller가 있는 클래스를 자동으로 bean으로 등록합니다. include, exclude를 확장시켜 사용이 가능합니다. -->
	<context:component-scan base-package="com.simple.controller"/>

	<!-- 뷰 합성기(뷰리졸버) -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/WEB-INF/views/" />
	<property name="suffix" value=".jsp" />
	</bean>


</beans>

 

+ 참고

이렇게 확장 시켜 사용이 가능합니다.

 

package com.simple.controller;

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

@Controller //빈으로 생성할 클래스
public class HomeController {

	@RequestMapping("/test/aaa") //핸들러 맵핑
	public String home() {
		return "home";
	}
}

 

spring-servlet에서 Namespaces 들어가서 mvc 체크한 후 저장

 

homecontroller에 어노테이션을 붙인 후 spring-servlet에서 패키지명 넣으면 스프링 설정 파일에서 읽혀서 자동으로 빈이 됨

 

그러면 아주 간단히 서버 연결을 할 수 있음

 

- Spring-servlet에 바로 밑에 있는 코드 블럭 추가하고 resource에 index.jsp를 넣으면 index.jsp는 컨트롤러를 타지 않고도 서버에 연결되서 출력됨

 

* Spring-servlet

	<!-- css, js과 같은 정적 자원들은 폴더 경로로 바로 연결 -->
	<!-- /resource 경로로 들어오면 /resource폴더로 연결 -->
	<mvc:resources location="/resource" mapping="/resource/**"/>
<%@ 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>

	index.jsp

</body>
</html>

 

2) 톰캣 다운로드(구글에 톰캣 검색해서 왼쪽 메뉴바에서 다운로드)

 

spring 폴더 안에 압축 해제

 

우측 클릭 해서 new server해서 9.0 선택

 

폴더 경로 지정하고 jdk 11지정해서 선택 그리고 톰캣 서버 더블 클릭해서 설정 해줄 것

 

3) 프로젝트 생성

 

Legacy로 생성, 마지막 사진-가장 처음에 만들어진 패키지명(언제든지 수정 가능)

 

* pom.xml(기존은 너무 낮아서 호환성에 맞게 버전 변경해줄 것) : 하고나서 maven-update project

 

변경 부분 수정

https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api

 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.simple</groupId>
	<artifactId>controller</artifactId>
	<name>SpringBasic</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>

	<!-- pom.xml에서 사용할 변수들 -->
	<!-- 1. 자바 버전 11로 변경, springframework-version은 5.0.7로 변경 -->
	<properties>
		<java-version>11</java-version>
		<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>

	<!-- 사용할 모듈들 -->
	<dependencies>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
			<exclusions>
				<!-- Exclude Commons Logging in favor of SLF4j -->
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>

		<!-- Logging -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.15</version>
			<exclusions>
				<exclusion>
					<groupId>javax.mail</groupId>
					<artifactId>mail</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.jms</groupId>
					<artifactId>jms</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jdmk</groupId>
					<artifactId>jmxtools</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jmx</groupId>
					<artifactId>jmxri</artifactId>
				</exclusion>
			</exclusions>
			<scope>runtime</scope>
		</dependency>

		<!-- @Inject -->
		<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
		</dependency>

		<!-- Servlet -->
		<!-- 2. 자바에서 제공해주는 서버 환경: 메이븐 레파지토리로 들어가서 서블릿 버전 최소 3.1 이상으로 변경-->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>


		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

		<!-- Test -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.7</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
	
	<!-- 3. 메이븐 설정: 메이븐 컴파일 버전은 3.8.1로 변경, 컴파일 자바 레벨 11 -->
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-eclipse-plugin</artifactId>
				<version>2.9</version>
				<configuration>
					<additionalProjectnatures>
						<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
					</additionalProjectnatures>
					<additionalBuildcommands>
						<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
					</additionalBuildcommands>
					<downloadSources>true</downloadSources>
					<downloadJavadocs>true</downloadJavadocs>
				</configuration>
			</plugin>
			
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<!-- 여기 변경할 것! -->
				<version>3.8.1</version>
				<configuration>
					<source>11</source>
					<target>11</target>
					<compilerArgument>-Xlint:all</compilerArgument>
					<showWarnings>true</showWarnings>
					<showDeprecation>true</showDeprecation>
				</configuration>
			</plugin>
			
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>exec-maven-plugin</artifactId>
				<version>1.2.1</version>
				<configuration>
					<mainClass>org.test.int1.Main</mainClass>
				</configuration>
			</plugin>
		</plugins>
	</build>
	
</project>

위에 설정 하고 나서 views - home.jsp에서 서버 실행(ctrl + f11)

 

home.jsp 보기 위해서는 컨트롤러의 "/"로 들어가야 함. return 값이 home

 

- web.xml 수정

 

config 추가해주고 root-context.xml 파일 config에 넣어줄 것

 

* 여기서 변경! 폴더 경로에서 /web-INF/spring 여기서 spring 빼고 폴더 설정 마지막 사진처럼 설정해줄 것

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- 스프링 전역 설정 파일 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/config/root-context.xml</param-value>
	</context-param>
	
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- 디스패처 서블릿 등록 -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/config/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
		
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

</web-app>

 

- 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">

	<!-- 어노테이션 기능으로 핸들러 맵핑, 어댑터를 구현함. -->
	<annotation-driven />

	<!-- 정적 파일 경로 맵핑: css, js -->
	<resources mapping="/resources/**" location="/resources/" />

	<!-- 뷰 리졸버: 컨트롤러에서 돌아오는 뷰의 경로를 전체 경로로 변경 -->
	<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>
	
	<!-- 패키지를 읽어서 @Controller를 빈으로 생성 -->
	<context:component-scan base-package="com.simple.controller" />
	
	
	
</beans:beans>

 

- homecontroller.java, home.jsp

package com.simple.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;


@Controller //
public class HomeController {
	
	//로그 출력 기능 - 패키지 별로 log4j.xml에 등록
//	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
//		logger.info("Welcome home! The client locale is {}.", locale);
		
		return "home";
	}
	
}
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	Hello world!  
</h1>

</body>
</html>

- 교안에 "한글 처리 필터" 코드 복사해서 web.xml에 복사 붙여 넣기

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- 스프링 전역 설정 파일 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/config/root-context.xml</param-value>
	</context-param>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- 디스패처 서블릿 등록 -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/config/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	
	
	<!-- 한글 처리 필터 코드 -->
	<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>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	
	<!-- 위에 지정한 encodingFilter이름을 모든 패턴에 적용 -->
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

</web-app>

 

* 위에 코드블럭 추가하고 homecontroller-date 객체, home.jsp-server time 설정해주면 결과창에 한글로 잘 넘어옴

 

package com.simple.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;


@Controller //
public class HomeController {
	
	//로그 출력 기능 - 패키지 별로 log4j.xml에 등록
//	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	@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";
	}
	
}
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	Hello world!  
</h1>

<P>  The time on the server is ${serverTime}. </P>
</body>
</html>

 

2. 스프링 MVC Controller 객체 구현 추가 이론

1) @controller, @RequestMapping을 이용한 URL 맵핑, Controller의 화면 처리

 

 

* 예제

마지막 사진처럼 요청 경로, 출력 경로를 맞춰줍니다.

 

* requestController, requestController(수정), ex01.jsp

package com.simple.controller;

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

@Controller
public class RequestController {
	
	@RequestMapping("/xxx/yyy")
	public String ex01() {
		
		return "request/ex01"; 
	}

}
package com.simple.controller;

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

@Controller
@RequestMapping("/request") //메서드 앞에 공통으로 들어가는 요청 경로
public class RequestController {
	
	
	@RequestMapping("/ex01") //요청 경로
	public String ex01() {
		
		return "request/ex01"; //출력 경로 
	}

}
<%@ 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>

	ex01 화면

</body>
</html>

 

* RequestController에서 RequestMapping, PostMapping, GetMapping 사용해보기

 

요청 경로와 출력 경로가 동일할 때는 아래로 써도 됨

 

package com.simple.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/request") //메서드 앞에 공통으로 들어가는 요청 경로
public class RequestController {
	
	//String 메서드 - 출력 화면을 직접 지정
//	@RequestMapping("/ex01") //요청 경로
//	public String ex01() {
//		return "request/ex01"; //출력 경로 
//	}
	
	//void 메서드 - 요청 경로가 출력 경로가 됨
	@RequestMapping("/ex01")
	public void ex01() {}
	
	//get만 허용
	//@RequestMapping(value = "/basic1", method = RequestMethod.GET) //get만 허용
	@GetMapping("/basic1")
	public String basic1() {
		
		System.out.println("get만 허용");
		
		return null;
	}
	
	//post만 허용
//	@RequestMapping(value="/basic2", method=RequestMethod.POST)
	@PostMapping("/basic2")
	public String basic2() {
		
		System.out.println("post만 허용");
		
		return null;
	}
	
	//get, post 둘 다 허용
	@RequestMapping("/basic3")
	public String basic3() {
		return null;
	}

}

- 여기서 @RequestMapping(value = "/basic1", method = RequestMethod.GET)에 있는 value는 다중 값이 들어갈 때 사용

 

* context.path 경로 수정하는 법

1] pom.xml에서 artifactId 수정

2] 서버 더블 클릭하고 module 들어가서 path 수정

 

그러면 controller에서 basic으로 변경 완료

 

2) 요청 파라미터 처리 3가지

어노테이션-반드시 넘어와야 하는 값

 

* ex02 예제 - RequestController, ex02.jsp, ex02_ok.jsp(1, 2번 처리)

 

정확한 주소값을 넘겨주지 않아서 검색할 때 뒤에 넣어줘야함

 

package com.simple.controller;

import java.util.Arrays;
import java.util.List;

import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/request") //메서드 앞에 공통으로 들어가는 요청 경로
public class RequestController {
	
	//String 메서드 - 출력 화면을 직접 지정
//	@RequestMapping("/ex01") //요청 경로
//	public String ex01() {
//		return "request/ex01"; //출력 경로 
//	}
	
	//void 메서드 - 요청 경로가 출력 경로가 됨
	@RequestMapping("/ex01")
	public void ex01() {}
	
	//get만 허용
	//@RequestMapping(value = "/basic1", method = RequestMethod.GET) //get만 허용
	@GetMapping("/basic1")
	public String basic1() {
		
		System.out.println("get만 허용");
		
		return null;
	}
	
	//post만 허용
//	@RequestMapping(value="/basic2", method=RequestMethod.POST)
	@PostMapping("/basic2")
	public String basic2() {
		
		System.out.println("post만 허용");
		
		return null;
	}
	
	//get, post 둘 다 허용
	@RequestMapping("/basic3")
	public String basic3() {
		return null;
	}
	
	/////////////////////////////////////////////
	//ex02를 보여주는 화면 = ex02 화면 요청
	@RequestMapping("/ex02")
	public String ex02() {
		return "request/ex02";
	}
	
	//1st
//	@RequestMapping(value="/doAction", method=RequestMethod.POST)
//	//메서드를 만들어야 위에 method=RequestMethod.POST 자동 완성 됨
//	public String doAction(HttpServletRequest request) {
//	
//	//name파람
//	String name = request.getParameter("name");
//	//age파람
//	String age = request.getParameter("age");
//	//inter - checkbox
//	String[] inter = request.getParameterValues("inter");
//	
//	System.out.println(name);
//	System.out.println(age);
//	System.out.println(Arrays.toString(inter));
//			
//	return "request/ex02_ok";
//}

	//required = false를 넣으면 체크박스를 넘기지 않았어도 컨트롤러는 실행했다는 의미.
	//그래서 java.lang.NullPointerException가 뜹니다.
	@RequestMapping("/doAction")
	public String doAction(@RequestParam(value="name", required = false) String name, 
						   @RequestParam("age") int age,
						   @RequestParam(value="inter", required = false, defaultValue = "") List<String> list ) {
		
		//requestParam은 공백과 null 데이터가 전달되면 요청을 거절하게 됩니다.
		//필수 파라미터인 경우에는 @RequestParam("age") int age 이런식으로 작성하고
		//필수가 아닌 파라미터는 required=false 속성을 지정하면 됩니다.
		//필수가 아닌 파라미터인 경우에는 null or ""을 지정하게 되는데 defalutValue으로 기본 값을 줄 수 있습니다.
		
		System.out.println(name);
		System.out.println(age);
		System.out.println(list.toString());
		
		return "request/ex02_ok";
	
	}

}
<%@ 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>

	ex02 화면
	
	<form action="doAction" method="post">
		이름: <input type="text" name="name">
		나이: <input type="number" name="age">
		
		<input type="checkbox" name="inter" value="1">java
		<input type="checkbox" name="inter" value="2">spring
		<input type="checkbox" name="inter" value="3">boot
		
		<input type="submit" value="확인">
	</form>
	
</body>
</html>
<%@ 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>
	결과 페이지
</body>
</html>

- required = false: 필수는 아닙니다.

- 마지막 커맨드 객체를 통한 처리에서 vo 객체 만들 때(3번 처리)

 

* ReqVO.java, RequestController.java

package com.simple.command;

import java.util.List;

public class ReqVO {
	
	private String name;
	private int age;
	private List<String> inter;
	
	public ReqVO() {
		
	}

	//생성자
	public ReqVO(String name, int age, List<String> inter) {
		this.name = name;
		this.age = age;
		this.inter = inter;
	}

	//getter, setter
	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public List<String> getInter() {
		return inter;
	}

	public void setInter(List<String> inter) {
		this.inter = inter;
	}

	//toString 메서드
	@Override
	public String toString() {
		return "ReqVO [name=" + name + ", age=" + age + ", inter=" + inter + "]";
	}
	
	
	
	

	
}
package com.simple.controller;

import java.util.Arrays;
import java.util.List;

import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.simple.command.ReqVO;

@Controller
@RequestMapping("/request") //메서드 앞에 공통으로 들어가는 요청 경로
public class RequestController {

	//String 메서드 - 출력 화면을 직접 지정
	//	@RequestMapping("/ex01") //요청 경로
	//	public String ex01() {
	//		return "request/ex01"; //출력 경로 
	//	}

	//void 메서드 - 요청 경로가 출력 경로가 됨
	@RequestMapping("/ex01")
	public void ex01() {}

	//get만 허용
	//@RequestMapping(value = "/basic1", method = RequestMethod.GET) //get만 허용
	@GetMapping("/basic1")
	public String basic1() {

		System.out.println("get만 허용");

		return null;
	}

	//post만 허용
	//	@RequestMapping(value="/basic2", method=RequestMethod.POST)
	@PostMapping("/basic2")
	public String basic2() {

		System.out.println("post만 허용");

		return null;
	}

	//get, post 둘 다 허용
	@RequestMapping("/basic3")
	public String basic3() {
		return null;
	}

	/////////////////////////////////////////////
	//ex02를 보여주는 화면 = ex02 화면 요청
	@RequestMapping("/ex02")
	public String ex02() {
		return "request/ex02";
	}

	//1st
	//	@RequestMapping(value="/doAction", method=RequestMethod.POST)
	//	//메서드를 만들어야 위에 method=RequestMethod.POST 자동 완성 됨
	//	public String doAction(HttpServletRequest request) {
	//	
	//	//name파람
	//	String name = request.getParameter("name");
	//	//age파람
	//	String age = request.getParameter("age");
	//	//inter - checkbox
	//	String[] inter = request.getParameterValues("inter");
	//	
	//	System.out.println(name);
	//	System.out.println(age);
	//	System.out.println(Arrays.toString(inter));
	//			
	//	return "request/ex02_ok";
	//}

	//2nd
	//required = false를 넣으면 체크박스를 넘기지 않았어도 컨트롤러는 실행했다는 의미.
	//그래서 java.lang.NullPointerException가 뜹니다.
	//	@RequestMapping("/doAction")
	//	public String doAction(@RequestParam(value="name", required = false) String name, 
	//						   @RequestParam("age") int age,
	//						   @RequestParam(value="inter", required = false, defaultValue = "") List<String> list ) {
	//		
	//		//requestParam은 공백과 null 데이터가 전달되면 요청을 거절하게 됩니다.
	//		//필수 파라미터인 경우에는 @RequestParam("age") int age 이런식으로 작성하고
	//		//필수가 아닌 파라미터는 required=false 속성을 지정하면 됩니다.
	//		//필수가 아닌 파라미터인 경우에는 null or ""을 지정하게 되는데 defalutValue으로 기본 값을 줄 수 있습니다.
	//		
	//		System.out.println(name);
	//		System.out.println(age);
	//		System.out.println(list.toString());
	//		
	//		return "request/ex02_ok";
	//	
	//	}
	
	//3nd - 커맨드 객체를 통해서 맵핑( 넘어오는 데이터의 name과 setter명이 같아야 합니다)
	@RequestMapping("/doAction")
	public String doAciton(ReqVO vo) {
		
		System.out.println(vo.toString());
		
		return "request/ex02_ok";
	}

}

 

* 연습 문제(RequestController, req_quiz01, req_quiz01_ok, req_quiz01_no)

package com.simple.controller;

import java.util.Arrays;
import java.util.List;

import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.simple.command.ReqVO;

@Controller
@RequestMapping("/request") //메서드 앞에 공통으로 들어가는 요청 경로
public class RequestController {

	//내 답안
//	@RequestMapping("/req_quiz01")
//	public void req_quiz01() {}
//
//	@RequestMapping("/req_quiz01A")
//	public String DoAction(@RequestParam("id") String id, 
//			@RequestParam("pw") String pw) {
//
//		System.out.println(id);
//		System.out.println(pw);
//
//		return id.equals("abc123") && pw.equals("xxx123") ? "request/req_quiz01_ok" : "request/req_quiz01_no";
//
//	}

	
	//선생님 답안
	@RequestMapping("/req_quiz01")
	public String quiz01() {
		return "request/req_quiz01";
	}
	
	@RequestMapping(value="/login", method = RequestMethod.POST)
	public String Login(@RequestParam("id") String id,
						@RequestParam("pw") String pw ) {
	
	if(id.equals("abc123") && pw.equals("xxx123")) {
		return "request/req_quiz01_ok";
	} else {
		return "request/req_quiz01_no";		
	}
		
}
}
<%@ 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>
<hr>
	<%--
	맵핑
	1.RequestController에 현재 파일의 화면 처리를 하는 메서드를 생성.
	2.폼 전송을 처리하는 메서드 생성(login맵핑 - POST만 허용)
	3.아이디가 abc123, 비밀번호가 xxx123이라면 req_quiz01_ok.jsp 로 화면 이동
	4.아니라면 req_quiz01_no.jsp로 화면이동 
	--%>

	<!-- 내 답안 
	<form action="req_quiz01A" method="post">
		ID:<input type="text" name="id"><br>
		PW:<input type="password" name="pw"><br>
		<input type="submit" value="로그인" >
	</form>
	-->
	
	<form action="login" method="post">
		ID:<input type="text" name="id"><br>
		PW:<input type="password" name="pw"><br>
		<input type="submit" value="로그인" >
	</form>
	
	
	
</body>
</html>

 

3) Model전달자: 화면에 데이터를 전달하기 위한 객체

 

model, modelMap하고 동일한 인터페이스

 

* ResponseController, ex01, result01, result02

- 1번의 사용 빈도가 높음

- modelandview는 필터를 받아서 처리할 때 간혹가다 보임(알아두면 좋음!)

 

 

홍길동이라는 값은 responseController -  model.addAttribute("data", "홍길동"); 에서 온 값

 

package com.simple.controller;

import java.util.Date;

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

@Controller
@RequestMapping("/response")
public class ResponseController {
	
	//1. 화면
	@RequestMapping("/ex01") //입력 경로
	public String ex01() {
		return "response/ex01"; //출력 경로
	}
	
	//result01 요청 - model 객체
	@RequestMapping("/result01")
	public String result01(Model model) {
		
		model.addAttribute("data", "홍길동"); //키, 값
		model.addAttribute("serverTime", new Date());
		
		return "response/result01";
	}
	
	//result02 요청 - ModelAndView 객체
	@RequestMapping("/result02")
	public ModelAndView result02() {
		
		//뷰의 정보, data 정보를 함께 저장할 수 있는 객체
		ModelAndView mv = new ModelAndView();	
		//필요한 데이터를 담는다.
		mv.addObject("data", "홍길동");
		mv.addObject("name", "이순신");
		//뷰에 대한 부분(string에 실은 경로)
		mv.setViewName("response/result02");
		
		return mv;
	}
}
<%@ 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>

	<h3>res ex01</h3>
	
	<a href="result01">model 객체 사용</a>
	<a href="result02">modelAndView 객체 사용</a>

</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
    <%--  
    <%
    String data = (String)request.getAttribute("data");
    %>
    --%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

  <%-- <%= data %> --%>
  
  결과
  ${data } <br/>
  ${serverTime } <br/>
  
</body>
</html>
<%@ 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>

	결과
	${ data }
	${ name }

</body>
</html>

'TIL > Spring' 카테고리의 다른 글

day78-spring  (0) 2023.02.06
day77-spring  (0) 2023.02.03
day76-spring  (0) 2023.02.02
day74-spring  (0) 2023.01.31
day73-spring  (0) 2023.01.30
profile

mjeongriver

@mjeongriver

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그