흐음.. 뭐 중요하다면 중요한데.. .우선 .. 적당히 하고 넘어가고 필요할때 보자

알다시피 DispatcherServlet 이 HandlerMapping을 통해서 어떤 컨트롤러를 쓸지 알아내고
그 컨트롤러가 ModelAndView(물론 다른게 될 수 도 있고) 를 돌려주면 어떤 뷰를 써야하는지 알려주는 대상이 있다.

바로 ViewResolver 인데, 스프링이 제공하는 ViewResolver에 대해서 살펴보고 뷰구현기술에 대해서도.... 책봐라 -ㅅ-

ViewResolver는 응답 결과를 생성할 뷰 객체를 리턴한다.
모든 View 클래스는 View 인터페이스를 구현한다.




1. InternalResourceViewResolver
jsp, html 파일과 같이 웹 어플리케이션의 내부자원을 이용하여 부를 생성하는 경우?
AbstractUrlBasedView타입의 객체이고, 기본적으로 View 클래스는 InternalResourceView 클래스임

<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/viewjsp/" />
<property name="suffix" value=".jsp" />
</bean>


2. BeanNameViewResolver 설정
뷰 이름과 동일한 이름을 갖는 빈을 뷰 객체로 사용하는경우.

public ModelAndView download() throws Exception {
File downloadFile = getFile();
return new ModelAndView("download", "downloadFile", downloadFile);  // download 빈 으로 처리하도록 설정
}
        
        // 빈 등록하고
<bean id="viewResolver"
class="org.springframework.web.servlet.view.BeanNameViewResolver" />

        // download 빈 등록
<bean id="download" class="madvirus.spring.chap07.view.DownloadView" />

3. XmlViewResolver
뷰 이름과 동일한 이름을 갖는 빈을 뷰 객체로 사용.
2번과 큰 차이는 없는데, 차이가 있다면 별도의 xml 설정 파일로 부터 빈 객체를 검색한다는것임

  <bean id="viewResolver"
class="org.springframework.web.servlet.view.XmlViewResolver"
                p:location="/WEB-INF/nonHtml-view.xml"/>


 4. ResourceBundleViewResolver 
리소스 번들(프로퍼티파일)로 부터 View 이름과 매핑 View 클래스를 구한다. 
책봐라..

그리고 DI,AOP 기능이 필요하다면 BeanNameViewResolver 나 XmlViewResolver 클래스를 사용한다.

 

다수의ViewResolver 설정하기
하나의 DispatcherServlet은 한 개 이상의 ViewResolver를 설정할 수 있도록 하고 있다.
order 를 두고 우선순위를 정할 수 있지. 순서대로 찾아가는 꼴이라고 보면 된다.

주의할 점은 InternalResourceViewResolver는 마지막 순위가 되도록 해야하는데, 왜냐면 해당 Resolver는 무조건 뷰 이름에 매핑되는 뷰 객체를 리턴하기 때문이다. (null을 리턴하지 않음)
Velocity도 마창가지로 주의해야하는데, VelocityViewResolver / VelocityLayoutViewResolver 는 뷰 이름에 매핑되는 Velocity 템플릿 파일이 존재하지 않을경우 예외를 발생시켜버린다.



스프링 커스텀 태그...
1. 메시지 

<spring:message> 커스텀태그를 이용해서 MessageSource 로 부터 메시지를 가져와 출력할 수 있다. (즉... 프로퍼티 같이 설정되어있는 값을 가져와 대치하는거지)

2. 폼관련
뭐.. 이제는 당연한거지만, 입력 폼(form)안의 데이터를 커맨드객체에 저장해서 넘겨받아 처리하는 형태이다. 
또한 반대로 커맨드 객체으 기밧을 입력폼에 출력해주는 기능도 있다. 
스프링은 많은 커스텀태그를 제공하고 있다.

<form:form commandName="login">
<form:errors />
<p>
<label for="loginType"><spring:message code="login.form.type" /></label>
<form:select path="loginType" items="${loginTypes}" />
</p>
<p>
<label for="id"><spring:message code="login.form.id" /></label>
<form:input id="id" path="id"/>
<form:errors path="id" />
</p>
<p>
<label for="password"><spring:message code="login.form.password" /></label>
<form:password id="password" path="password"/>
<form:errors path="password" />
</p>
<p>
<input type="submit" value="<spring:message code="login.form.submit" />">
</p>
</form:form>

흐음...  

