오늘은 @ModelAttribute를 el에서 사용하는 방법에 대해서 알아보자.
먼저 인덱스.jsp와 컨트롤러의 코드부터 확인해보자.
index.jsp
<body>
<form action="test1" method="post">
data1 : <input type="text" name='data1'><br>
data2 : <input type="text" name='data2'><br>
<button type="submit">확인</button>
</form>
<hr>
<form action="test2" method="post">
data1 : <input type="text" name='data1'><br>
data2 : <input type="text" name='data2'><br>
<button type="submit">확인</button>
</form>
<hr>
</body>
Controller
@Controller
public class TestController {
@PostMapping("/test1")
//public String test1(@ModelAttribute DataBean bean) { // 내가 만든 객체 주입@ModelAttribute / Setter로 값 세팅 , 출력시에는 getter로 값 얻어오기
public String test1(DataBean bean) { // @ModelAttribute는 생략가능 (위에줄과 동일한 의미를 가짐)
System.out.printf("data1 : %s\n", bean.getData1()); //getter
System.out.printf("data2 : %s\n", bean.getData2());
return "test1";
}
@PostMapping("test2")
public String test2(@ModelAttribute("testData")DataBean bean) { //이렇게 @ModelAttribute("내가지정한이름")을 하면 JSP 에서 내가 지정한 이름으로 ${}사용가능 (원래 해야하는 첫번째 대문자 법칙은 이경우 안지켜도된다 내가정한이름이므로)
return "test2";
}
}
이렇게 코드가 이루어져있다.
다시한번 강조!
@ModelAttribute는 생략이 가능하다!!!!
그리고 el에서 사용시에는
test1.jsp
<body>
<h1>test1</h1> <!-- data1은 jsp에서 지정한이름 바로 밑에줄은 Controller에서 get메서드 안쓰고 그냥 아무것도 안써도 사용가능!! -->
<h3>data1 : ${requestScope.dataBean.data1 }</h3> <!-- !중요한! 사용법 @ModelAttribute DataBean bean 로 전달하면 클래스명인 DataBean.data1 으로 가져올수있는데 클래스이름인 DataBean의 맨앞글자로 소문자로 바꿔서 dataBean.data1로 사용한다-->
<h3>data1 : ${dataBean.data1 }</h3>
<h3>data2 : ${dataBean.data2 }</h3>
</body>
이런식으로 사용하는데
초보자들의 주의점을 살펴보자
먼저 컨트롤러에서 @ModelAttribute DataBean bean 이렇게 생성하였으니
jsp에서 ${bean.data1} 이라고 생각하기 쉬운데
댓츠노우노우 그건 아니고
DataBean bean의 타입은 DataBean에서 맨 앞 글자를 소문자로 써서
dataBean 라고 표기한뒤 사용한다.
즉 사용법은 ${bean.data1} 이 아닌
${dataBean.data1 } 가 되는것이다!!!!!!!!!!
나도 굉장히 헷갈렸다 잘 보자
만약 이름을 지정하고 싶으면
@PostMapping("test2")
public String test2(@ModelAttribute("testData")DataBean bean) {
//이렇게 @ModelAttribute("내가지정한이름")을 하면 JSP 에서 내가 지정한 이름으로 ${}사용가능 (원래 해야하는 첫번째 대문자 법칙은 이경우 안지켜도된다 내가정한이름이므로)
return "test2";
}
이렇게 (" ~ ") 내가 원하는 이름을 넣어주고
jsp단에서
<body>
<h1>test2</h1>
<h3>data1 : ${requestScope.testData.data1 }</h3> <!-- 내가 정한 이름인 testData를 dataBean(원래는DataBean인데 첫번째소문자) 대신에 사용한다 -->
<h3>data2 : ${testData.data2 }</h3> <!-- requestScope는 생략가능 & Controller에서 내가정한이름. 으로 출력가능-->
</body>
이렇게 내가 준 이름 testData 즉
${requestScope.testData.data1 } 이렇게 사용하면 된다.
(여기서 requestScope. 은 생략가능!!)
요약
컨트롤러의 @ModelAttribute DataBean bean 를 jsp에서 사용시에
${bean. ~} 이 아닌 ${dataBean.~}로 사용
(객체이름x 클래스타입O , 클래스타입 DataBean에서 맨앞 D는 소문자 d로 사용!!)
${requestScope.testData.data1 } 에서 requestScope. 생략가능
(내가 정한 이름은 맨앞 대문자를 소문자로 바꾸는거 사용안해도된다)
컨트롤러 @ModelAttribute어노테이션 생략가능
아 마지막으로
@ModelAttribute(생략가능)이 붙은 DataBean 객체는 자신이 직접
꼭 Setter, getter와 함께 만들어야함
//내가 직접 Controller에 @ModelAttribute로 주입할 객체를 만듬 ++ setter getter 는 필수!!!!!!!!!!
public class DataBean {
private String data1; /*****String "이름" 에서 이름은 jsp에서의 name과 동일하게 해야한다*************/
private String data2; /********** int로 하고싶으면 int로 하면 알아서 형변환이 된다 */
public String getData1() {
return data1;
}
public void setData1(String data1) {
this.data1 = data1;
}
public String getData2() {
return data2;
}
public void setData2(String data2) {
this.data2 = data2;
}
}
요로코롬
spring form tag <form:form> (0) | 2022.01.23 |
---|---|
Spring - form 커스텀태그 <form:form> 맨위 선언 필수 (0) | 2022.01.22 |
request.setAttribute, model.addAttribute, ModelAndView (0) | 2022.01.22 |
EL ${requestScope.~} ${param.} 의 예제 (el의 범위우선순위 및 내장객체 데이터저장소) (0) | 2022.01.22 |
@ModelAttribute(생략가능!!!) 예제 (@RequestParam의 진화형?!) 스프링 spring 파라미터 (0) | 2022.01.22 |
댓글 영역