[스프링SPRING]redirect나forward로 페이지이동하기, JSON데이터처리하기

리턴타입 String일 때 리턴값을 redirect: 또는 forward:줘서 페이지이동

  • redirect: 또는 forward: 페이지이동 메서드에서 String 리턴시 주소 앞에 사용
    • 리턴타입이 일반 string일때랑 redirect: 또는 forward형식의 String일때 차이가 있다.
    • return string은 jsp뷰페이지를 바로 가는 것
    • return redirect: 또는 forward:은 jsp 뷰페이지를 찾는 것이 아니라 메서드를 호출하는 것
    • 그리고 또 redirect와 forward도 차이가 있다
      • return "redirect:doF"; : 주소변경O, 페이지변경O
      • return "forward:doF"; : 주소변경X, 페이지변경O




다양한 값들을 객체에 넣어서 파라미터로 전달

  • 매개변수 객체에 데이터를 넣을 때 키값을 정하지 않고 value만 넣는 경우 자동으로 value의 데이터타입으로 전달된다.
    • 예를 들어 model.addAttribute("1234test")한 경우 string=1234test를 주소에 붙어서 전달
    • 다른 예로 model.addAttribute(132)인 경우 integer=132를 주소에 붙어서 전달
  • 자바코드
    • key와 value를 객체에 넣기 : model.addAttribute("msg", "4567test");
    • string을 객체에 넣기 : model.addAttribute("1234test");
    • int를 객체에 넣기 : model.addAttribute(132);
    • 객체생성해서 객체에 넣기 : model.addAttribute("msg", new ProductVO("moniter", 2000)); => 불가능
  • 입력한 주소 : http://localhost:8088/test/doE
  • 메서드에 따라 호출되는 페이지 : doF.jsp
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
@Controller
public class SampleController4 {

//로그정보 처리객체생성
private static final Logger logger = LoggerFactory.getLogger(SampleController4.class);

// 맵핑
// http://localhost:8088/test/doE
@RequestMapping("/doE")
public String doE(Model model) {
logger.info("doE()호출");

//model.addAttribute("msg", "4567test");
//model.addAttribute("1234test");//매개변수명을 지정하지 않으면 데이터타입으로 전달됨 string
//model.addAttribute(132);//매개변수명을 지정하지 않으면 데이터타입으로 전달됨 integer
//model.addAttribute("msg", new ProductVO("moniter", 2000)); //redirect로 파라미터 전달안됨
return "redirect:/doF"; //아래의 주소 호출하기 위해 사용
}

// http://localhost:8088/test/doF
@RequestMapping("/doF")
public void doF(@ModelAttribute("msg") String msg) {
logger.info("doF()호출");
}
}
  • doF.jsp 뷰페이지 코드 (공통코드)
    • 다양한 방법으로 파라미터 값을 가져와서 출력하려고 노력해보았다
    • key와 value를 객체에 넣은 경우 출력하기 : ${키_이름 }
    • string을 객체에 넣은 경우 출력하기 : ${param.integer }
    • int를 객체에 넣은 경우 출력하기 : ${param.string }`
    • 키값이 없는 경우에는 param.자동으로_지정된_파라미터명으로 가져와야한다. 왜냐하면 param데이터 영역안에 값이 들어있기때문이다.
    • 키값이 없는 경우 ${requestScope.자동으로_지정된_파라미터명 }를 사용해서 출력하려했으나 출력되지 않았다. 왜일까…? 강사님께 물어봤는데 자신도 찾아봐야겠다고하셨다…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<body>
<%
request.setCharacterEncoding("UTF-8");
%>
여기는 doF.jsp입니다.<br>
<h2>키값이 있는 파라미터 값 가져오기(객체는 안됨)</h2>
메세지(키값 msg) : ${msg }<br>
<hr>
<h2>키값이 없는 int 파라미터 값 가져오기</h2>
메세지(integer) : ${integer } 키값이 아니라서 안됨<br>
메세지(param.integer) : ${param.integer } 파람데이터영역에서 꺼내기때문에 가능<br>
메세지(requestScope.integer) : ${requestScope.integer } 왜 안 될까? <br>
<hr>
<h2>키값이 없는 String 파라미터 값 가져오기</h2>
메세지(string) : ${string } 키값이 아니라서 안됨<br>
메세지(param.string) : ${param.string } 파람데이터영역에서 꺼내기때문에 가능<br>
메세지(requestScope.string) : ${requestScope.string } 왜 안 될까? <br>

</body>




RedirectAttributes클래스 사용하여 파라미터 1회성으로 전달하기

  • rttr.addFlashAttribute("msg", "flash!"); : 주소줄에 안보임, El표현식가능, jsp표현식불가능, 새로고침하면 사라짐(즉 1회성 데이터)
    • 예를 들어 카운트를 올릴때 새로고침시 계속 조회수가 올라가는 것이 아니라 한번 올라가게끔 만들때 addFlashAttribute 사용
  • rttr.addAttribute("msg", "add!"); : 주소줄에 보임, El표현식가능, jsp표현식가능, 새로고침해도 그대로
  • 자바코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Controller
public class SampleController4 {

//로그정보 처리객체생성
private static final Logger logger = LoggerFactory.getLogger(SampleController4.class);

// http://localhost:8088/test/doE
@RequestMapping("/doE")
public String doE(Model model, RedirectAttributes rttr) {
logger.info("doE()호출");

rttr.addFlashAttribute("msg", "flash!"); //주소줄에 안보임, El표현식가능, jsp표현식불가능, 새로고침하면 사라짐(즉 1회성 데이터)
// rttr.addAttribute("msg", "add!"); //주소줄에 보임, El표현식가능, jsp표현식가능, 새로고침해도 그대로
addFlashAttribute 사용

return "redirect:/doF";
}

// http://localhost:8088/test/doF
@RequestMapping("/doF")
public void doF(@ModelAttribute("msg") String msg) {
logger.info("doF()호출");
}
}
  • doF.jsp 뷰페이지코드
1
2
3
4
메세지(키값 msg) : ${msg }<br>

//출력값
메세지(키값 msg) : flash!




데이터를 JSON으로 변경한 뒤 파라미터 전달하기

  • JSON데이터로 만들기 순서
    1. 라이브러리 복붙
    2. doJSON()메서드 생성




Jackson Databind 라이브러리 추가

  • Jackson Databind » 2.8.4 버전코드를 복사하여 프로젝트의 po,.xml에 붙여넣기
  • 복붙시 꼭 dependencies 태그 안에 위치시켜야한다.
1
2
3
4
5
6
7
8
9
(중략)
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.4</version>
</dependency>

</dependencies>




doJSON()메서드 생성

  • ProductVO.java 객체생성
    • 자바코드에서 사용할 json을 담을 객체를 만들어보자
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
32
33
34
//자바빈(DTO == VO)설계규약
//규칙1번 : public클래스
public class ProductVO {
//규칙2 : private로 멤버변수 생성
private String name;
private double price;

//규칙4 : 생성자(생략가능 - 생략하면 디폴트생성자)
public ProductVO() {};
public ProductVO(String name, double price) {
this.name = name;
this.price = price;
};

//규칙3 : getter setter메서드생성
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}

// 5. toString
@Override
public String toString() {
return "제품정보 [name=" + name + ", price=" + price + "]";
}
}
  • 자바코드
    • VO데이터를 JSON데이터로 변경시키기위해서 리턴타입앞에 @ResponseBody을 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Controller
public class SampleController5 {
//로그정보 처리객 체생성
private static final Logger logger = LoggerFactory.getLogger(SampleController5.class);

// 맵핑
// http://localhost:8088/test/doJSON
// 프레임워크를 사용하는 가장 큰 이유는 json데이터처리를 위해서.

//JSON데이터로 만들기 1.라이브러리 복붙 2.doJSON()메서드생성
@RequestMapping("/doJSON")
public @ResponseBody ProductVO doJSON() {
logger.info("doJSON 실행");

ProductVO vo = new ProductVO("radio", 1000);

return vo;
}
}
  • 뷰페이지 출력값
    • 뷰페이지(.jsp)를 따로 만들지않아도 서버를 통해 json데이터를 화면에서 볼 수 있다.
1
2
// 출력값
{"name":"radio","price":1000.0}

Comments