<form:input>
<form:password>
<form:hidden>
위의 셋은  path 속성에 바인딩 될 커맨드객체의 프로퍼티를 지정함. 즉 이 값이 input 의 name 과 id 값이 된다.

<form:select>
: option 태그를 생성하는데 필요한 콜렉션을 전달받을 수 있음
<form:options>
:지정한 콜렉션 객체를 이용해서 option 태그를 생성할 수 있음
<form:option>
: 한개의 option...

컨틀롤러에서 생성해 뷰에 넘겨줄때 @ModelAttribute 어노테이션을 이용해서 넘겨준다.

@ModelAttribute("loginTypes")
protected List<String> referenceData() throws Exception {
List<String> loginTypes = new ArrayList<String>();
loginTypes.add("일반회원");
loginTypes.add("기업회원");
loginTypes.add("헤드헌터회원");
return loginTypes;
}
위처럼하고..
위의 html 을 보면

<p>
...
<form:select path="loginType" items="${loginTypes}" />
</p>

부분처럼 쓰인다.

그러면 생성되는 내용은
<select id='loginType' name='loginType'>
    <option value='일반기업'>일반회원</option>
    <option value='기업회원'>기업회원</option>
    <option value='헤드헌터회원'>헤드헌터회원</option>
</select>

 위의 방법 말고 <form:options> 도 있다.

<form:select path='loginType'>
    <option value="">---------- select --------------</option>
    <form:options items="${loginType}"/>
    <form:option value="TEST"/>
    <form:option value="TEST2">TEST2</form:option>
</form:select>
 

<form:checkboxes>
<form:checkbox> 

위의 둘도 select와 별 반 다를게 없다.

Map<String, String> favoritesOsNames = new LinkedHashMap<String, String>();
favoritesOsNames.put("윈도우XP", "윈도우XP");
favoritesOsNames.put("비스타", "비스타");
favoritesOsNames.put("윈도우7", "윈도우7");
favoritesOsNames.put("우분투", "우분투");
favoritesOsNames.put("맥", "맥");

                model.addAttribute("favoritesOsNames", favoritesOsNames); // 넣고...

jsp 에서 
 
<form:checkboxes items="${favoritesOsNames}" path="favorites" />
위와같이 하면

<input id='favorites1' name='favorites' value='윈도우XP'/><label for='favorites1'>윈도우XP</label>
<input id='favorites2' name='favorites' value='비스타'/><label for='favorites2'>비스타</label>

그 외 내용은 책에서;;


<form:radiobuttons>
<form:radiobutton>
: 흐음.. 역시나 select 나 checkbox와 비슷한다. 


Map<String, String> tools = new LinkedHashMap<String, String>();
tools.put("Eclipse", "Eclipse");
tools.put("IntelliJ", "IntelliJ");
tools.put("NetBeans", "NetBeans");

                model.addAttribute("tools", tools); 
이렇게 해두고...

 
<form:radiobuttons items="${tools}" path="tool" />
-->

<input id='tool1' name='tool' type='radio' value='Eclipse'/><label for='tool1'>Eclipse</label>
<input id='tool2' name='tool' type='radio' value='intelliJ'/><label for='tool2'>intelliJ</label>


<form:textarea>
뭐.. 별다를게 있겠느냐 아래를 봐라
<form:textarea path="etc" cols="20" rows="3"/>
-->
html로.. 변환하면
<textarea id="etc" name="etc" cols="20" rows="3"></textarea>


스프링이 제공하는 에러관련 커스텀 태그


뭐... Validator 를 이용해서 각종 에러 설정한것을 jsp에서 쓸 수 있는데..
Errors 나 BindingResult를 이용해서 에러 정보를 추가한 경우 <form:errors> 를 통해서 에러 메시지를 출력할 수 있다.

<p>
<form:label path="userId">회원 ID</form:label>
<form:input path="userId" />
<form:errors path="userId" />
</p>

이런경우... 실제 화면에서 아이디를 안넣고 submit을 한다든지 하면 form:errors 에서 에러메시지르 화면에 보여주게 된다.
(예로 필수항목입니다.. 등의 메시지가 옆에 표시됨)

그런용도로 쓸 수 있지...



 












'IT > 스프링' 카테고리의 다른 글

Bean .. 빈 객체 스캔하여 빈 등록  (0) 2012.02.29
스프링이 객체를 생성하는 형태?  (0) 2012.02.22
@RequestBody , @ResponseBody  (0) 2012.01.20
WebApplicationContext 직접접근?  (0) 2012.01.19
캐시옵션 설정  (0) 2012.01.19

+ Recent posts