今天我们创建一个以servlet为基础的应用,该应用使用Freemarker FTL作为视图,而不是jsp.这会使你看到servlet+freemarker的整合。
这个应用非常简单:
有一个表展示用户信息,比如性和名。
可以添加新用户
在eclipse里建立dynamic web project,然后把freemarker.jar放到lib中。
然后修改web.xml,这个文件很长,别害怕,我们将拆解这里的代码,然后我们就会懂到底发生了什么。
<servlet>
<servlet-name>freemarker</servlet-name>
<servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
<!-- FreemarkerServlet settings: -->
<init-param>
<param-name>TemplatePath</param-name>
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>NoCache</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>ContentType</param-name>
<param-value>text/html; charset=UTF-8</param-value> <!-- Forces UTF-8 output encoding! -->
</init-param>
<!-- FreeMarker settings: -->
<init-param>
<param-name>template_update_delay</param-name>
<param-value>0</param-value> <!-- 0 is for development only! Use higher value otherwise. -->
</init-param>
<init-param>
<param-name>default_encoding</param-name>
<param-value>ISO-8859-1</param-value> <!-- The encoding of the template files. -->
</init-param>
<init-param>
<param-name>number_format</param-name>
<param-value>0.##########</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>freemarker</servlet-name>
<url-pattern>*.ftl</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>hello_servlet</servlet-name>
<servlet-class>net.viralpatel.freemarker.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello_servlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<!--
Prevent the visiting of MVC Views from outside the servlet container.
RequestDispatcher.forward/include should and will still work. Removing
this may open security holes!
-->
<security-constraint>
<web-resource-collection>
<web-resource-name>FreeMarker MVC Views</web-resource-name>
<url-pattern>*.ftl</url-pattern>
</web-resource-collection>
<auth-constraint>
<!-- Nobody is allowed to visit these -->
</auth-constraint>
</security-constraint>
首先,我们放置了这样一个条目:freemarker.ext.servlet.FreemarkerServlet.我们把所有对*.ftl的访问映射到了这个servlet,这样,所有以.ftl结尾的请求
都会被FreemarkerServlet处理
除此之外,我们还添加了一些参数,这些参数的意义都是不言自明的。可以看一下注释
FTL模板文件.ftl放在了webapp文件夹中,为了放置随意访问这些文件,我们在web.xml中加了安全限制。
package net.viralpatel.freemarker;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static List<User> userList = new ArrayList<User>();
static {
userList.add(new User("Bill", "Gates"));
userList.add(new User("Steve", "Jobs"));
userList.add(new User("Larry", "Page"));
userList.add(new User("Sergey", "Brin"));
userList.add(new User("Larry", "Ellison"));
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("users", userList);
request.getRequestDispatcher("/index.ftl").forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String firstname = request.getParameter("firstname");
String lastname = request.getParameter("lastname");
if(null != firstname && null != lastname
&& !firstname.isEmpty() && !lastname.isEmpty()) {
synchronized (userList) {
userList.add(new User(firstname, lastname));
}
}
doGet(request, response);
}
}
index.ftl
<table class="datatable">
<tr>
<th>Firstname</th> <th>Lastname</th>
</tr>
<#list users as user>
<tr>
<td>${user.firstname}</td> <td>${user.lastname}</td>
</tr>
</#list>
</table>
原文:
http://viralpatel.net/blogs/freemarker-servlet-tutorial-example/
源代码:http://pan.baidu.com/share/link?shareid=2294825673&uk=3878681452