여기서는 저번에 생성한 프로젝트를 바탕으로
기본적인 패턴을 연습삼아 만들어 보도록 하겠다.
밑의 product를 먼저 이야기하자면
private int pid; // 상품아이디
private String pname; // 상품 이름
private int price; // 상품 가격
이런 형태의 모델 클래스이다.
getter/setter와 생성자는 길어서 뺏다.
저번에 만든 컨트롤러 클래스에서 controller를 만들었다.
코드는 아래와 같다.
@Controller
public class controller {
// 1
private static final Logger logger = LoggerFactory.getLogger(controller.class);
// 2
@RequestMapping(value = "/")
public String test(){
logger.debug("디버그 로그");
logger.warn("경고 로그");
logger.error("에러 로그");
return "index";
}
// 3
@RequestMapping(value = "/product", method = RequestMethod.GET)
public String productGet() {
logger.info("productGet() 호출");
return "product-form";
}
// 4
@RequestMapping(value="product", method= RequestMethod.POST)
public String productPost(@ModelAttribute("prod") Product p) {
logger.info("productPost() 호출");
logger.info("pid: {}",p.getPid());
logger.info("pname: {}",p.getPname());
logger.info("price: {}",p.getPrice());
return "product-result";
}
}
1은 logger를 만든 것이다.
지난번에 logger를 pom에 추가하고 성공적으로 만들었다면
무난하게 생성이 가능할 것이다.
이 logger 변수를 통해 로그를 찍어 낼 수 있다.
@RequestMapping 에서 value 를 통해 주소를 알려주고 return을 통해 product-form.jsp 를 get 방식으로 호출한다.
웹 컨텐트 아래 호출할 jsp는 미리 만들어둔다.
/product 를 호출해서 product-form을 호출해낸 모습이다.
이 페이지의 폼은 아래 코드와 같다.
<h1>상품 등록 페이지</h1>
<form action="product" method="post">
<input type="number" name="pid" placeholder="상품아이디"/>
<br/>
<input type="text" name="pname" placeholder="상품이름"/>
<br/>
<input type="number" name="price" placeholder="상품 가격"/>
<br/>
<input type="submit" value="상품 등록"/>
</form>
폼은 post 방식으로 데이터를 다시 product에 돌려주고 있다.
위에서 본 봐와 같이
컨트롤러에 @RequestMapping의 value product, 호출방식을 post로 코드를 짜준다.
@RequestMapping(value="product", method= RequestMethod.POST)
public String productPost(@ModelAttribute("prod") Product p) {
logger.info("productPost() 호출");
logger.info("pid: {}",p.getPid());
logger.info("pname: {}",p.getPname());
logger.info("price: {}",p.getPrice());
return "product-result";
}
@ModelAttribute는 addAttribute를 어노테이션 방법으로 매개변수에 구현한 내용이다.
Product 클래스만 구현되어 있다면 자동으로 객체를 생성해서 자동으로 넣어준다
단 Product의 변수 이름과 위의 form의 name이 같아야 넣어줄 수 있다.
로그로 데이터를 확인하고
product-result로 데이터를 념겨주는 동시에, product-result.jsp 를 호출해준다.
<h1>상품 등록 결과</h1>
상품 코드: ${prod.pid}<br/>
상품 이름: ${prod.pname}<br/>
상품 가격: ${prod.price}<br/>
product-result.jsp 의 경우 이러한 코드이다.
위에서 설정한 어트리뷰트의 아이디로 별다른 설정없이 즉시 호출할 수 있다.
아래는 데이터의 입력화면과, 결과 값이다.
Spring의 첫 클래스를 구현해봤다.
다음으로 리다이렉트를 간단하게 연습해보자
Spring에서 아주 간편하게 활용이 가능하다.
@RequestMapping(value = "/temp")
public String doRedirect(){
logger.info("doRedirect() 호출");
logger.info("/로 리다이렉트");
// return "redirect: 이동할 주소";
return "redirect:/";
}
/temp로 접근했을 때 / 주소로 바로 리다이렉트가 가능하다
/ 대신 http://www.daum.net을 적는다면 다음으로 바로 리다이렉트가 가능하다.
@RequestMapping(value = "/temp2")
public String doRedirect2(RedirectAttributes attr){
logger.info("doRedirect2() 호출");
attr.addAttribute("name","QWERTY");
// return "redirect:/page1?name=abc";
return "redirect:/page1";
}
또한 RedirectAttributes attr을 이용하여 데이터를 넣어 데이터를 보낼 수 있다.
이경우 받는 곳에서 (이 경우에는 page1)을 getAttribute를 통해 호출해야한다.
주석에서 처리했듯이 get방식으로 데이터를 보내는 것도 가능하다.
@RequestMapping(value="/page2")
public String page2(HttpServletRequest req) {
String name = (String)req.getAttribute("name");
logger.info("page2(): name = " + name);
return "page1";
}
HttpServletRequest를 생성하여 그 안에 데이터를 넣어 보낼 수도 있다.
이 경우는 servlet-api 라이브러리의 추가가 필요하다.
우리는 pom.xml에서 다 설정햇으니 문제가 없지만
혹시 없어서 에러가 난다면 톰캣 라이브러리를 확인하도록 하자.
톰캣 라이브러리 안에 servlet-api.jar가 있을테니 그 것을 프로젝트 스트럭쳐에서 포함시켜주고 아티펙트에서 추가해주면 된다.
'프로그래밍 > Web-Spring' 카테고리의 다른 글
junit을 통한 테스트 클래스 만들기 (0) | 2017.11.15 |
---|---|
@ResponseBody, jackson-databind 라이브러리 활용 (0) | 2017.11.15 |
intelliJ에서 SpringMVC 생성하기 (0) | 2017.11.15 |