SPRING

[TIL] 23.04.03 스프링

김짝 2023. 4. 3. 09:15

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 공부할것!!!!