티스토리 뷰

1. RequestParam 

(1) 코드예시 

 1) form data를 프로세스할 새로운 method를 만든다.

 2) @RequestParam("studentName")을 통해 form의 input name이 "studentName"인 필드를 가져온다.

  - form data를 읽어와서 자동으로 method안에 들어오는 parameter에 연결시킨다.

  - 백그라운드에서, Spring이 request로부터의 param인 studentName을 읽어서 theName이라는 String변수에 binding시킨다.

@RequestMapping("/processFormVersionThree")
	public String processFromVersionThree(@RequestParam("studentName") String theName,
			Model model) {
		
		/*
        // read the request parameter from the HTML form
		String theName = request.getParameter("studentName");
		-> Spring이 자동으로 해주기 때문에 필요가 없다.
		*/
		
		// convert the data to all caps
		theName = theName.toUpperCase();
		
		// create the message
		String result = "Hey My Friend from v3! " + theName;
		
		// add message to the model
		model.addAttribute("message",result);
		
		return "helloworld";
	}

다음과 같이 설정해 준뒤, form페이지에서 action 속성을 processFormVersionThree로 설정해주면 된다.

포인트는 Spring이 @RequestParam이라는 annotation으로 form data를 읽어 올 수 있다는 것이다.

 

2. RequestMapping 

 (1) Controller에 request mapping 추가

  - Controller의 parent mapping로서 역할을 한다.

  - Controller안의 method의 모든 request mapping은 controller의 경로에 상대적이다.

  - 폴더 directory structure와 비슷하다.

-> request mapping을 그룹화 시키는데 좋은 방법임. 다른 controller의 request mapping들과의 충돌을 해결하는데 좋은 테크닉임.

 

(2) 코드 예시

package com.luv2code.springdemo.mvc;
import javax.servlet.http.HttpServletRequest;
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
@RequestMapping("/hello") // Parent mapping. 아래 mapping들은 모두 sub mapping이 된다.
public class HelloWorldController {
	
	// need a controller method to show the initial HTML form
	
	@RequestMapping("/showForm")
	public String showForm() {
		return "helloworld-form";
	}
	
	//need a controller method to process the HTML form
	@RequestMapping("/processForm")
	public String processForm() {
		return "helloworld";
	}
	
	//new a controller method to read form data and
	//add data to the model
	@RequestMapping("/processFormVersionTwo")
	public String letsShoutDude(HttpServletRequest request, Model model) {
		...
	}
	
	@RequestMapping("/processFormVersionThree")
	public String processFromVersionThree(@RequestParam("studentName") String theName,
			Model model) {
		...
	}
	
}
package com.luv2code.springdemo.mvc;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class SillyController {
	
	@RequestMapping("/showForm")
	public String displayTheForm() {
		return "silly";
	}
	//different method name, same request mapping
}

위 코드와 같이 여러개의 Controller에서의 method에 @RequestMapping을 통해 경로를 설정해 놓은것이 충돌이 일어날 수 있다. 이런경우를 대비해서 클래스에 @RequestMapping을 설정함으로서 controller클래스간의 경로 충돌을 해결 할 수 있을 뿐만 아니라 정리되는 기능 또한 있다.

 

 * 폼 페이지에서 action 속성은 controller에 RequstMapping으로 부모 경로를 설정해줬다해서 변경할 필요는 없다.

왜냐하면 위 예시에서 controller class에 @RequstMapping("/hello")를 설정하고 @RequestMapping("/showForm")을 통해서 폼 페이지를 보여준다면, 폼 페이지가 열릴때 hello/showForm으로 열리게 되고, 이 시점에서  browser URL/path가 http://localhost:8080/spring-mvc-demo/hello로 설정된다.

따라서 action 속성으로 submit한 후의 페이지로 넘겨도 http://localhost:8080/spring-mvc-demo/hello/processForm으로 실제 URL이 넘어가게 된다. 

그러므로 폼이 있는 JSP페이지에서 경로를 다시 설정해 주지 않아도된다.

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday