보라코딩

코드로 배우는 스프링 웹 프로젝트 Part2 본문

코딩/Spring

코드로 배우는 스프링 웹 프로젝트 Part2

new 보라 2023. 1. 29. 22:04

 

 

 

 

http://localhost:8080/sample/ex01?name=AAA&age=32

톰캣 실행 후에 이렇게 보내면 HTTP상태는 404 찾을 수 없음이 나오지만 (보이는 화면 설정안해줘서)

Console에는 아래와 같이 값을 받음을 알 수 있다.

INFO : org.zerock.controller.HomeController - Welcome home! The client locale is ko_KR. INFO : org.zerock.controller.SampleController - SampleDTO(name=AAA, age=32) WARN : org.springframework.web.servlet.PageNotFound - No mapping for GET /favicon.ico INFO : org.zerock.controller.SampleController - SampleDTO(name=AAA, age=32)
 

The type List is not generic; it cannot be parameterized with arguments <SampleDTO>
 
List에 갑자기 빨간줄이 쳐져 있었고 import는 되어있어서 왜지? 생각했는데
너무 간단하고 어이없는 오류였다..

import 된 List가 import java.util.List; 이 아니였다..........
util이 아닌 awt인지 확인할 것!!
 

 

 

 
 
아래와 같이 실행하면 (SampleDTOList 에 객체 리스트 생성하기)

http://localhost:8080/sample/ex02Bean?list%5B0%5D.name=bora&list%5B2%5D.name=dory

** 참고 [ 대신에 %5B 넣고 ]  대신에 %5D 넣음

 

결과값

INFO : org.zerock.controller.SampleController - list dtos : SampleDTOList(list=[SampleDTO(name=bora, age=0), SampleDTO(name=null, age=0), SampleDTO(name=dory, age=0)])

 

 

http://localhost:8080/sample/ex03?title=test&dueDate=2023/01/29

이렇게 실행시

 

아래와 같이 log 찍힘INFO : org.zerock.controller.SampleController - todo : TodoDTO(title=test, dueDate=Sun Jan 29 00:00:00 KST 2023)

 

SampleController 연습한 내용들

 

package org.zerock.controller;

import java.util.ArrayList;
import java.util.Arrays;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.zerock.domain.SampleDTO;
import org.zerock.domain.SampleDTOList;
import org.zerock.domain.TodoDTO;

import lombok.extern.log4j.Log4j;

@Controller
@RequestMapping("/sample/*")
@Log4j
public class SampleController {


@RequestMapping("")
public void basic() {
log.info("basic!");
}

@RequestMapping(value = "/basic", method = {RequestMethod.GET,RequestMethod.POST})
public void basicGet() {
log.info("basic get!");
}

@GetMapping("/basicOnlyGet")
public void basicGet2() {
log.info("basic get only get");
}

@GetMapping("/ex01")
public String ex01(SampleDTO dto) {
log.info("" + dto);

return "ex01";
}

@GetMapping("/ex02")
public String ex02(@RequestParam("name") String name, @RequestParam("age") int age) {

log.info("name : " + name);
log.info("age : " + age);

return "ex02";
}

@GetMapping("/ex02List")
public String ex02List(@RequestParam("ids")ArrayList<String> ids) {
log.info("ids : " + ids);

return "ex02List";
}

@GetMapping("/ex02Array")
public String ex02Array(@RequestParam("ids") String[] ids) {
log.info("array ids : " + Arrays.toString(ids));

return "ex02Array";
}

@GetMapping("/ex02Bean")
public String ex02Bean(SampleDTOList list) {
log.info("list dtos : " + list);

return "ex02Bean";
}

@GetMapping("/ex03")
public String ex03(TodoDTO todo) {
log.info("todo : " + todo);
return "ex03";
}
}

아직 공부 중

 

 

 
@Controller – 해당 클래스의 인스턴스를 스프링의 빈으로 등록하고 컨트롤러로 사용
        ㄴ <component-scan>과 같이 활용

 

@RequestMapping – 특정한 URI에 대한 처리를 해당 컨트롤러나 메서드에서 처리
Model 객체는 JSP에 컨트롤러에서 생성된 데이터를 담아서 전달하는 역할을 하는 존재
모델 2 방식에서 사용하는 request.setAttribute( )와 유사한 역할

 

** Model에 담는 데이터는 파라미터가 아니라 다른 곳에서 발생한(DB같은) 데이터를 담기 위한 용기

 

@ModelAttribute

컨트롤러에서 메서드의 파라미터는 기본자료형을 제외한 객체형 타입은 다시 화면으로 전달
 
@ModelAttribute는 명시적으로 화면에 전달되도록 지정
 

@RedirectAttribute

화면에 한번만 전달되는 파라미터를 처리하는 용도
내부적으로 HttpSession객체에 담아서 한번만 사용되고, 폐기

 

 


파일 업로드

 

maven fileupload 검색해서 pom.xml에 붙여넣기

 

servlet-context.xml에 아래 내용 붙여넣기

 

<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <beans:property name="defaultEncoding" value="utf-8"></beans:property>
    <!-- 1024 * 1024 * 10 bytes  10MB -->
    <beans:property name="maxUploadSize" value="104857560"></beans:property>
    <!-- 1024 * 1024 * 2 bytes  2MB -->
    <beans:property name="maxUploadSizePerFile" value="2097152"></beans:property>
    <beans:property name="uploadTempDir" value ="file:/C:/upload/tmp"></beans:property>
    <beans:property name="maxInMemorySize" value="10485756"></beans:property>
  </beans:bean>

  

SampleController에 아래 내용 쓰기

@GetMapping("/exUpload")
public void exUpload() {
log.info("exUpload!~~~!!");
}

 

 

src/main/webapp/WEB-INF/views폴더 안에 sample 폴더 만들고 그안에 exUpload.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>

 
<form action="/sample/exUploadPost"  method="post" enctype="multiPart/form-data">
 
 <div>
   <input type='file' name='files'>
 </div>
 <div>
   <input type='file' name='files'>
 </div>
 <div>
   <input type='file' name='files'>
 </div>
 <div>
   <input type='file' name='files'>
 </div>
 <div>
   <input type='file' name='files'>
 </div>
 <div>
   <input type='submit'>
 </div>   
</form>

</body>
</html>

 

 

톰캣 실행 후 

http://localhost:8080/sample/exUpload 여기로 들어가면 아래와 같은 화면이 뜬다.

 


이제 파일 제출하는 것을 연동하기 위해

 

SampleController에 아래 내용 붙여넣기

@PostMapping("/exUploadPost")
public void exUploadPost(ArrayList<MultipartFile> files) {

files.forEach(file -> {
log.info(file.getOriginalFilename());
log.info(file.getSize());
log.info(file.getContentType());
});
}

 

이후 파일 업로드 후 제출 누르면 화면은 아직 안만들어서 안뜨지만 로그 확인가능