전자정부프레임워크 view
출처 : http://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte:ptl:view
View
개요
Controller가 요청에 대한 처리를 하고, View 이름과 데이터(Model)를 ModelAndView에 저장해 DispatcherServlet에 반환(return)하면,**DispatcherServlet은 View 이름을 가지고 ViewResolver에게서 실제 View 객체를 얻고, 이 View는 Controller가 저장한 Model 객체의 정보를 출력한다.여기서는 View와 ViewResolver, 그리고 JSP에서 편리한 데이터 출력을 위해 스프링이 제공하는 Spring form tag library에 대해서 설명한다.
- View
설명
ViewResolver
Controller는 코드내에서 실제 View 객체를 생성하지 않고 View 이름만을 결정할 수 있는데, 이로써 Controller와 View의 분리(decoupling)를 가능하게 한다.
package com.easycompany.controller.hierarchy; ... public class EmployeeListController extends AbstractCommandController{ ... @Override protected ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { ... List employeelist = employeeService.getAllEmployees(commandMap); ModelAndView modelview = new ModelAndView(); modelview.addObject("employeelist", employeelist); ... //직접 View 객체를 생성하지 않고, //View view = new InternalResourceView("/jsp/employeelist.jsp"); //modelview.setView(view); //View 이름만을 저장. modelview.setViewName("employeelist"); return modelview; } } 이때, DispatcherServlet에 실제 View 객체를 구해주는건 Controller가 아니라 ViewResolver가 담당한다.ViewResolver는 Controller가 반환한 ModelAndView 객체에 담긴 View 이름을 가지고 실제 View 객체를 반환하는 인터페이스이다.Spring에서 제공하는 ViewResolver 구현 클래스는 아래와 같다. ViewResolver설명XmlViewResolverView이름과 View 클래스간의 매핑정보가 담긴 XML로 부터 View이름에 해당하는 View를 구한다.기본설정 파일은 /WEB-INF/views.xml이다.ResourceBundleViewResolverView이름과 View 클래스간의 매핑정보가 담긴 리소스 번들(프로퍼티파일)로 부터 View 이름에 해당하는 View를 구한다.기본설정 파일은 views.properties이다.InternalResourceViewResolver/UrlBasedViewResolver특정 디렉토리 경로의 JSP파일들을 호출할 때 편리하게 사용할수 있다.기본적으로 사용하는 View 클래스는 InternalResourceView이며, View 이름이 곧 JSP 파일이름이 된다.VelocityViewResolver /FreeMarkerViewResolverVelocity/FreeMarker 연동시에 사용한다.
InternalResourceViewResolver/UrlBasedViewResolver
비지니스 로직 처리가 끝난 후 ”/jsp/main/abc.jsp” 경로의 JSP 파일로 forwarding하는 Controller가 있다고 하면, InternalResourceViewResolver/UrlBasedViewResolver를 사용해서 아래와 같이 Controller를 작성하고, 빈 정의 파일에 설정할 수 있다.
또는 @Controller public class HelloController { @RequestMapping("...") public String hello(){ ... //비지니스 로직 처리. return "/jsp/main/abc.jsp"; //뷰이름이 곧 JSP 파일의 경로. } } InternalResourceViewResolver/UrlBasedViewResolver의 프로퍼티 prefix, suffix를 사용하면 좀더 간단하게 처리할수 있는데, JSP가 특정 디렉토리 경로 아래에 있고, 예를 들어 /jsp/main 디렉토리 아래, 확장자는 .jsp 이라면,
또는 @Controller public class HelloController { @RequestMapping("...") public String hello(){ ... return "abc"; //prefix와 suffix를 제외한 부분만 표기. } } 간단히 뷰이름을 설정할 수 있다.
View
Spring이 제공하는 View 클래스를 사용할 수도 있지만, UI Tool 등과의 연동등으로 인해 View 클래스를 직접 작성해야 하는 경우도 발생한다.인터페이스 View를 직접 구현해서 View 클래스를 만들수도 있지만, AbstractView를 확장하여 구현해보자.renderMergedOutputModel 메소드를 구현하면 되는데, 아래와 같은 메소드 시그니쳐를 가지고 있다.
protected abstract void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception AjaxTags란 Ajax 관련 오픈소스 사용을 위해 Model 객체의 데이터를 ‘text/xml’ 형식으로 렌더링하는 View 클래스를 만들어 봤다.
package com.easycompany.view; import java.io.PrintWriter; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.view.AbstractView; public class AjaxXmlView extends AbstractView { @Override protected void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/xml"); response.setHeader("Cache-Control", "no-cache"); response.setCharacterEncoding("UTF-8"); PrintWriter writer = response.getWriter(); writer.write((String) model.get("ajaxXml")); writer.close(); } } Spring Tag Library
meassage tag()
스프링은 메시지 리소스 파일로 부터 메시지를 가져와 간편하게 출력할수 있도록,
빈 정의 파일에 리소스 번들 관련된 설정이 되어 있어야 한다.
먼저 메시지 관련 리소스 파일에 코드값을 설정해준다. PropertiedEditor 같은 유틸의 도움을 받으면 편리하게 한글 입력-편집이 가능하다.
/easycompany/webapp/WEB-INF/classes/messages_ko.properties ... # -- spring:message -- easaycompany.loginform.title=로그인페이지 easaycompany.employeelist.title=사원 정보 리스트 페이지 easaycompany.updateemployee.title=사원 정보 수정 페이지 easaycompany.insertemployee.title=사원 정보 입력 페이지 easaycompany.departmentlist.title=부서 정보 리스트 페이지 easaycompany.updatedepartment.title=부서 정보 수정 페이지 easaycompany.insertdepartment.title=부서 정보 입력 페이지 JSP 페이지에 커스텀 태그를 사용하기 위해 라이브러리 선언을 해줘야 한다. 그리고
... ... 해당 화면의 타이틀이 “부서 정보 리스트 페이지”로 표기 될 것이다.
form tag(,,...)
폼 관련 어플리케이션을 개발할 때는 스프링이 제공하는 폼 태그와 같이 사용하면 편리하다.스프링 폼 태그는 Model 데이터의 커맨드 객체(command object)나 참조 데이터(reference data)들을 화면상에서 쉽게 출력하도록 도와 준다.일단, 스프링 폼 태그를 사용하려면 페이지에 커스텀 태그 라이브러리를 선언해야 한다.
스프링 폼 태그에는 아래와 같은 태그들이 있다.
*
- commandName : 참조하려는 model attribute 이름.
- action : 폼 전송할 URL
- method : 폼 전송시에 HTTP 메소드(GET,POST)
- enctype: 폼 전송시에 데이터 인코딩 타입.