본문 바로가기

Computer

Servlet & Velocity 연동


기본적인 MVC모델로 Person 모델에서 이름과 전화번호를 받아 벨로시티 파일에 뿌련주는 코드를 작성해 보았다. 스프링, 스트러츠와 벨로시티의 연동은 많지만 서블릿과 벨로시티의 연동은 찾기가 힘들어 좀 애먹긴 했다..^^a

* Model

package net.telbook.model;
public class Person{
 String name;
 String tel;
 
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getTel() {
  return tel;
 }
 public void setTel(String tel) {
  this.tel = tel;
 }
}

- Model이다. 별거 없다. name과 tel, 그리고 getter와 setter뿐...

* Controller

package net.telbook.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import net.telbook.model.Person;
public class TelBookController extends HttpServlet {
 @Override
 protected void doGet(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
 
  response.setContentType("text/html");
  response.setCharacterEncoding("euc-kr");
  VelocityEngine ve = new VelocityEngine();
 
  try {
   ve.init(getServletContext().getInitParameter("VelocityProperties"));
   
   ArrayList<Person> personList = new ArrayList<Person>();
   
   Person lenny = new Person();
  
lenny.setName("lenny");
  
lenny.setTel("6603");
   personList.add(
lenny);
   Person cafeteria = new Person();
   cafeteria.setName("Cafeteria");
   cafeteria.setTel("0804");
   personList.add(cafeteria);

   VelocityContext context = new VelocityContext();
   context.put("personList", personList);
   Template template = ve.getTemplate("telbook.vm");
   PrintWriter out = response.getWriter();
   template.merge(context, out);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

- controller.. 서블릿이다. 이 안에서 벨로시티를 설정한다.
1.
VelocityEngine ve = new VelocityEngine();
   벨로시티 엔진 객체를 생성하고..
2. ve.init(getServletContext().getInitParameter("VelocityProperties"));
   벨로시티 엔진 객체를 초기화 하는데 여기에 Velocity.properties가 인자로 들어간다.
3. ArrayList<Person> personList = new ArrayList<Person>();
   모델형 리스트를 설정하고 여기에 모델 객체를 집어 넣는다.
4.
VelocityContext context = new VelocityContext();
   벨로시티 컨텍스트를 설정하고
5.
context.put("personList", personList);
   모델 리스트를 풋!!
6.
Template template = ve.getTemplate("telbook.vm"); telbook.vm
   벨로시티 템플릿 파일을 가져와야지~
7.
template.merge(context, out);
   컨텍스트와 out의 합체!!

이젠 뷰 파일이 남았다!!


* View

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>TelBook View</title>
</head>
<body>
 #macro(tablerows $name $tel)
 <tr><td>$name</td><td>$tel</td></tr>
 #end
 <h2>TelBook</h2>
 <table border='1'>
  #tablerows("이름", "전화번호")
  #foreach($person in $personList)
   #tablerows($person.name, $person.tel)
  #end 
 </table>
 $date
</body>
</html>

오오~ 벨로시티 문법은 상당히 간단하다. 여기서 사용된 건, #macro#foreach 두개다.. 그런데 VTL을 보면 이게 끝인 것 같다..
#macro로 tablerows를 만들었다. 여기서 보면 $name과 $tel을 받아 테이블에서 제일 쓰기 귀찮은 <tr><td></td></tr>을 만들어 준다.
foreach는 리스트로 부터 person객체를 순차적으로 읽어 화면에 뿌려준다.

* web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>TelBook</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
 
  <context-param>
   <param-name>VelocityProperties</param-name>
   <param-value>d:/workspace/Servlet/TelBook/WEB-INF/velocity.properties</param-value>
  </context-param>
 
  <servlet>
    <servlet-name>TelBookController</servlet-name>
    <servlet-class>net.telbook.controller.TelBookController</servlet-class>
 </servlet>
  
 <servlet-mapping>
    <servlet-name>TelBookController</servlet-name>
    <url-pattern>/telbook.do</url-pattern>
 </servlet-mapping>
 
</web-app>

뭐 간단한 web.xml.. 그닥 새로운 건 안보인다.
ServletContext로 velocity.properties의 경로를 설정한 정도?
그런데 절대경로라는 점이 맘에 안든다.. 상대경로로 쓰는 방법이 있을 것 같은데.. 한번 찾아봐야겠다..


* velocity.properties

runtime.log = velocity_telbook.log
resource.loader = file
file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
file.resource.loader.cache = false
file.resource.loader.modificationCheckInterval = 0
file.resource.loader.path=D:/workspace/Servlet/TelBook/WEB-INF/view/
input.encoding = EUC-KR
output.encoding = EUC-KR

velocity.properties...
runtime.log = velocity_telbook.log : 런타임 로그를 기록한다.
resource.loader = file : 리소스 로더는 파일이라고? 아래 세부 설정에 사용될 식별자라는데  아직 잘 모르겠다 resource.loader = <name>이라고 써있는 걸 보니 이건 바꿀 수도 있는 듯 하다.
file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader : 리소스를 로드하는 클래스는 FileResourceLoader 이다.. 이 클래스는 파일을 절대경로로 읽어온다.
file.resource.loader.cache = false
: 리소스를 캐시 할 것인지 설정한다. true로 설정하면 실제로 벨로시티 템플릿 및 매크로가 캐시되기 때문에 개발과정에선 false로 하고 실제 서비스에서는 부하 발생을 줄이기 위해 true로 설정하는 것이 좋다.
file.resource.loader.modificationCheckInterval = 0
: 캐시된 리소스 변경을 체크하는 항목으로 간격(interval)을 설정한다.
file.resource.loader.path=D:/workspace/Servlet/TelBook/WEB-INF/view/
: 이부분이 바로 벨로시티 파일이 들어있는 절대경로!!

* 실행결과

사용자 삽입 이미지










오오!! 나왔다~

이렇게 기초적인 MVC모델을 만들어 보았다.
서블릿과 벨로시티를 연동하는 내용이 찾기 힘들어서 조금 삽질은 했다지만 ^^
다음에는 toolbox를 이용한 서블릿과 벨로시티의 연동으로 고고!!

'Computer' 카테고리의 다른 글

[Ubuntu] 한글 입력 및 인코딩  (0) 2008.07.30
Maven  (0) 2008.06.23
[Linux] Screen  (0) 2008.05.22
Class to Java 역컴파일러 JAD  (4) 2008.05.20
Velocity toolbox를 사용한 Servlet & Velocity 의 연동  (0) 2008.05.07