티스토리 뷰
23/02/01,02) 5강 스프링 MVC Controller객체 구현/ RequestMapping, 요청 파라미터 다루기, model 객체 , context패스 설정 , Redirect , EL , JSTL
JadeStone 2023. 2. 1. 21:01 <!-- 스프링 내부에 있는 어노테이션방법으로 핸들러맵핑과 핸들러어댑터기능을 제공함 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- -->
<context:component-scan base-package="com.simple.controller"></context:component-scan>
위에 기능을 사용하려면 아래에 namespace에서 아래 내용들을 체크해줘야한다.
<context:component-scan base-package="com.simple.controller"></context:component-scan>
써주면
파일 그림에 s 자가 생겼다. 이 의미는
HomeController.java에서 빈으로 만들겠다고 선언해놓은 클래스가 스프링 설정파일에 읽혀서 빈이 자동으로 생성되었다는 것.
*HomeController.java
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";
}
}
컨텍스트 패스란 ?
프로젝트 구분 경로.
#톰캣9버젼 설치
링크 :
https://tomcat.apache.org/download-90.cgi
# 스프링 레거시 프로젝트 만들기
* 프로젝트의 구조
*porm.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.simple</groupId>
<artifactId>controller</artifactId>
<name>SpringBasic</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<!-- pom.xml에서 사용할 변수들 -->
<!-- 자바버전 11, 스프링버전 변경 -->
<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 -->
<!-- 서블릿 버전 최소 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>
<!-- maven 관련 설정이 들어가는 곳 bulid -->
<!-- 메이븐 설정 - 메이븐 버전 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>
위와 같이 설정 변경하고
프로젝트 우클릭 maven 에서 update project
- 5강 컨트롤러 객체의구현 -
@Controller
@RequestMapping("/request") //메서드 앞에 공통으로 들어가는 요청경로
public class RequestController {
}
* void형
-들어오는 주소와 나가는 주소가 똑같을 때 사용.
*String 형 메소드
-들어오는 경로와 나가는 경로가 다를 때 사용.
-제일 많이 사용.
//String 메서드 - 출력 화면을 직접 지정 ( 이 방식이 제일 많이 쓰임)
// @RequestMapping("/ex01")//요청경로
// public String ex01() {
// return "request/ex01"; //출력경로
// }
//void메서드 - 요청 경로가 출력경로가 됨
@RequestMapping("/ex01")
public void ex01() {}
//get만 허용
//@RequestMapping(value = "/basic1", method = RequestMethod.GET )
@GetMapping("/basic1")
public String basic() {
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;
}
★ 커맨드 객체로 들어오는 값을 받을 때에는
post 방식 뿐 아니라 get 방식으로 넘어오는 값도 받을 수 있다는거 잘 알아두자.
이때 중요한건 넘어오는 데이터의 이름 혹은 키값과 , 데이터를 받는 객체내에서 변수의 이름이 반드시 같아야 함. ★
# HttpServletRequest 를 이용한 방식
//1st
@RequestMapping(value="/doAction", 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";
}
# @RequestParam() 어노테이션으로 처리
*RequestParam 은 필수적으로 값이 넘어와야하지만 ( 값이 담겨있지 않으면 요청이 거절됨.)
속성 값으로 required = false 로 지정해주면
공백이나 값이 없어도 괜찮음.
다만, 공백이나 null값이 넘어온 경우 오류가 발생할 상황이 많기 때문에
defaultValue 라는 속성에 기본값을 지정해줌.
( 예상되는 문제중 하나, null.toString() -> nullPointerException 발생)
즉 required 와 defaultValue는 짝궁으로 같이 쓰인다고 알고있자.
//2nd
@RequestMapping("/doAction")
public String doAction(@RequestParam(value="name", required = false, defaultValue = "") String name,
@RequestParam("age") int age,
@RequestParam(value="inter", required = false, defaultValue = "") List<String> list) {
//requestParam은 공백과 null데이터가 전달되면 요청을 거절하게 됩니다.
//필수가 아닌 파라미터는 required = false속성을 지정하면 됩니다.
//필수가 아닌 파라미터인 경우에는 null or ""을 지정하게 되는데 defaultValue으로 기본값을 줄 수 있습니다.
System.out.println(name);
System.out.println(age);
System.out.println(list.toString());
return "request/ex02_ok";
}
# 커맨드객체(VO)를 통한 처리
*폼 태그의 값을 받아 처리할 수 있는 (VO) Class생성, 변수명을 폼 태그의 이름들과 일치하게 생성
//3nd - 커맨드 객체를 통해서 맵핑 (넘어오는 데이터의 name과 setter명이 같아야 합니다.)
@RequestMapping("/doAction")
public String doAction(ReqVO vo) {
System.out.println(vo.toString());
return "request/ex02_ok";
}
*폼 태그
<form action="doAction" method="post">
이름:<input tpye="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>
*ReqVo.java
package com.simple.command;
import java.util.List;
public class ReqVO {
private String name;
private int age;
private List<String> inter;
public ReqVO(String name, int age, List<String> inter) {
super();
this.name = name;
this.age = age;
this.inter = inter;
}
@Override
public String toString() {
return "ReqVO [name=" + name + ", age=" + age + ", inter=" + inter + "]";
}
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;
}
}
< Model 전달자 >
*콜바이 레퍼런스 개념이 사용된 것
* Model 객체가 가장 많이 사용됨.
# Model객체 = (ModelMap)
//result01요청 - model객체
@RequestMapping("/result01")
public String result01(Model model) {
model.addAttribute("data", "홍길동"); //키, 값
model.addAttribute("serverTime", new Date());
return "response/result01";
}
*전달 받은 값 화면페이지(jsp) 에서 사용
${data }<br/>
${serverTime }<br/>
${} 은 EL 코드
# ModelAndView객체
//result02요청 - ModelAndView객체
@RequestMapping("/result02")
public ModelAndView result02() {
//뷰의 정보, data정보를 함께 저장할 수 있는 객체
ModelAndView mv = new ModelAndView();
mv.addObject("data", "홍길동");
mv.addObject("name", "이순신");
mv.setViewName("response/result02");
return mv;
}
#.@ModelAttribute 어노테이션
* 전달받은 파라미터를 Model에 담아서 화면까지 전달하려 할 때 사용되는 어노테이션입니다.
* 받을 값이 단일이냐 객체냐에 따라 방식이 조금 다름.
ex) @ModelAttribute("받을값") 사용할 변수
-기억해둘 포인트
@ModelAttribute("num") String aaa
@ModelAttribute("article") ReqVO vo
받아온 값 aaa, vo 를 num 이나 article 이라는 이름으로 보내는 페이지로 값을 보내준다는 점. 잘 기억해두기
*요청
<a href="result03?num=10">modelAttr단일값</a>
<form action="result04" method="post">
<input type="type" name="name">
<input type="type" name="age">
<input type="submit" valu="modelAttr객체">
</form>
*컨트롤러
//@ModelAttribute = request + model
@RequestMapping("/result03")
public String result03(@ModelAttribute("num") String aaa) {
System.out.println("화면데이터:" + aaa);
return "response/result03";
}
@RequestMapping("/result04")
public String result04(@ModelAttribute("article") ReqVO vo) {
//요청에서 받아온 값을 article 이라는 이름으로 받아서 다시 전달해준다는 의미.
System.out.println("화면데이터:" + vo.toString());
return "response/result04";
}
*응답
result03화면<br/>
넘어온값: ${num}
result04화면<br/>
넘어온값:${article.name } , ${article.age }
#Redirect
*mvc 에서 Redirect를 사용하는 경우는 갖고있는 값을 다 버리고 새롭게 원하는 화면으로 강제로 이동할 때 사용.
( 리다리엑트는 기본적으로 갖고있는 데이터를 다 버린다.)
- 단,
redirectAttribute는 redirect시에 1회성 데이터를 저장할 수 있습니다.
*스프링에 기본 방식은 forward(값을 갖고 가는것) redirect는 갖고있는 값을 다 버리고 다시 컨트롤러를 통해서 이동시킴.
* return "redirect:/req_01"; 이렇게 리다이렉트 콜론 뒤에 절대경로(/로시작)로 경로를 반환해준다.
★ redirect는 model 객체를 사용할 수 없기 때문에 막 쓰는것이 아님. 컨트롤러를 태워서 화면을 이동시켜줄 때 사용.
# RedirectAttributes 객체 (Redirect 와 연계해서 같이 잘 알아두기)
*리다이렉트 이동시 파라미터 값을 전달하는 방법
ex) addFlashAttribute()
*맵핑해주는 메서드의 매개변수에 RedirectAttibutes 객체를 받아줌.
메서드 구현부에서 RedirectAttributes의 addFlashAttribute("키" , 값); 이렇게 일회성 데이터를 담아주면 됨.
Redirect 와 RedirectAttributes 객체 사용
//로그인요청
@RequestMapping(value = "/login", method=RequestMethod.POST)
public String login(@RequestParam("id") String id,
@RequestParam("pw") String pw,
RedirectAttributes ra) {
//로그인 성공 -> home화면으로
if(id.equals(pw)) {
ra.addFlashAttribute("msg","어서와"); // 1회성 데이터
return "redirect:/"; //다시 home 컨트롤러를 태워 보냄 - model을 사용할 순 없음
//로그인 실패
} else {
ra.addFlashAttribute("msg", "틀렸는데요?ㅋ");
return "redirect:/response/redirect_login"; //"redirect:/절대경로"
}
}
#EL에 관한 내용
#JSTL에 관한 내용
<기억할것>
*이클립스에서 서버를 다시 껐다 켜야 하는 경우는
파일이 새로 생기거나 설정이 바뀌었을 때.
*자바 파일이 변경되었을 때는 자동으로 리렌더링 된다.
#컨텍스트 패스 변경
*localhost:8282/controller
위에서 controller 가 컨텍스트 패스임. (컨텍스트 패스란? 서버에서 프로젝트를 구분하는 경로)
*porm.xml 파일
'자바 Spring' 카테고리의 다른 글
23-02-03) 7-1강 스프링 DB 연동 (MySQL , oracle) (0) | 2023.02.03 |
---|---|
23-02-02) spring 6강 - 스프링 MVC웹서비스) 1.웹 어플리케이션 구조2.Service, DAO 계층 구조3.Service 구현4.DAO 구현 / MySQL 다운로드 (0) | 2023.02.02 |
23-01-31) 4강 JSP에 스프링조립하기 (1) | 2023.01.31 |
23-01-31) 3강 스프링 MVC웹서비스 (0) | 2023.01.31 |
23-01-31) 의존객체 자동 주입, XML 파일을 Java 파일로 변경하기 (0) | 2023.01.31 |
- Total
- Today
- Yesterday
- 내포 클래스
- 자바#자바수강기록
- 조건문
- JS ES6 문법
- 강남 중앙정보처리학원
- 국비지원 학원 수업 내용
- input 스트림
- 데이터베이스 수업
- 자바 api
- 가비지 콜렉팅
- 오코노라멘
- 중앙정보처리학원
- output 스트림
- 배열 삭제
- 다중 반복문
- FOR문
- 국비학원 수업
- 국비학원
- 자바스크립트 ES6 문법
- 배열과 탐색
- 박문석 선생님
- 배열의 정렬
- 자바
- 박인욱 강사님
- interface #자바
- api 활용
- 자바수업
- 강남역 12번 춣구
- nasted class
- 알람 시계 문제
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |