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^설명^
|XmlViewResolver|View이름과 View 클래스간의 매핑정보가 담긴 XML로 부터 View이름에 해당하는 View를 구한다.\\ 기본설정 파일은 /WEB-INF/views.xml이다. |
|ResourceBundleViewResolver|View이름과 View 클래스간의 매핑정보가 담긴 리소스 번들(프로퍼티파일)로 부터 View 이름에 해당하는 View를 구한다.\\ 기본설정 파일은 views.properties이다.|
|InternalResourceViewResolver/UrlBasedViewResolver|특정 디렉토리 경로의 JSP파일들을 호출할 때 편리하게 사용할수 있다.\\ 기본적으로 사용하는 View 클래스는 InternalResourceView이며, View 이름이 곧 JSP 파일이름이 된다.|
|VelocityViewResolver /FreeMarkerViewResolver|Velocity/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 페이지에 커스텀 태그를 사용하기 위해 라이브러리 선언을 해줘야 한다.
그리고
...
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
...
해당 화면의 타이틀이 "부서 정보 리스트 페이지"로 표기 될 것이다.
=== form tag(
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
스프링 폼 태그에는 아래와 같은 태그들이 있다.\\
//**
->
\\
//**
부서이름
아래와 같이 HTML로 출력된다.
부서이름
//**
상위부서
아래와 같이 HTML로 출력된다.
상위부서
//**
2.JSP에서 라이브러리를 선언한 후 사용한다.
<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui"%>
...
...
...