<spring:message>
이 태그는 ResourceBundleMessage에 저장된 properties 파일 데이터를 읽어온 key값으로 꺼낼 수 있습니다.
불편하게 직접 적는게 아니라 이러한 태그로 사용해서 돌아가는 이유는
클라이언트의 locale에 맞춰서 그 언어에 맞는 프로퍼티스파일을 읽어들여 사용하게 되는것입니다.
ex)한국이라면 ko언어로 될것이고, 미국이라면 en언어로 사용될것입니다.
물론 그에따른 properties파일은 각각 존재해야합니다.
이 예제같은경우는 validation_en / validation / label_en / label / .properties파일 4가지를 가지고있습니다.
1. {n} 형식을 이용해 변하는 부분을 명시할 수 있다.
태그내에 arguments ="${}","${}"
원하는 값을 순서대로 선언해주면 된다.
2. javascript에서도 사용가능
태그내에 javaScriptEscape ="true"로 선언.
3. EL로도 사용가능
mapping되어있는 코드의 value를 선언한 변수 var에 사용할 수 있다.
4. '<' 나 '&' 같은 html에서 사용될 수 있는 문자가 있을 경우
'<' '&'같이 자동으로 변경되어 출력된다
htmlEscape 속성 값을 지정하지 않으면,
defalutHtmlEscape 컨텍스트 파라미터에서 지정한값을 사용한다
2. <form:form >
이 태그는 Command라는 이름의 커맨드 객체를 가져오려고 하기때문에
commandName 속성에 커맨드 객체의 이름을 명시해주어야 합니다
그렇기때문에 Controller 클래스에서 new Command 객체를 받아오는 'login'이라고 선언한 이름으로
@ModelAttribute로 선언한 모델 데이터를 form에서 'login'이라는 이름으로 불러올 수 있게됩니다.
3. <form:input>
이 태그는 등록되었던 글의 수정 폼이나 , 입력했다가 에러가나서 다시 그 페이지를 요청할때
마지막까지 입력했던 데이터를 불러올때 편리하게 사용할 수 있도록 제공됩니다.
이 태그의 속성에는 path="" 라고 명시한 부분이 input태그가 생성되면서 순차대로 다 속성이 다 들어갑니다
- 예를 들어 path = "id" 라고 적혀 있는 위와같은 예제라면
1. type ="text"
2. id = "id"
3. name ="id" --> id와 name은 path에 입력된 값 그대로 둘다 들어갑니다
4. value = "${login.getId()}"
value값은 처음 form에 등록되었던 command객체의 id와 path설정된 값이 자동으로 EL로 들어갑니다.
4. <form:select>
이 태그는 select 태그하나로 옵션까지 같이 만들어줄 수 있습니다.
태그안의 속성으로 들어가는 path = "loginType" items = "${loginTypes}"
로 넣어준다면 위의 <input> path와 똑같이 Command객체의 id와 path 설정된 값이 자동으로 EL로 들어갑니다
또 하나 중요한건, 컬렉션객체인 list로 저장된 데이터를 받아와 하나씩 꺼내 <option> 태그로 만들어주었다는겁니다.
그것이 가능했던 이유는 Controller 클래스에서 @ModelAttribute("loginTypes")로 로직을 실행한 메서드에서
list(컬렉션)으로 담은 데이터를 Model로 정보가 저장되어있기때문에 가능했다는걸 기억합니다.
단, 위와같이 select태그만 쓰면 컬렉션안에있는 내용만 option으로 만들 수 있기때문에 또다른 옵션을 추가하고싶다면
<option>태그까지 사용합니다. 그 방법은 아래와 같습니다
<form:select path = "loginType"> <option value ="">---선택하세요---</option> <form:options items = "${loginTypes}"/> </form:select> | cs |
컬렉션을 옵션에서 따로 선언하면 내가 원하는 옵션태그를 따로 더 만들 수 있게 됩니다.
5. <form:options>
또 하나, 예외가 있다면 컬렉션으로 받는 객체가 String이 아닐 수 있습니다.
String이 아닌 Code Class ---> DTO 객체가 저장된다고 생각하게될때
위와같은 예제에서 컬렉션 List와 들어가는 값이 String 이 아닌
public class Code{ private String code; private String label; ....// getter & setter } | cs |
를 가진 클래스객체가 들어간다고 생각했을때
각각의 프로퍼티를 <option> 태그의 value속성과 화면에 비춰질 text로 사용하고싶은 경우일때에는
'itemValue'속성과 'itemLabel'속성을 사용해 컬렉션에 '저장된 객체' 에서
<option>태그에 넣고싶은 속성에 DTO객체의 프로퍼티를 지정할 수 있습니다.
그 예제는 아래와 같습니다.
<form:select path="jobCode"> <option value="">----선택하세요----</option> <form:options items="${jobCodes}" itemLabel="label" itemValues="code"/> </form:select> | cs |
select태그에 path로 저장된 부분은 id와 name이 "jobCode"라는 이름으로 들어갈거구요
<form:options> 태그에는 컬렉션을 저장해둔 items에서 하나씩 꺼내 DTO객체의
1. label 변수에 담은 데이터는 itemLabel에
2. code 변수에 담은 데이터는 itemValues의 값으로 넣어서 화면에 나타나게 됩니다.
또한,
<form:select>, <form:options>, <form:option> 커스텀 태그의 장점은
커맨드 객체의 프로퍼티 값과 일치하는 값을 갖는 <option>을 자동으로 선택해 준다는 점입니다.
예를 들어, 커맨드 객체의 loginType 프로퍼티의 값을 선택했을때 그 선택된값에 selected속성이 추가됩니다.
(클라이언트가 입력한 데이터를 다시 쏴줄때 편리해집니다.)
6. <form:checkbox> == <form:radiobox>
이 태그는 한개 이상의 값을 커맨드 객체의 특정 변수에 저장하고 싶은 경우에
배열이나 List같은 컬렉션 타입을 사용해 저장합니다.
path부분과 value부분과
value를 나눠서 넣고싶을때에 사용하는 itemLabel itemValues부분도 위와 같습니다.
차이점은
1. <span>태그로 감싸져서 checkbox가 만들어지는것과
2. 컬렉션에담아서 여러개의 check / radio로 쏠때에는
path로 지정한 이름은 name에만 다같이 같은 이름으로 박히고
id는 path로 지정한 데이터의 items에서 꺼낸 순서대로 뒤에 1,2,3.... 순으로 붙어서 id값으로 들어갑니다.
ex)
<form:label path="favorites">선호 OS</form:label>
<form:checkboxes items="${favoritesOsNames}" path="favorites"/>
<form:errors path="favorites" />
path를 favorites로 지정했을때에
1. label은 for속성에 favorites
2. checkbox는 name속성에 favorites
3. checkbox의 id속성에는 favorites[i] 순으로 들어간다는 점입니다.