[Springboot] 폼(Form) 전송 및 RequestParam 변수 세팅

    폼(Form) 생성

    폼이란 데이터를 담아놓은 집합 같은 걸로 폼을 전송하게 되면 태그 안에 있는 데이터를 전송할 수 있게 된다. 물론 다른 폼에 있는 데이터를 가져올 수도 있지만 submit을 할 때 폼 자체를 전송하거나 폼 내부의 값들을 serialize하여 전송하는 경우가 대부분이다.

     

    springboot Form 전송 및 RequestParam 변수 세팅


    로그인폼(login.jsp)

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    
    <form name="loginForm" action="login/action">
    <table>
    	<tr>
    		<td>아이디</td>
    		<td><input type="text" name="id" value=""/></td>
    	</tr>
    	<tr>
    		<td>패스워드</td>
    		<td><input type="password" name="pwd" value=""/></td>
    	</tr>
    </table>
    <input type="submit" value="로그인" />
    </form>
    </body>
    </html>

    폼 파라미터 전송을 실습하기에는 로그인 만큼 좋은 것이 없을 것이다. 심플하게 테이블 코딩을 하였고, 값은 아이디와 패스워드가 존재하며, 실행은 login/action 경로로 값을 전달하게 된다.

     

    파라미터 처리 및 매핑

    LoginController.java

    파라미터를 처리하고 페이지를 매핑하는 용도로 loginController를 생성한다.

    package com.tistory.needneo;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    
    @Controller
    public class LoginController {
    	
    	private Logger logger = LoggerFactory.getLogger(LoginController.class);
    
    	/**
    	 * 로그인을 처리하는 메소드
    	 * 
    	 * @param id
    	 * @param model
    	 * @return
    	 */
    	@RequestMapping("/login/action")
    	public String loginAction(@RequestParam("id") String id, 
    						@RequestParam("pwd") String pwd, Model model) {
    		
    		model.addAttribute("id", id);
    		model.addAttribute("pwd", pwd);
    		
    		logger.info("id->" + id);
    		logger.info("pwd->" + pwd);		
    		
    		return "login";
    	}
    	
    	
    	/**
    	 * 로그인을 처리하는 메소드
    	 * 
    	 * @param id
    	 * @param model
    	 * @return
    	 */
    	@RequestMapping("/login")
    	public String login() {
    		return "login";
    	}
    }
    

    실습을 위해서 메소드를 우선 2개를 만들어 보았다. 우선 하단의 login메소드는 단순하게 login 페이지를 호출하는 용도의 메소드이고, 상단의 loginAction은 로그인값을 처리하는 목적의 메소드이다.

     

    loginAction에서 @RequestParam으로 아이디(id)와 패스워드(pwd)를 받는데 이렇게 선언을 할 경우 해당 파라미터가 전달되지 않을 경우 에러가 발생한다. 그래서 파라미터가 타입에 맞게 꼭 전달해야 되는 경우 이런식으로 파라미터를 선언하게 되면 알아서 형변환이 되어 변수로 사용할 수 있고 편리하다.

     

    로그인 페이지

    localhost:8080/login을 실행하면 위와 같이 심플한 로그인페이지가 뜨며 여기에 아이디와 패스워드를 입력 후 로그인 버튼을 누르게 된다면 login/action 을 매핑한 loginAction 메소드를 실행하게 된다.

     

    실행결과

    id->test
    pwd->test12

    이와 같이 콘솔 로그에 파라미터 값이 정상적으로 찍히는 것을 확인할 수 있다. 

     

    loginAction 메소드를 보면, model로 값을 세팅하여 페이지에 전달하게 되는데 전달된 값을 페이지에 뿌려보도록 하자.

     

    로그인을 수행한 화면 값이 아이디와 패스워드에 세팅이 안되어 있다

     

    우선 loginAction은 각각의 파라미터 값을 다시 동일한 이름으로 model에 세팅하게 되는데 jsp 페이지는 이 모델의 값을 페이지에 붙일 수 있게 된다.

     

    login.jsp에 value 지정

    <table>
    	<tr>
    		<td>아이디</td>
    		<td><input type="text" name="id" value="${id}"/></td>
    	</tr>
    	<tr>
    		<td>패스워드</td>
    		<td><input type="password" name="pwd" value="${pwd}"/></td>
    	</tr>
    </table>

     

    로그인 페이지의 value에 ${} 를 달고 안에 model의 키 값을 입력하면 키에 매핑된 value값을 호출 할 수 있다.

     

     

    메소드 줄이기

    그러나 이와 같이 메소드를 2개를 운영하게 될 경우 작업이 복잡해지는 경우가 있다. 이를 위해 RequestParam에서 값이 없을 때 처리를 해주는 기능을 추가해보도록 한다.

     

    login.jsp

    <body>
    메세지 : ${msg}
    <form name="loginForm" action="login">
    <table>
    	<tr>
    		<td>아이디</td>
    		<td><input type="text" name="id" value="${id}"/></td>
    	</tr>
    	<tr>
    		<td>패스워드</td>
    		<td><input type="password" name="pwd" value="${pwd}"/></td>
    	</tr>
    </table>
    <input type="submit" value="로그인" />
    </form>
    </body>

     

    로그인 jsp 페이지에 메세지를 받을 수 있는 곳을 지정하였고, action도 login/action이 아니라 login만 호출하게 변경한다.

     

    Controller.java

    /**
    	 * 로그인을 처리하는 메소드
    	 * 
    	 * @param id
    	 * @param model
    	 * @return
    	 */
    	@RequestMapping("/login")
    	public String login(@RequestParam(value="id", required=false) String id, 
    						@RequestParam(value="pwd", required=false) String pwd, Model model) {
    		logger.info("id->" + id);
    		logger.info("pwd->" + pwd);
    		
    		if(id != null && pwd != null) {
    			model.addAttribute("id", id);
    			model.addAttribute("pwd", pwd);			
    			model.addAttribute("msg", "로그인이 처리되었습니다");
    		} else {
    			model.addAttribute("msg", "아이디나 패스워드가 제대로 입력되지 않았습니다.");
    		}		
    		
    		return "login";
    	}

     

    콘트롤러에 value와 required라는 설정값을 추가한다. required를 false로 설정하면 해당 값이 무조건 입력될 필요 없게 설정하게 된다.

     

    위와 같이 설정하고, localhost:8080/login을 호출하게 되면 console 로그에 다음과 같이 찍힌다.

    id->null
    pwd->null

     

    그리고 값을 입력하여 로그인을 수행하면

    값이 모두 들어갔을 경우

     

    null 아니라 값이 세팅 되면서 들어가게 된다. 이제 마지막으로 값이 없을 경우 default 값을 세팅해보도록 한다.

     

    Default값 지정

    Controller.java

    /**
    	 * 로그인을 처리하는 메소드
    	 * 
    	 * @param id
    	 * @param model
    	 * @return
    	 */
    	@RequestMapping("/login")
    	public String login(@RequestParam(value="id", required=false, defaultValue="guest") String id, 
    						@RequestParam(value="pwd", required=false, defaultValue="") String pwd, Model model) {
    		logger.info("id->" + id);
    		logger.info("pwd->" + pwd);
    		
    		if(!id.equals("guest") && pwd.length() > 0) {
    			model.addAttribute("msg", "로그인이 처리되었습니다");
    		} else {				
    			model.addAttribute("msg", "아이디나 패스워드가 제대로 입력되지 않았습니다.");
    		}
    		
    		model.addAttribute("id", id);
    		model.addAttribute("pwd", pwd);		
    		
    		return "login";
    	}

     

    디폴트 값을 세팅하고 싶으면 defaultValue라는 설정을 추가한다. 여기에 원하는 값을 세팅하면 null일 경우 값을 defaultValue로 세팅한다. 

     

    id의 defaultValue를 guest로 하고, pwd의 defaultValue를 공백으로 했을 때 login 페이지를 호출하면 

     

    디폴트로 설정된 것을 확인할 수 있다

     

    이와같이 guest가 아이디에 박힌 default 설정이 된 것을 알 수 있다.

     

    반응형

    댓글

    Designed by JB FACTORY