[TIL] 23.04.03 스프링
ModelAndView
ModelAndView : ModelAndView 는 request에 저장하기 위한 Model과 포워드하기위한 View를 합친것.
Controller의 메서드 안에서 사용한다.
ModelAndView mview = new ModelAndView();
//1. request에 저장.
mview.addObject("Java", 88);
mview.addObject("Spring", 100);
//2. 포워드(넘어가기)하기위한 View, result2.jsp로 넘어간다는 의미.
// return으로 foward를 하지않기 때문
mview.setViewName("result2");
return mview;
jsp로 넘기면 jstl의 경우 ${Java} 이런식으로 접근이 가능하다.
form과 controller에서의 데이터 전달
form태그의 액션부분에는 넘어가려는 페이지의 이름만 적는다.(잘모르겠으면 다 적어보고 어디가 겹치는지 확인해본다.)
Form에서 적은 정보들을(title, photo) Controller에서 받고 결과 페이지에 넘기기 위해 controller에서는 @GetMapping("여기에") form에서 action에적힌(넘길) 주소를적는다.
form에 입력한 정보들을 controller에서 받아오려면 메서드의 파라미터에 @RequestParam으로 가져온다.
@RequestParam String name, @RequestParam int age 이런식으로 파라미터에 넣어준다.
form에서의 name값과 controller의 메서드의 파라미터의 변수명이 같으면 위에처럼(@RequestParam String name, @RequestParam int age) 쓸수있고
다르면 @RequestParam(name = "password") String pwd 이런식으로 접근해야 합니다.
@RequestParam으로 넘긴값이 없을때 기본값으로 받을경우
@RequestParam(value = "msg", defaultValue = "HappyDay") 이렇게 default로 받아주면 400에러 안뜸
혹은파라미터에 이런식으로 @RequestParam(required=false) 준다.
Post방식은 @PostMapping()해준다
Controller의 메서드의 파라미터에 객체를 넘길수도있다.
@ModelAttribute TestDto dto 이런식으로 적어줘야하고
TestDto의 변수이름과, 폼의 이름이 같아야한다.
한글이 깨지면
web.xml에서 아래 코드 추가
<!-- encoding -->
<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>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
post인데 map으로 넘길경우
Controller의 파라미터에 아래처럼 넘기고.
@RequestParam Map<String, String> map
메서드 내에서 map을 get으로 가져와서 map.get("sang");
그 이후엔 ModelAndView방식대로 간다.
Model에 넣어줘서 넘긴다.
.jsp파일의 form의 action속성은 실제 보낼 jsp파일이름을 적는게 아니라
원하는 url 경로 이름을 보내는 것이다.(url이름, controller의 @GetMapping("이것"))
그후
controller의 맵핑에 action에적은 주소를 그대로 적는다.
파일업로드를 구현시 해야할 작업
스마트게시판을 쓸 경우 이전 model1방식의 프로젝트에서 사용하던 cos.jar를 추가해줘야함.
form에서 파일업로드를 위해 enctype="multipart/form-data" 속성을 추가해 줘야합니다.
그리고 pom.xml에 아래 링크의 의존성 코드를 추가합니다.
https://mvnrepository.com/artifact/commons-io/commons-io
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload/1.3.1
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
Controller에서 파일업로드 소스 분석
아래 코드 간단 개요 : form에서 submit버튼을 눌렀을때 컨트롤러에서 PostMapping으로 식별되어 아래 메서드가 실행되게 된다. form에서 입력한 제목과, 파일선택해서 넣은 이미지 파일을 받는다.
@PostMapping("/upload1")
public ModelAndView read1(@RequestParam String title,
@RequestParam MultipartFile photo,
HttpServletRequest request) {
ModelAndView model = new ModelAndView();
//업로드할 실제 경로
String path = request.getSession().getServletContext().getRealPath("/WEB-INF/image");
String fileName = photo.getOriginalFilename();//업로드한 파일명
//현재날짜와 시간을 이용해서 파일명 저장해보기(이름겹치지않게하기위함)
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
if(!fileName.equals("")) {
fileName = "photo_" + sdf.format(new Date()) + "_" + fileName;
//실제경로(path)에 업로드하기
try {
photo.transferTo(new File(path + "\\" + fileName));
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} else {
fileName="no";//업로드 안했을경우, 빈문자열이면
}
// /board/uploadresult1에서 접근하기 위함.
model.addObject("fileName", fileName);
model.addObject("title", title);
model.addObject("path", path);
//실제로 위의 코드들 수행하고 넘어갈 페이지
model.setViewName("/board/uploadresult1");
return model;
}
JSTL 공부할것!!!!