<bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath" value="/WEB-INF/viewvm/" /> <property name="velocityProperties"> <props> <prop key="input.encoding">EUC-KR</prop> <prop key="output.encoding">EUC-KR</prop> </props> </property> </bean> <bean id="viewResolver" class="org.springframework.web.serlvet.view.velocity.VelocityResolver" p:suffix=".vm" p:contentType="text/html; charset="EUC-KR" /> |
@Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView mav = new ModelAndView(); mav.setViewName("hello"); mav.addObject("greeting", getGreeting()); mav.addObject("me", me); return mav; } |
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>인사</title> </head> <body> 전 ${me}입니다. ${greeting} </body> </html> |
<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver" p:suffix=".vm" p:contentType="text/html; charset=EUC-KR" p:dateToolAttribute="dateTool" p:numberToolAttribute="numberTool" /> |
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>#springMessage("title.currentTime")</title> </head> <body> #springMessage("lagel.currentTime") :$dateTool.format("yyyy-MM-dd HH:mm:ss". $time) </body> </html> |
<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver" p:suffix=".vm" p:contentType="text/html; charset=EUC-KR" p:dateToolAttribute="dateTool" p:numberToolAttribute="numberTool" p:exposeRequestAttributes="true" p:exposeSessionAttributes="true" /> |
<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver" ... p:exposeRequestAttribute="true" p:exposeSessionAttributes="true" p:exposeSpringMacroHelpers="true" /> |
<p> <label for="id">#springMessage("login.form.id")</label> #springFormInput("login.id" "") #springShowErrors("<br/>" "") #springMessageText("login.form.id.help". "도움말이 없습니다.") </p> |
<p> <label for="id">#springMessage("login.form.id")</label> #springBind("login.id") <input type="text" name="${status.expression}" id="${status.expression}" value="$!status.value" /> #springShowErrors("<br/>" "") </p> |
<p> <label for="id">#springMessage("login.form.id")</label> #springBindEscaped("login.id" false) <input type="text" name="${status.expression}" id="${status.expression}" value="$!status.value" /> #springShowErrors("<br/>" "") </p> |
#springFormInput($path $attributes) |
<label for="name">이름</label> #springFormInput("memberInfo.name" "class="input") #springShowErrors("<br/>" "") |
#macro(springFormInput $path $attributes) #springBind($path) <input type="text" id="${status.expression}" name="${status.expression}" value="$!status.value" ${attributes}#springCloseTag() #end |
Map<String, String> jobCodes = new HashMap<String, String>(); jobCodes.put("1", "개발자"); jobCodes.put("2", "UI 개발자"); jobCodes.put("3", "웹 디자이너"); jobCodes.put("4", "기획자"); ModelAndView mav = new ModelAndView(); mav.addObject("jobCodes", jobCodes); |
<label for="jobCode">직업</label> #spriingFormSingleSelect("memberInfo.jobCode" $jobCodes "") #springShowErrors("<br/>" "") |
#springBind("login.loginType") <select id="${status.expression}" name="${status.expression}"> #foreach($option in $loginTypes) <option value="${option}" #if("$!status.value" == "$option") selected="selected" #end $option</option> #end </select> |
Map<String, String> favoritesOsNames = new HashMap<String, String>(); favoritesOsNames.put("WIN2000", "윈도우2000"); favoritesOsNames.put("WINXP", "윈도우XP"); favoritesOsNames.put("VISTA", "비스타"); favoritesOsNames.put("UBUNTU", "우분투"); favoritesOsNames.put("MAC", "맥"); referenceData.put("favoritesOsNames", favoritesOsNames); |
<label for="favorites">선호 OS</label> #springFormCheckboxes("memberInfo.favorites" $favoritesOsNames " | " "") #springShowErrors("<br/>" "") |
<p> <label for="tool">주로 사용하는 개발툴</label> #springFormRadioButtons("memberInfo.tool" $tools "" "") </p> |
<p> <label for="etc">기타</label> #springFormTextarea("memberInfo.etc" "cols='20' rows='3'") </p> |
// 커맨드 객체와 관련된 에러 정보를 추가. errors.reject("invalidldOrPassword", new Object[] {loginCommand.getId()}, null); |
// 에러 메시지 출력 #springBind("login") #springShowErrors("<br>" "") |
<p> <label for="id">#springMessage("login.form.id")</label> #springBind("login.id") <input type="text" name="${status.expression}" id="${status.expression}" value="$!status.value" /> #springShowErrors("<br/>" "") </p> <p> <label for="password">#springMessage("login.form.password")</label> #springFormPasswordInput("login.password" "") #springShowErrors("<br/>" "") </p> |
<b> 잘못된 ID나 암호를 입력하셨습니다. 입력한 ID는 124입니다. </b> |
#springFormInput("memberInfo.userId" "") #springShowErrors("<br/>" ":font-size:15pt;") |
// 에러 메시지는 두 번째 파라미터로 전달받은 값을 style 속성의 값으로 사용. <span style=":font-size:15pt; ">필수 항목입니다. </span> |
#springFormInput("memberInfo.name" "class='input'") #springShowErrors("<br/>" "error") |
// 에러 메시지는 두 번째 파라미터로 전달받은 값을 class 속성의 값으로 사용. <span class="error">필수 항목입니다. </span> |
<bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath" value="/WEB-INF/viewvmlayout/" /> <property name="velocityProperties"> ... </property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver" p:layoutUrl="/template/layout.vm" p:suffix=".vm" p:contentType="text/html; charset=EUC-KR" ... /> |
1) 컨트롤러의 처리 결과를 보여 줄 템플릿 파일을 찾은 뒤, 템플릿 파일로부터 결과 화면을 생성. 이때 생성된 결과 화면을 screen_content 변수에 저장. 2) layoutUrl 프로퍼티로 지정한 레이아웃 템플릿 파일을 파싱하여 결과 화면을 생성. 이때 레이아웃 템플릿 파일 은 $screen_content 변수를 사용하여 1단계에서 생성한 결과 화면을 내부에 포함 시킴. |
- /greeting/hello.htm 요청을 처리한 뒤 그 결과를 /hello.vm 템플릿 파일을 통해서 출력할 경우 /hello.vm을 통해서 생성된 결과
화면이 레이아웃으로 지정한 /template/layout.vm 템플릿 파일의 특정 영역에 삽입.
(layout.vm이 포함하고 있는 레이아웃이 hello.vm의 출력 결과에 적용되는 것.)
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>제목</title> </head> <body> #parse("/template/header.vm") <hr /> $screen_content <hr /> #parse("/template/footer.vm") </body> </html> |
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>제목</title> </head> <body> #parse("/template/header.vm") <hr /> <div id="left">#parse("/common/left_menu.vm")</div> <div id="content" class="content_side"> $screen_content </div> <hr /> #parse("/templat/footer.vm") </body> </html> |
/* a.vm 파일의 내용 */ #set($htmlTitleTail = '카페') ... #foreach ($content in $contents) ...$content.title ... #end ... |
/* layout.vm의 내용 */ <html> <title>세상을 즐겁게 변화시키는 DAUM #if($htmlTitleTail) : $htmlTitleTail #end</title> ... <body> ${screen_content} #parse("/common/bottom.vm") </html> |
<html> <title>세상을 즐겁게 변화시키는 DAUM : 카페 </title> ... <body> ... 글제목1 글제목2 ... |
#if($headVm) #parse($headVm) #else #parse("/templat/head.vm") #end ... |
#set ($headVm = '/template/head_wide.vm') ... |
#set($layout = "/template/layout_index.vm") ... |
○ VelocityLayoutViewResolver 특징
- Tiles나 Sitemesh 처럼 설정 파일을 사용하여 레이아웃을 관리할 수는 없지만, 레이아웃을 관리하는데 있어서 필요한 부분적인
레이아웃의 변경, 전체 레이아웃의 변경과 같은 기능을 사용.
출처 : http://blog.naver.com/PostView.nhn?blogId=chocolleto&logNo=30087127522