2020년 9월 1일 화요일

@ModelAttribute를 이용한 스프링 컨트롤러 메소드 매핑

 


 

@ModelAttribute를 이용한 스프링 컨트롤러 메소드 매핑

 

1. @ModelAttribute

n  @ModelAttribute는 메서드 매개 변수안 또는 메서드 위에 기술되어 특정 객체를 Model 객체로 등록하여 JSP와 같은 VIEW에서 사용가능 하도록 하는 어노테이션 이다.

 

n  메서드 괄호의 매개 변수로 사용되는 경우 HTTP요청(Request) 파라미터 값들을 자동으로 지정한 모델 객체에 넣어준다이것은 @RequestParam으로 하나씩 받아서 처리하는 것보다 효율적 이며 이때 @ModelAttribute를 Command 객체라고도 한다.

n  클라이언트에서 요청 파라미터로 넘기는 값들이 @ModelAttribute로 지정한 객체에 자동 바인딩 된다바인딩된 객체는 view에 별도로 리턴해 주지 않아도 사용 가능하다. (ModelAttribute로 지정된 객체는 별도 선언없이 VIEW가 되는  JSP에서 접근 가능하다.)

n  @SessionAttributes로 지정해둔 모델이면 세션에서 가져오고 아니면 기본 생성자로 객체를 만든다해당 모델 오브젝트 속성에 해당하는 값을 HTTP 요청 파라미터에서 가져와서 바인딩 한다.

@RequestMapping(value = "/addEmp", method = RequestMethod.POST)

public String addEmp(@ModelAttribute("emp") Emp emp, ModelMap model) {

}

 

n  메소드명 위에 사용될 수도 있는데 Spring-MVC는 컨트롤러의 다른 요청 핸들러 메소드를 호출하기 전에 항상 메소드명 위에  @ModelAttribute가 붙은 메소드를 먼저 호출한다메소드에서 리턴하는 객체를 Model로 등록하거나스프링에서 JSP 뷰 파일에 반환되는 Model 객체에 특정한 속성값을 주입한다.

n  @RequestMapping, @GetPapping, @PostMapping 어노테이션이 붙은 컨트롤러 메서드가 호출되기 전에 모델 객체를 만들기 위해 메소드명 위에  @ModelAttribute가 붙은 메소드를 호출하는 것이다.

n  @ModelAttribute를 모든 Controller에 전역적으로 사용한다면 @ControllerAdvice에 선언하면 된다매번 Controller에 작성하지 않고 @ControllerAdvice 이용해서 한번만 작성하면 된다.

 

n  예제1

 

1. 컨트롤러

@Controller

public class ModelController {

    @ModelAttribute(name= "emplist")

    public List<String> initEmp() {

         List<String> emps= new ArrayList<String>();

        emps.add("홍길동");        emps.add("김길동");

        return emps;

    }

    @RequestMapping(value= "/list", method= RequestMethod.GET)

    public ModelAndView list(@ModelAttribute(name= "emplist") List<String> emps) {

         ModelAndView modelview = new ModelAndView();

        modelview.addObject("title", "사원목록");

        modelview.setViewName("emp_list");

        return modelview;

    }

}

 

2. JSP

 

<div id="title">${title}</div>

<div> </div>

<table>

    <tr>

        <td>${empslist}</td>

    </tr>

 </table>

 

n  예제2

1. jsp

 

<h2>${msg}</h2>

<p>${empno}</p>

<p>${ename}</p>

 

2. 모델

 

public class Emp {

    private long empno;

    private String ename;

 

    public Emp(long empno, String ename) {

        this.empno = empno;

        this.ename = ename;

    }

 

    // getters and setters

}

 

3. 컨트롤러

 

// @ModelAttribute를 모든 Controller에 전역적으로 사용한다면

// @ControllerAdvice에 선언하면 된다.

// 사원을 입력 후 입력된 사원 데이터를 JSP로 보내서 출력한다.

@Controller

@ControllerAdvice  //@ModelAttribute로 등록한 모델 객체를 모든 컨트롤러에서 사용가능

public class EmpController {

    private Map<Long, Emp> empMap = new HashMap<>();

 

    // 컨트롤러의 모든 Mdel 객체에 msg 속성을 추가한다.

   // /addEmp 요청이 올때 addAttributes () 메서드는 addEmp()  메소드 보다 먼저 실행되지만

    // addAttributes(), addEmp() 둘 다 실행 한 후에는 JSP에서 msg 속성을 참조할 수 있다.

    // Controller에 @ControllerAdvice가 붙어 있으면 모든 컨트롤러의 모든 Model 객체에

    // msg 속성이 추가되는 것이다.

    @ModelAttribute

    public void addAttributes(Model model) {

        model.addAttribute("msg", "Welcome to Spring World!");

    }

 

    // addEmp 요청이 오면 "emp" 모델 객체를 찾고 없으면 Emp의 새 인스턴스를 만들어

    // "emp"라고 Model로 등록하고 요청 파라미터 값들을 채운다.

    @RequestMapping(value = "/addEmp", method = RequestMethod.POST)

    public String addEmp(@ModelAttribute("emp") Emp emp, ModelMap model) {

 

        model.addAttribute("ename", emp.getEname());

        model.addAttribute("empno", emp.getEmpno());

 

        empMap.put(emp.getEmpno(), emp);

 

        return "emp";

    }   

}

 

 

 

 

#스프링동영상, #스프링강좌, #스프링모델, #스프링, #@ModelAttribute, #@ModelAttribute,#Spring@ModelAttribute,#스프링프레임워크,#Spring동영상,#스프링강의,#모델어트리뷰트

댓글 없음:

댓글 쓰기

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...