說明:該實例解決.ftl模板頁面跳轉問題。
解決servlet作用域存值動態改變模板內容。
doGet方法 和 doPost方法的靈活應用。
List 遍歷顯示 和 動態添加內容。
1. 首先我們來看一下項目結構圖:
2. 新建User實體類:
package net.viralpatel.freemarker; public class User { private String firstname; private String lastname; public User(){ } public User(String firstname,String lastname){ this.firstname=firstname; this.lastname=lastname; } public String getFirstname() { return firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } public String getLastname() { return lastname; } public void setLastname(String lastname) { this.lastname = lastname; } }
3. 新建HelloServlet類(繼承 HttpServlet):
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","王恆")); userList.add(new User("Steve","王恆")); userList.add(new User("Larry","王恆")); userList.add(new User("Sergey","王恆")); userList.add(new User("Larry","王恆")); } protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException { req.setAttribute("users", userList); req.getRequestDispatcher("/index.ftl").forward(req, resp); } protected void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException { String firstname=req.getParameter("firstname"); String lastname=req.getParameter("lastname"); if(null !=firstname && null != lastname && !firstname.isEmpty() && !lastname.isEmpty()){ synchronized (userList) { userList.add(new User(firstname,lastname)); } } doGet(req, resp); } }
注意:代碼中標紅內容 理解巧妙之處。
4. 新建index.ftl:
<html>
<head><title>ViralPatel.net - FreeMarker Hello World</title>
<body>
<form name="user" action="hello" method="post">
XiaoGongZhu: <input type="text" name="firstname" /> <br/>
XiaoXianNv: <input type="text" name="lastname" /> <br/>
<input type="submit" value="Save" />
</form>
<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>
</body>
</html>
5. 配置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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>Freemarker_Hello_World</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <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> </web-app>
注意:代碼中紅色標識為必須配置內容,其他可以根據自己需要進行配置。
6. 部署項目,測試 (http://localhost:8080/Freemarker_Hello_World/hello):
備注:可能遇到的錯誤,如:
解決辦法:檢查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>