티스토리 뷰
일일이 했던 설정들을
작업환경을 자동으로 설정해주는 Legacy Project
1. Spring MVC
(1) Spring MVC Process
| [ 사용자 요청 ] | → | [ 디스패쳐(Dispatcher) ] | ① → |
[ 컨트롤러(Controller) ] |
| ② ← |
||||
| [ 뷰(View) ] |
① HandlerMapping : 디스패쳐가 사용자 요청에 따른 컨트롤러를 선택(실행)하도록 하는 것. <url.mapping>
② ViewResolver : 컨트롤러가 지정한 뷰 이름으로부터 응답 결과 화면을 생성하는 View 객체를 구한다.
-컨트롤러(Controlloer) : 뷰(View), 모델(Model)에 데이터를 실어서 디스패쳐에게 돌려줌.
-디스패쳐(Dispatcher) : 모델에 실어진 데이터를 뷰에 담아서 사용자에게 보여줌.
2. Spring Legacy Project
(1) STS4 Legacy Project 생성을 위한 준비
① Exlipse Marketplace : Spring Tools 3 Add-One for Wpring Tools4 3.9.21. RELEASE
② Exception initialize 오류 수정
SpringToolSuit4.ini : (JDK 폴더) 경로\javaw.exe 추가 후 저장
③ Convert 오류 수정
STS4 실행 아이콘 우클릭 : -clean 입력 후 저장
(* 자세한 설명은 [03_1] 참고)
(2) Spring Legacy Project 기본 구조 살펴보기
(2-1) 생성
-그룹패키지명 : 3단계 작성(com.이름.프로젝트 주제) ex) com.wsy.web_board
└실제 사용하는 패키지는 3단계 사용 ex) com.wsy.controller, com.wsy.service …
└패키지 이름은 소문자와 언더바 조합
(2-2) web_board pom.xml
-필요에 따라 Java, Spring, Servlet, Junit 등 버전 변경
<?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.wsy</groupId>
<artifactId>web_board</artifactId>
<name>web_board</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<!-- ★ 자바, 스프링 버전 -->
<java-version>1.6</java-version>
<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
<!-- ↑ maven repository에서 코드 가져올 필요 없이 해당하는 버전만 입력하면 됨. -->
<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 --><!-- ★ 버전 변경? No 안 고침 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</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 --><!-- ★ 버전 변경? 4.7 → 4.12 변경 -->
<!-- junit : java 단위 테스트 도구. 함수가 제대로 작동하는지 등의 확인 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
<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>
<!-- ★ 메이븐 컴파일러 source, target 버전 변경-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</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>
(2-3) 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">
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<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/spring/appServlet/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>
(2-4) servlet-context.xml
src/main/webapp/WEB-INF/spring/appServlet
<?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">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven /> <!-- ★ 리퀘스트 매핑(@RequestMapping) -->
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- ★ resources 폴더 이름으로 접근. -->
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<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>
<context:component-scan base-package="com.wsy.web_board" />
<!-- ★베이스 패키지 밑에 패키지를 만들어나가면, 하위 패키지는 자동으로 스캔(뒤짐) -->
</beans:beans>
(2-5) HomeController
src/main/java - com.wsy.web_board - HomeController
package com.wsy.web_board;
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;
/**
* Handles requests for the application home page.
*/
@Controller
public class HomeController {
//Logger : 함수의 값이 제대로 넘어왔나 확인. System.out 같은 역할인데 보다 편한 것. 만들어 놓고 필요할 때마다 가져다 쓰면 됨.
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/* Simply selects the home view to render by returning its name. */
//디스패쳐 서블릿 : 사용자 요청 받음 → HomeController가 url 매핑 찾음
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) { //스프링은 매개변수를 받는 폭이 넓음. 객체 생성하지 않아도 그냥 적어주면 됨. Model model
logger.info("Welcome home! The client locale is {}.", locale);
// 콘솔에 찍는 것
Date date = new Date(); //실행되는 시간
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
//Long 형태로 받겠다, Locale 지역 날짜, 시간 반영
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
return "home"; //prefix, suffix를 가진 home.jsp 있어야 함.
//거기로 데이터 전송한다는 뜻.
// >> view - home.jsp 이동
}
}
(*method를 명시적으로 적지 않으면 get이 기본)
(2-6) home.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>
Hello world!
</h1>
<P> The time on the server is ${serverTime}. </P>
</body>
</html>
(2-7) 한글 깨짐 처리
기본으로 만들어진 index 화면에 현재 날짜가 출력되는데, 한글이 깨진 상태. >> 구글링해서 코드 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">
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<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/spring/appServlet/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>
<filter-mapping> <!--한글 필터 어디까지 적용할 것인가? -->
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern> <!--루트 아래 전부 -->
</filter-mapping>
</web-app>
└이렇게 한번만 해주면 한글 깨짐 방지 처리 완료. JSP 할 때는 필요할 때마다 setCharacterEndcoding 해줘야 했는데...간편.
3. Spring MVC Project
-웹 게시판 만들기
(1) Spring Legacy Project 생성
-Project name : web_board // Srping MVC Project 선택
-그룹 패키지명 : com.wsy.web_board
(2) 필요한 환경 설정 - pom.xml
버전 변경
<?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.wsy</groupId>
<artifactId>web_board</artifactId>
<name>web_board</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<!-- ★ 자바, 스프링 버전 -->
<java-version>11</java-version><!-- ★ -->
<org.springframework-version>5.2.19.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 --><!-- ★ 버전 변경? No 안 고침 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</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 --><!-- ★ 버전 변경? 4.7 → 4.12 변경 -->
<!-- junit : java 단위 테스트 도구. 함수가 제대로 작동하는지 등의 확인 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version><!-- ★ -->
<scope>test</scope>
</dependency>
</dependencies>
<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>
<!-- ★ 메이븐 컴파일러 source, target 버전 변경-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.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>
>> 출력(프로젝트 Run As)
Hello world!The time on the server is 2022년 3월 3일 오후 9시 6분 15초 KST. |
(3) 클래스 생성 - MyController
-패키지 : com.wsy.web_board.controller
-클래스 : MyController
package com.wsy.web_board.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller //controller임을 명시
public class MyController {
//1.
// @RequestMapping("list") //논리뷰 이름
// public String List() {
// return "list"; //view 찾음. list.jsp 파일이 있어야 한다.
// //WEB-INF/views/list.jsp 있어야 함.
// }
// 2. view 이름이 없을 때, 리턴 x
@RequestMapping("list")
public void list() {
}//view 이름을 주지 않으면, urlmapping으로 찾음.
}
(3-1) list.jsp 생성
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title> List Page</title>
</head>
<body>
<h5>List Page</h5>
</body>
</html>
>> 결과 출력 : 프로젝트 실행(Run As)
1번이든 2번이든 http://localhost:8080/web_board/list 호출했을 때, 아래와 같이 뜸.
| list page |
(3-3) 매개변수
package com.wsy.web_board.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller //controller임을 명시
public class MyController {
//3. 모델에 데이터 전달하고 싶을때, request 쓸 필요없이 Model model 쓰면 됨.
@RequestMapping("list")
public void list(String name, String pw, Model model) {
model.addAttribute("name", name);
model.addAttribute("pw", pw);
System.out.println(name);
System.out.println(pw);
}
//4.
@RequestMapping("list")
public String list1(@RequestParam("n") String name, @RequestParam("p") String pw, Model model) {
model.addAttribute("name", name);
model.addAttribute("pw", pw);
return "list";
}
//@RequestParam은 값을 꼭 넣어줘야 함.
//요청 : http://localhost:8080/web_board/list?a=admin&p=1234
//name에 admin, pw에 1234 할당
//5.
@RequestMapping("list/{n}") // n을 받아서 name에 할당한다는 뜻.
public String list2(@PathVariable("n") String name, Model model) {
model.addAttribute("name", name);
return "list";
}
//요청 : http://localhost:8080/web_board/list/aaa → name에 aaa 할당
}
>> 결과 출력 : 프로젝트 우클릭 실행(Run As)
http://localhost:8080/web_board/list를 실행했을 때,
| 3번 | 4번 - @RequestParam("") | 5번 - @PathVariable("") |
| 값을 넣든 넣지 않는 출력은 됨 | 값을 넣지 않으면 출력되지 않음. | 데이터를 받아 할당한다는 뜻. |
| List Page NAME : P W : |
400 Error | |
| List Page NAME : admin P W : 1234 |
└3번 : 쿼리스트링(값을 넣었을때) : http://localhost:8080/web_board/list?n=admin&&p=1234
└5번 : http://localhost:8080/web_board/list/admin
(4) method 설정
package com.wsy.web_board.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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 //controller임을 명시
@RequestMapping("/board/") //공통적인 것. board 밑에 무언 가.
public class MyController {
//메소드 설정 방법
// @RequestMapping(value="list", method=RequestMethod.GET) //method 설정 1 - 초기방법
@GetMapping("list") //method 설정 2 - get 방식
// PostMapping("list") //method 설정 3 - post 방식
public void List(String name, String pw, Model model) {
model.addAttribute("name", name);
model.addAttribute("pw", pw);
System.out.println(name);
System.out.println(pw);
}
}
└@RequestMapping을 반드시 적어야 하는 경우, 맨위에서 공통적인 것을 표현할 때. 하위에서 get이나 post 사용 가능.
>> 결과 출력 : http://localhost:8080/web_board/list?name=admin&pw=123
| 웹 브라우저 | 콘솔 |
| List Page NAME : admin P W : 123 |
admin 123 |
(5) 호출 url 간결화
-Servers >> 모듈즈 >> Path edit : 슬래시(/)만 남기고 삭제(프로젝트 이름 삭제)
(6) 데이터가 객체로 넘어올 때,
JSP에서는 객체의 데이터를 꺼내서 받았는데, 스프링은 그런 과정 생략
(6-1)
-MyController
package com.wsy.web_board.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
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 //controller임을 명시
@RequestMapping("/board/") //board 밑에 무언가
public class MyController {
@GetMapping("input")
public String inputForm() {
return "board/input"; // 입력 폼 input.jsp가 열리도록 연결만 하고 있음.
}
@GetMapping("list")
public void list(String name, String pw, Model model) {
model.addAttribute("name", name);
model.addAttribute("pw", pw);
System.out.println(name);
System.out.println(pw);
}
}
-input.jsp 생성
-폴더 생성 : src / main / webapp / WEB-INF / views / board
-jsp 생성 : input
<%@ 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>
<form action="insert" method="post">
<table>
<tr>
<td>아이디</td>
<td><input type="text" name="id" /></td>
</tr>
<tr>
<td>비밀번호</td>
<td><input type="text" name="pw" /></td>
</tr>
<tr>
<td>전화번호</td>
<td><input type="text" name="tel" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="submit" /></td>
</tr>
</table>
</form>
</body>
</html>
(6-2) 데이터 한 개씩 받는 법 - JSP에서 하듯이
-MyController
package com.wsy.web_board.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.wsy.web_board.Member;
@Controller //controller임을 명시
@RequestMapping("/board/") //공통적인 것. board 밑에 무언가. //폴더 생성해줘야 함
public class MyController {
@GetMapping("input")
public String inputForm() {
return "board/input"; // 입력 폼 input.jsp가 열리도록 연결만 하고 있음.
}
@PostMapping("insert")
public String insert(HttpServletRequest request, Model model) {
//값 가져오기
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String tel = request.getParameter("tel");
//값 넣기
model.addAttribute("id", id);
model.addAttribute("pw", pw);
model.addAttribute("tel", tel);
return "board/content"; // board 폴더 안에 content.jsp 있어야 함
}
}
-content.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>
id : ${id }<br>
pw : ${pw }<br>
tel : ${tel }<br>
</body>
</html>
>> 결과 : http://localhost:8080/board/input → insert
| id : admin pw : 1234 tel : 01012345678 |
위의 방법은 옛날 방법.
요즘에는 회원가입할 때, 입력해야 할 것들이 많음. 그래서 '객체 단위'로 받는 방법.
(6-3) 객체 단위
-클래스 생성 : Member
패키지 이름 : com.wsy.web_board
클래스 이름 : Member
package com.wsy.web_board;
public class Member {
private String id;
private String pw;
private String tel;
//생성자
public Member() {
// default
}
public Member(String id, String pw, String tel) {
super();
this.id = id;
this.pw = pw;
this.tel = tel;
}
//getter/setter
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
//toString
@Override
public String toString() {
return "Member [id=" + id + ", pw=" + pw + ", tel=" + tel + "]";
}
}
-MyController
package com.wsy.web_board.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.wsy.web_board.Member;
@Controller //controller임을 명시
@RequestMapping("/board/") //공통적인 것. board 밑에 무언가. //폴더 생성해줘야 함
public class MyController {
//1.
@PostMapping("insert")
public String insert(Member member, Model model) { //데이터를 받는 것 model
model.addAttribute("member", member);
//클래스(Member)와 변수(member)가 대/소문자만 다르고 같을 때, 모델에 싣지 않아도 데이터가 감.
//어디까지?
//모델에 실을 경우, 이름을 원하는 대로 설정할 수 있음. 보통 긴 경우, 축약해서 쓸 때.
return "board/content";
}
//2. 클래스와 변수가 다를 경우,
@PostMapping("insert")
public String insert(Member mem, Model model) { //데이터를 받는 것 model
model.addAttribute("memberInfo", mem);
//이때, view인 content.jsp에 memberInfo라는 데이터를 받을 것이 있어야 함.
return "board/content";
}
@GetMapping("input")
public String inputForm() {
return "board/input"; // 입력 폼 input.jsp가 열리도록 연결만 하고 있음.
}
//메소드 설정 방법
@GetMapping("list") //method 설정 2 - get 방식
public void List(String name, String pw, Model model) {
model.addAttribute("name", name);
model.addAttribute("pw", pw);
System.out.println(name);
System.out.println(pw);
}
}
└1번과 2번 중 선택. 둘 다 활성화하면 오류.
-content.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>
id : ${member.id }<br> <!-- member는 MyController에서 1번 Member member -->
pw : ${member.pw }<br> <!-- id는 getId -->
tel : ${member.tel }<br>
<!-- 2.번 memberInfo --> <!--사용할 땐, 둘 중 하나 -->
id : ${memberInfo.id }<br>
pw : ${memberInfo.pw }<br>
tel : ${memberInfo.tel }<br>
</body>
</html>
└set함수와 form의 name을 매칭해서 값을 넣음.
>> 출력 : http://localhost:8080/board/input
입력 폼에서 아이디, 비밀번호, 전화번호 입력하면 입력값이 출력됨.
(6-4) 클래스 이름, 변수 이름 상관관계
//1.
@PostMapping("insert")
public String insert(Member member, Model model) { //데이터를 받는 것 model
model.addAttribute("member", member);
return "board/content";
}
//1-1. 클래스(Member)와 변수(member)가 대/소문자만 다르고 같을 때, 모델에 싣지 않아도 데이터 전송.
@PostMapping("insert")
public String insert(Member member, Model model) {
return "board/content";
}
//2. 클래스와 변수가 다를 때,
@PostMapping("insert")
public String insert(Member mem, Model model) {
model.addAttribute("memberInfo", mem);
return "board/content";
//이때, view인 content.jsp에 memberInfo라는 데이터를 받을 것이 있어야 함.
}
//2-1. 클래스와 변수가 다를 때, 모델에 싣는 거 생략하면
@PostMapping("insert")
public String insert(Member mem, Model model) {
return "board/content";
}
└2-1번은 실행했을 때, 오류는 없지만 입력값이 전달되지 않음.
(7) redirect
보통 게시판에서 데이터 입력하고 나면, 리스트 페이지 호출
package com.wsy.web_board.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.wsy.web_board.Member;
@Controller //controller임을 명시
@RequestMapping("/board/") //공통적인 것. board 밑에 무언가. //폴더 생성해줘야 함
public class MyController {
@PostMapping("insert") //★
public String insert(@ModelAttribute("mem") Member mem) {
if(mem.getId().equals("aaa")&&mem.getPw().equals("1234")) {
return "board/content";
}
return "redirect:input"; //다시 한번 controller 메소드를 부르는 것.
//뷰 이름을 리턴(리턴은 리턴하고 벗어남) - input
//redirect : 또 다른 컨트롤러 호출
//만약에, 인서트 후 바로 return "board/list"; 하면 디비 내용이 안 나옴. 반영 안 됨.
}
@GetMapping("input")
public String inputForm() {
return "board/input"; // 입력 폼 input.jsp가 열리도록 연결만 하고 있음.
}
//메소드 설정 방법
@GetMapping("list") //method 설정 2 - get 방식
public void List(String name, String pw, Model model) {
model.addAttribute("name", name);
model.addAttribute("pw", pw);
System.out.println(name);
System.out.println(pw);
}
}
>> 결과
입력 폼 페이지에서 아이디 aaa, 비밀번호 1234를 입력하면 입력값이 출력되는 페이지로 넘어가지만,
그 외의 아이디, 비밀번호를 입력할 경우 input 화면
(7-1) redirect할 때, 데이터를 함께 보내고 싶으면 매개변수 추가 - RedirectAttributes
-MyController
package com.wsy.web_board.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.wsy.web_board.Member;
@Controller //controller임을 명시
@RequestMapping("/board/") //공통적인 것. board 밑에 무언가. //폴더 생성해줘야 함
public class MyController {
@PostMapping("insert")
public String insert(@ModelAttribute("mem") Member mem, RedirectAttributes rttr) { //데이터 받는 것 Model
if(mem.getId().equals("aaa")&&mem.getPw().equals("1234")) {
return "board/content";
} else {
//1. 그냥
rttr.addFlashAttribute("msg", "아이디 또는 비밀번호가 틀렸습니다.");
//2. flash
rttr.addFlashAttribute("msg", "아이디 또는 비밀번호가 틀렸습니다."); //input.jsp까지 감.
return "redirect:input"; //다시 한번 controller 메소드를 부르는 것.
}
//입력 페이지에서 앞으로뒤로 왔다갔다할 때도 출력.
//flash는 처음 한 번만 출력될 때 사용
//다시 input 호출
//만약에, 인서트 후 바로 return "board/list";하면 디비 내용이 안 나옴.
//뷰 이름을 리턴
//또다른 컨트롤러 호출 ; redirect
//return은 리턴하고 벗어남.
//redirect 할 때도 데이터를 보내고 싶을 때, 매개변수 추가 RedirectAttributes
}
@GetMapping("input")
public String inputForm() {
return "board/input"; // 입력 폼 input.jsp가 열리도록 연결만 하고 있음.
}
//메소드 설정 방법
@GetMapping("list") //method 설정 2 - get 방식
public void List(String name, String pw, Model model) {
model.addAttribute("name", name);
model.addAttribute("pw", pw);
System.out.println(name);
System.out.println(pw);
}
}
-input.jsp
msg를 띄울 위치는 설정
<%@ 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>
<p>${msg }</p> <!--★-->
<form action="insert" method="post">
<table>
<tr>
<td>아이디</td>
<td><input type="text" name="id" /></td>
</tr>
<tr>
<td>비밀번호</td>
<td><input type="text" name="pw" /></td>
</tr>
<tr>
<td>전화번호</td>
<td><input type="text" name="tel" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="submit" /></td>
</tr>
</table>
</form>
</body>
</html>
>> 결과 : http://localhost:8080/board/input
아이디 aaa, 비밀번호 1234를 입력하면 페이지 넘어감.
잘못된 아이디 또는 비밀번호를 입력할 경우, 설정한 메시지 출력됨.
이때, 플래시(flash)는 앞/뒤로 왔다갔다해도 한 번만 출력되지만 그냥은 계속 출력됨.
(8) 리턴 타입
-return ModelAndView; 옛날 방식
-String
-void : 단순히 화면 열기만 할 때 사용
-json(데이터 표시하는 방법) : 객체 타입으로 리턴 가능
-@ResponseBody : 웹브라우저 바디에 리턴(그냥 웹 브라우저에 출력되는 것)
-ResponseEntity : 객체와 http 헤더 정보를 추가적으로 보낼 때, 리턴할 때. Ajax랑 같이 쓰는 게 좋음.
(*헤더 정보에 httpStatus.OK)
(받는 쪽에서 정상적으로 접속이 완료됐다. 같은 거 할 때)
(8-1) json
-maven repository : jackson data코드 pom.xml <dependencies> 태그 사이에 복붙
-MyController
package com.wsy.web_board.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.wsy.web_board.Member;
@Controller //controller임을 명시
@RequestMapping("/board/") //공통적인 것. board 밑에 무언가. //폴더 생성해줘야 함
public class MyController {
// //리턴 타입
// @GetMapping("res")
// public @ResponseBody Member getMember(Member member) {
// return member; //form에서 전달된 데이터 리턴
// }
//데이터를 직접 만들어서 사용
//리턴 타입 //@ResponseBod 웹 브라우저 바디에 데이터 리턴
@GetMapping("res")
public @ResponseBody Member getMember() {
//객체를 직접 만들어서 사용
Member member = new Member("aaa", "1234", "010-0000-0000");
return member;
}
@PostMapping("insert")
public String insert(@ModelAttribute("mem") Member mem, RedirectAttributes rttr) { //데이터 받는 것 Model
if(mem.getId().equals("aaa")&&mem.getPw().equals("1234")) {
return "board/content";
} else {
rttr.addFlashAttribute("msg", "아이디 또는 비밀번호가 틀렸습니다."); //input.jsp까지 감.
return "redirect:input"; //다시 한번 controller 메소드를 부르는 것.
}
}
@GetMapping("input")
public String inputForm() {
return "board/input"; // 입력 폼 input.jsp가 열리도록 연결만 하고 있음.
}
//메소드 설정 방법
@GetMapping("list") //method 설정 2 - get 방식
public void List(String name, String pw, Model model) {
model.addAttribute("name", name);
model.addAttribute("pw", pw);
System.out.println(name);
System.out.println(pw);
}
}
-input.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>
<p>${msg }</p><!-- ★ action="res" -->
<form action="res" method="post">
<table>
<tr>
<td>아이디</td>
<td><input type="text" name="id" /></td>
</tr>
<tr>
<td>비밀번호</td>
<td><input type="text" name="pw" /></td>
</tr>
<tr>
<td>전화번호</td>
<td><input type="text" name="tel" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="submit" /></td>
</tr>
</table>
</form>
</body>
</html>
>> 결과 출력 : http://localhost:8080/board/res
{"id":"aaa","pw":"1234","tel":"010-0000-0000"}
(8-2) 리스트 형식 - 데이터 직접 입력(디비 미연결 상태라)
-MyController
@GetMapping("res2")
public @ResponseBody List<Member> getList(){
//디비 연결되어 있으면, List는 보통 디비에서 가져오겠지. 지금은 연결 안 되어 있으니까.
List<Member> memberList = new ArrayList<Member>();
memberList.add(new Member("aaa","111","010-0000"));
memberList.add(new Member("abc","222","010-0001"));
memberList.add(new Member("acd","333","010-0002"));
return memberList;
}
>> 결과 출력 : http://localhost:8080/board/res2
[{"id":"aaa","pw":"111","tel":"010-0000"},{"id":"abc","pw":"222","tel":"010-0001"},{"id":"acd","pw":"333","tel":"010-0002"}]
(8-3) ResponseEntity
-MyController
@GetMapping("res3")
public ResponseEntity<Member> getEntity(){
Member member = new Member("aaa", "1234", "010-0000-0000");
HttpHeaders header = new HttpHeaders();
header.add("Content-Type", "application/json;charset=UTF-8");
return new ResponseEntity<Member>(member, header, HttpStatus.OK);
}
>> 결과 출력 : http://localhost:8080/board/res3
{"id":"aaa","pw":"1234","tel":"010-0000-0000"}
>> 웹 브라우저 >> [F12] >> 네트워크 >> [F5] 새로고침하면 상태볼 수 있음.

- 2022.03.03 복습 코드 -
'수업 > └Spring Framework' 카테고리의 다른 글
| [04]웹 게시판 CRUD 클론_1차 (0) | 2022.03.07 |
|---|---|
| [04]웹 게시판(CRUD)_1차 (0) | 2022.03.04 |
| [03_1]Spring MVC - Maven Project_실습 (0) | 2022.03.03 |
| [02]의존성 주입 - 인터페이스, XML, Annotation, Java Configuration (0) | 2022.02.25 |
| [00]스프링 프레임워크 수업 개요와 개념 (0) | 2022.02.25 |
- Total
- Today
- Yesterday
- html pre
- caption-side
- text formatting
- 스크립태그
- 변수
- typeof
- Java
- A%B
- empty-cell
- initialized
- ScriptTag
- css
- 입력양식
- html layout
- html base tag
- border-spacing
- 미디어 태그
- html atrribute
- html
- scanner
- 외부구성요소
- html input type
- BAEKJOON
- JavaScript
- selcetor
- input type 종류
- 기본선택자
- html a tag
- CascadingStyleSheet
- improt
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |