💡 핵심 요약 (TL;DR)
redirect나forward로 페이지이동하기, JSON데이터처리하기의 동작 원리를 이해하고 실제 프로젝트에 적용하기 위한 실무 가이드다.
* redirect: 또는 forward: 페이지이동 메서드에서 String 리턴시 주소 앞에 사용을 적용할 수 있다.
리턴타입 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);
@RequestMapping("/doE") public String doE(Model model) { logger.info("doE()호출"); return "redirect:/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);
@RequestMapping("/doE") public String doE(Model model, RedirectAttributes rttr) { logger.info("doE()호출"); rttr.addFlashAttribute("msg", "flash!"); addFlashAttribute 사용 return "redirect:/doF"; } @RequestMapping("/doF") public void doF(@ModelAttribute("msg") String msg) { logger.info("doF()호출"); } }
|
1 2 3 4
| 메세지(키값 msg) : ${msg }<br>
//출력값 메세지(키값 msg) : flash!
|
데이터를 JSON으로 변경한 뒤 파라미터 전달하기
- JSON데이터로 만들기 순서
- 라이브러리 복붙
- doJSON()메서드 생성
Jackson Databind 라이브러리 추가
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
|
public class ProductVO { private String name; private double price; public ProductVO() {}; public ProductVO(String name, double price) { this.name = name; this.price = price; }; 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; } @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);
@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}
|
#TILITWILL(JAVA)