스프링 컨트롤러에서 파라미터 받는 여러 방법

2022. 1. 14. 08:45Framework

반응형

로그인 할 때 컨트롤러로 넘어가는 키 값은 id와 pwd

<form action="login.me" method="post">
        <div>
            <label for="userId">ID :</label>
            <input type="text" name="id"> <br>
            <label for="userPwd">Password:</label>
            <input type="password" name="pwd">
        </div>

        <div class="loginFooter">
            <button type="submit">로그인</button>
            <button type="button">취소</button>
        </div>
 </form>

 

// 1. HttpServletRequest를 이용해서 전달받는 방법
//    파라미터에 HttpServletRequest를 기술해야 함

@RequestMapping("login.me")
public String loginMember(HttpServletRequest request) {

    String userId = request.getParameter("id");
    String userPwd = request.getParameter("pwd");

    System.out.println("ID : " + userId);
    System.out.println("PWD : " + userPwd);

    return "main";
}
// 2. @RequestParam 어노테이션을 이용하는 방법
//    request.getParameter("키"):밸류의 역할을 대신해주는 어노테이션

@RequestMapping("login.me")
public String loginMember( @RequestParam(value="id") String userId,
                    	   @RequestParam(value="pwd") String userPwd ) {

     System.out.println("ID : " + userId);
     System.out.println("PWD : " + userPwd);

     return "main";
}
// 3. @RequestParam 어노테이션을 생략하는 방법
//    넘어오는 키값 똑같이 매개변수에 적어주면 알아서 받아줌

@RequestMapping("login.me")
public String loginMember(String id, String pwd) {

    // System.out.println("ID : " + id);
    // System.out.println("PWD : " + pwd);

    Member m = new Member();
    m.setUserId(id);
    m.setUserPwd(pwd);

    return "main";
}

 


 

<form action="login.me" method="post">
        <div>
        	// 4번째 방법을 이용하기 위해서는 "키값이 반드시 vo객체의 필드명과 같아야 함"
            <label for="userId">ID :</label>
            <input type="text" name="userId"> <br>
            <label for="userPwd">Password:</label>
            <input type="password" name="userPwd">
        </div>

        <div class="loginFooter">
            <button type="submit">로그인</button>
            <button type="button">취소</button>
        </div>
 </form>

 

// 4. 커맨드 객체 방식
//    스프링컨테이너가 해당 객체를 기본생성자로 생성 후 
//    setter메소드 찾아서 요청 시 
//    전달값을 해당 필드에 담아주는 내부적인 원리

@Autowired	// di(의존성주입)
private MemberService mService;

@RequestMapping("login.me")
public String loginMember(Member m, Model model, HttpSession session) {

    // 아이디와 비밀번호의 키값을 필드명과 동일하게 변경!

    // System.out.println("ID :" + m.getUserId());
    // System.out.println("PWD: " + m.getUserPwd());

    Member loginUser = mService.loginMember(m);

    /*
     * request가 존재하지 않는데 어떻게 응답데이터를 request, session스코프에 담나여?
     * 요청 처리 후 응답페이지로 포워딩 또는 url 재요청, 응답데이터 담는 법
     * 
     * 스프링에서 제공하는 Model객체(=requestScope)를 사용!
     * 필요한 객체가 있다면 매개변수에 얼마든지 추가하면 됨
     * 포워딩할 뷰로 전달하려는 데이터를 맵형식(key-value)을 담을 수 있는 영역
     * serAttribute가 아닌 addAttribute메소드 이용
     */

    if(loginUser == null) {
        // 로그인 실패 => 에러문구를 requestScope에 담고 에러페이지로 포워딩
        model.addAttribute("errorMsg", "로그인 실패");
        return "common/errorPage"; // 포워딩할 뷰를 return
    } else {
        // 로그인 성공 => loginUser를 sessionScope에 담고 메인페이지url 재요청
        // session스코프에 담으려면 HttpSession session 필요 (매개변수에 추가)
        session.setAttribute("loginUser", loginUser);
        return "redirect:/"; // redirect:는 url재요청. /를 붙이면 메인페이지 재요청
    }
}

 

포워딩할 뷰를 return할 때

전체 경로를 작성해주지 않아도 되는 이유는

servlet-context.xml에 기술되어 있다

prefix의 밸류는 /WEB-INF/views/

suffix의 밸류는 .jsp로 등록되어있기 때문에

그 사이의 경로만 적어주면 끝

 

/*
 * Model객체와 return으로 포워딩하는 방법과 비슷한 다른 방법
 * 스프링에서 제공하는 ModelAndView객체를 이용하는 방법
 * 
 * Model은 데이터를 key-value세트로 담을수 있는 공간이라고 한다면
 * view는 응답뷰에 대한 정보를 담을 수 있는 공간
 */
@RequestMapping("login.me")
public ModelAndView loginMember(Member m, HttpSession session, ModelAndView mv) {

    Member loginUser = mService.loginMember(m);

    if(loginUser == null) {
        // 로그인 실패 => 에러문구를 requestScope에 담고 에러페이지로 포워딩
        mv.addObject("errorMsg", "로그인 실패");
        mv.setViewName("common/errorPage");

    } else {
        // 로그인 성공 => loginUser를 sessionScope에 담고 메인페이지url 재요청
        session.setAttribute("loginUser", loginUser);
        mv.setViewName("redirect:/");
    }

    return mv;
}
반응형