기본적인 MVC모델로 Person 모델에서 이름과 전화번호를 받아 벨로시티 파일에 뿌련주는 코드를 작성해 보았다. 스프링, 스트러츠와 벨로시티의 연동은 많지만 서블릿과 벨로시티의 연동은 찾기가 힘들어 좀 애먹긴 했다..^^a
* Model
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
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
@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);
cafeteria.setName("Cafeteria");
cafeteria.setTel("0804");
personList.add(cafeteria);
VelocityContext context = new VelocityContext();
context.put("personList", personList);
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
<html>
<head>
</head>
<body>
#macro(tablerows $name $tel)
<tr><td>$name</td><td>$tel</td></tr>
#end
<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
<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
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/
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 |