Spring/Legacy
Controller in Legacy Package
by pms93
2022. 10. 18.
package com.ms.cf.member;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.ms.cf.HomeController;
import com.ms.cf.service.RegistService;
@Controller
public class MemberController {
// '/'요청이 들어오게 되면 컴파일러는 web.xml을 읽어들이면서 servlet-mapping을 시작한다.
// 위 동작이 실행되면서 DispatcherServlet은 servlet-context.xml을 읽어들이고 annotation-driven, base-package 설정에 따라 annotation과 component scan을 시작한다.
// (* component-scan시에 읽어들여진 class들은 Autowired가 가능해진다.)
// (* component - bean의 총괄 개념이며 Controller, Service, Repository 등이 있다.)
// 이후 클라이언트 요청은 servlet-context.xml의 viewResolver객체의 설정에 따라 서버가 응답을 주게 된다.
@Autowired RegistService regSvc; // RegistService regSvc = new RegistService(); 와 동일
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
// RequestMapping의 속성이 value가 유일하다면 'value = '는 생략 가능하다.
// value에 명시된 문자열과 return될 문자열이 동일하다면 return은 생략이 가능하다.
// 별도의 데이터 전송방식(GET, POST)이 명시되어 있지 않으면 두 요청 모두 받아 처리한다.
@RequestMapping("/index")
public void index() {}
/*
@RequestMapping("/index")
public String index() {
return "index";
// 위 메서드와 동일한 동작을 한다.
}
*/
@RequestMapping("/")
public void logger(Locale locale) {
// logger
// - System.out.println(); 과 비슷한 개념이며 log를 남길 때 사용한다.
logger.info("Welcome home! The client locale is {}.", locale);
}
// Mapping 종류에 따라 메서드를 구분지을 수 있다.
// GetMapping : GET요청만 처리
// PostMapping : POST요청만 처리
// 버전에 따라 Get, PostMapping은 동작하지 않을 수도 있다. (하위버전 해당)
@GetMapping("login")
public void login() { System.out.print("로그인 페이지 처리\n"); }
@PostMapping("login")
public String login(String id, String pw, Model model, RedirectAttributes ra) {
// URL parameter name과 method parameter name이 동일하면 spring이 알아서 매칭해서 데이터를 넣어준다.
// 단!! Model과 RedirectAttributes같은 경우 페이지 자체의 reloading이 일어나지 않는 이상 사용이 불가하다.( ex. ajax(비동기통신)시에 사용 불가)
System.out.println("로그인 페이지에서 입력한 데이터를 받아서 처리");
System.out.print("아이디 : " + id + "\n비밀번호 : " + pw + "\n");
if (id.equals("admin") && pw.equals("1234")) {
// return ,forward, redirect
// * return
// - 반환값과 일치한 jsp를 찾아가 해당 결과물을 client에게 준다.
// * forward
// - 반환값과 mapping의 value가 일치한 method를 찾아가 실행한다.
//
// * redirect (* redirect란, http프로토콜로 정해진 규칙으로 서버가 클라이언트에게 특정 url로 이동하라는 응답을 보내는 것을 의미한다.)
// - server가 client에게 반환한 값을 client는 server에게 재요청하여 URL 이동을 하게끔 한다.
// - redirect의 경우 각각의 요청이 실행될 때 마다 Client와 Server(WAS)간 새로운 요청이 생성되는 것이므로 항상 새로운 request, response객체가 생성된다는 특징이 있다.
//
//
// *주의 : return과 forward는 URL이동 요청이 아닌 반환값과 일치한 jsp의 결과물을 client에게 뿌려주는 개념이다.
// 단 a tag 혹은 event로 인한 location.href 등 이로 인해 메서드가 실행된 경우는 URL이동 요청이 된다.
// model
// - model은 한단계의 client요청까지만 유효하다. (redirect후 혹은 다른 요청이 온 이후로는 사용 불가)
// - redirect후에 특정 데이터를 유지할 필요가 있다면 RedirectAttributes 객체를 사용한다.
// ex) RedirectAttributes ra
// ra.addFlashAttribute("attributeName", "attributeValue");
// model.addAttribute("msg", "로그인 성공");
ra.addFlashAttribute("msg", "로그인 성공ㅋㅋ");
// return "index";
// return "forward:index";
return "redirect:index";
}
model.addAttribute("msg", "로그인 실패");
return "login";
}
@GetMapping("register")
public void register() {}
@PostMapping("register")
public String register(MemberDTO member, String confirmPw, Model model) {
if (!member.getPw().equals(confirmPw)) {
model.addAttribute("msg", "입력하신 두 비밀번호가 다릅니다.");
return "register";
}
regSvc.regist(member);
return "redirect:index";
}
// @PostMapping("register")
// public String register(MemberDTO member, String confirmPw, Model model, RedirectAttributes ra) {
// if (!member.getPw().equals(confirmPw)) {
// model.addAttribute("msg", "입력하신 두 비밀번호가 다릅니다.");
// return "register";
// }
//
// ra.addFlashAttribute("msg", "회원가입 성공");
// System.out.println("아이디 : " + member.getId());
// System.out.println("비밀번호 : " + member.getPw());
// System.out.println("이름 : " + member.getName());
// System.out.println("전화번호 : " + member.getMobile());
//
// return "redirect:index";
// }
// @PostMapping("register")
// public String register(@RequestParam(value = "id") String i,
// @RequestParam(value = "pw") String p,
// @RequestParam(value = "name") String n,
// @RequestParam(value = "mobile") String m) {
//
// // @RequestParam(value = "tagName")
// // - 매개변수명과 tag의 name이 일치하지 않으나 값을 넣어주고 싶은 경우 사용한다.
//
// return null;
// }
// @PostMapping("register")
// public String register(HttpServletRequest req) {
// String id = req.getParameter("id"), pw = req.getParameter("pw"), name = req.getParameter("name"), mobile = req.getParameter("mobile");
//
// // HttpServletRequest
// // - jsp에서 사용했던 내장객체 request를 사용할 수 있게 해준다.
//
// return null;
// }
@RequestMapping("list")
public void list(Model model) { model.addAttribute("memberList", regSvc.getMembers()); }
}