Controller의 리턴타입
String
jsp를 이용하는 경우에는 jsp 파일의 경로와 파일이름을 나타내기 위해서 사용
void
호출하는 URL과 동일한 이름의 jsp를 의미
VO, DTO 타입
주로 JSON 타입의 데이터를 만들어서 반환하는 용도로 사용 (추가적인 라이브러리 필요).
ResponseEntity 타입
response할 때 Http 헤더 정보와 내용을 가공하는 용도로 사용 (추가적인 라이브러리 필요).
Model, ModelAndView
Model로 데이터를 반환하거나 화면까지 같이 지정하는 경우에 사용 (최근에는 많이 사용하지 않습니다.).
HttpHeaders
응답에 내용 없이 Http 헤더 메시지만 전달하는 용도로 사용
---
컨트롤러의 리턴타입에 대해 알아보자
@Log4j2
@NoArgsConstructor
@RequestMapping("/return/")
@Controller
public class ReturnTypesController {
// 1. void return type
@GetMapping("/void")
public void returnVoid() {
log.trace("returnVoid() invoked.");
// 뷰 이름 -> Request URI (Base URI + Detail URI)임
} // returnVoid
// 2. String return type
@GetMapping("/String")
public String returnString() {
log.trace("returnString() invoked.");
return "return/string"; // /WEB-INF/views + return/string + .jsp
} // returnString
// 2-1. String return type : "redirect:" keyword
@GetMapping("/redirect")
public String returnRedirect() {
log.trace("returnRedirect() invoked.");
// 307 리다이렉션 응답전송을 의미 (뷰가 호출되는게 아니고 응답이 나옴)
return "redirect:/return/void";
// return "redirect:/void"; // OK : Base URI를 생략해도 문제없음
// return "redirect:http://naver.com"; // OK : 외부 URL로 리다이렉트 수행
} // returnRedirect
// 2-2. String return type : "forward:" keyword
@GetMapping("/forward")
public String returnForward() {
log.trace("returnForward() invoked.");
// Servlet에서 우리가 직접 Request Forwarding 수행시 코드는 아래와 같습니다
// 잘 기억해보세요
// ReqeustDispatcher dispatcher = request.getRequestDispatcher(target_url);
// dispatcher.forward(request, response);
// return "forward:/WEB-INF/views/return/void.jsp";
// return "forward:/return/void"; // OK : 어떤 것이든 우리가 만든 컨트롤러 핸들러로 요청을 떠 넘기는 경우
// return "forward:/void"; // OK : Base URI를 생략해도 문제없음
// return "forward:/http://naver.com"; // XX : 리다이렉트와 달리 외부 URL은 허용하지 않음
return "forward:/board/basicGet"; // OK : 같은 웹어플리케이션 내의 다른 컨트롤러 핸들러에 (SampleControler2 참고)
} // returnForward
// 3. Object return type using @ResponseBody
@GetMapping("/ResponseBody")
public @ResponseBody SampleDTO returnResponseBody(
@NonNull @RequestParam("name") String NAME,
@NonNull @RequestParam("age") Integer AGE
) {
log.trace("returnResponseBody({}, {}) invoked.", NAME, AGE);
SampleDTO dto = new SampleDTO();
dto.setName(NAME);
dto.setAge(AGE);
log.info("\t+ dto : " + dto);
// 반환할 자바객체를 표현가능한 문서형식 (JSON/XML)으로 변환해서 응답메시지의 바디에 넣어서 전달해줘야한다.
// 그래야 409 오류 (Not Acceptable)가 발생하지 않습니다.
// 하지만 이를 위해서는 소위 변화 라이브러리(==Data-binding libraries)가 필요합니다.
// 스프링에서 가장 많이 사용하는 Data-binding 라이브러리로 Jackson 계열의 라이브러리를 사용합니다.
// 이 라이브러리를 pom.xml에 추가해 줍니다. (자바객체 -> JSON/XML로 변환)
return dto; // 일반 참조타입의 자바객체를 반환하는 경우
} // returnResponseBody
// 4. Return type ResponseEntity
@GetMapping("/ResponseEntity")
public ResponseEntity<String> returnResponseEntity() {
log.trace("returnResponseEntity() invoked.");
// String json = "{'name': 'Yoseph', 'age': 23 }";
// 위에는 하드코딩, 우리는 객체를 만들어서 해보자
// SampleDTO dto = new SampleDTO();
// dto.setName("John");
// dto.setAge(32);
Person person = new Person(); // Person 클래스는 맨 밑을 확인하세요
Gson gson = new Gson();
String json = gson.toJson(person);
log.info("\t+ json : {}", json);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json; charset=utf8");
return new ResponseEntity<>(json, headers, HttpStatus.OK);
} // returnResponseEntity
} // end class
class Person {
private String name = "John";
private Integer age = 32;
private Double height = 180.3;
private Double weight = 83.5;
private String[] hobby = { "운동", "영화", "음악", "게임" };
public String sayHello() {
return "Hello";
} // sayHello
} // Person
ReturnTypesController.java
---
*JSON : JavaScript Object Notation
자바스크립트 객체를 문자열로 표현한 것
---
* Gson Library의 용도
1) 자바객체 -> Serialize -> JSON 문자열로 변환
2) JSON 문자열 -> De-serialize -> 자바객체로 변환
---
파일업로드 처리
(서블릿에서 배운 @MultipartConfig(각종 파일 업로드 제약설정)과 같은 개념!)
Servlet 3.0이후(Tomcat 7.0)에는 기본적으로 업로드 되는 파일을 처리할 수 있는 기능이 추가
별도로 commons-fileupload 라이브러리 등을 사용
@Log4j2
@NoArgsConstructor
@RequestMapping("/fileupload/")
@Controller
public class FileUploadController {
// Mapping URI : /fileupload/page
@GetMapping("/page")
public void fileUploadPage() {
log.trace("fileUploadPage() invoked.");
} // fileUploadPage
@PostMapping("/doit")
public void DoFileUpload( @NonNull MultipartFile[] parts) {
log.trace("DoFileUpload() invoked.");
log.info("\t+ parts : {}", parts);
} // DoFileUpload
} // end class
FileUploadController.java
servlet-context.xml에 아래 내용 추가해주자
<view-controller path="/fileupload/page" view-name="fileUploadPage" status-code="200" />
이렇게 추가하면 메소드 주석으로 막아도 servlet-context.xml에 추가해주면 정상 실행된다!
그러나 이 경우 RequestMappings에 보이지 않는다. 둘중에 맘에 드는 것 골라서 쓰자
jsp 파일을 만들어주자
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>File Upload</title>
</head>
<body>
<h1>WEB-INF/views/fileupload/page.jsp</h1>
<hr>
<form action="/fileupload/doit" method="POST" enctype="multipart/form-data">
<div> Name : <input type="text" size="10" name="myName"> </div>
<div> Age : <input type="text" size="5" name="myAge"> </div>
<br>
<div>1. <input type="file" name="files"></div>
<div>2. <input type="file" name="files"></div>
<div>3. <input type="file" name="files"></div>
<div>4. <input type="file" name="files"></div>
<div>5. <input type="file" name="files"></div>
<br>
<div><input type="submit" name="Upload"></div>
</form>
</body>
</html>
page.jsp
servlet-context.xml에 아래 내용 추가해주자
<beans:bean
id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="defaultEncoding" value="utf8"/>
<beans:property name="maxInMemorySize" value="10485760"/>
<beans:property name="maxUploadSize" value="10485760"/>
<beans:property name="maxUploadSizePerFile" value="2097152"/>
<beans:property name="preserveFilename" value="true"/>
<beans:property name="uploadTempDir" value="file:///C:/Temp"/>
</beans:bean>
FileUploadController.java
내일 이어서 해보자
---
'국비학원' 카테고리의 다른 글
[국비지원] KH 정보교육원 102~106일차 (0) | 2022.08.31 |
---|---|
[국비지원] KH 정보교육원 101일차 (0) | 2022.08.22 |
[국비지원] KH 정보교육원 99일차 (0) | 2022.08.18 |
[국비지원] KH 정보교육원 98일차 (0) | 2022.08.17 |
[국비지원] KH 정보교육원 97일차 (0) | 2022.08.16 |