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에 바로 밑에 있는 코드 블럭 추가하고 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) 톰캣 다운로드(구글에 톰캣 검색해서 왼쪽 메뉴바에서 다운로드)
3) 프로젝트 생성
* 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>
- web.xml 수정
* 여기서 변경! 폴더 경로에서 /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 수정
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전달자: 화면에 데이터를 전달하기 위한 객체
* ResponseController, ex01, result01, result02
- 1번의 사용 빈도가 높음
- modelandview는 필터를 받아서 처리할 때 간혹가다 보임(알아두면 좋음!)
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 |