상세 컨텐츠

본문 제목

spring @ModelAttribute(커멘드객체)를 이용해서 el ${}에서 사용하기! 예제 예시 설명

Spring

by shika 2022. 1. 22. 15:33

본문

오늘은 @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;
	}
}

요로코롬

관련글 더보기

댓글 영역