因爲最近項目裏面要求要使用freemarker技術來作展示層,因此在網上搜索了好多資料,基礎知識是看了李剛原來寫的那本《struts2權威指南》。一直想在網上找一個很基礎的例子來入門,可是不知道是個人緣由仍是怎麼的,找到的都不是很理想,並且網上基本上是一篇文章處處貼。因此鬱悶之下,就本身慢慢摸索寫出了一個入門的例子,能夠做爲本身的總結,也可讓更多的初學者快速入門。html
閒話少述,看例子。java
*****例子的整個目錄結構以下圖:web
說明:一、struts-tags.tld文件是由struts2的jar中拷貝出來的。apache
二、工程所有使用utf-8編碼。編程
關鍵的幾個文件:app
一、index.ftl:jsp
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"]/> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>freemarkerDemo</title> </head> <body> <@s.form action="users/users_login.action"> ${"用戶名"}:<@s.textfield name="username"/><br/> ${"密碼"}:<@s.password name="password"/><br/> <@s.submit value="sign on"/> </@s.form> </body> </html>
二、profile.ftl:ide
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"]/> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>freemarkerDemo</title> </head> <body> 姓名:${username} <br/> 密碼:${password} <br/> 年齡:${userInfo.age} <br/> 登陸時間:${userInfo.signinTime?string("yyyy-MM-dd HH:mm:ss")} <br/> QQ:${userInfo.qq} <br/> 地址:${userInfo.addr} <hr/> 個人書籍: <#list userInfo.books as book> ${book} </#list> </body> </html>
三、web.xml:ui
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>JspSupportServlet</servlet-name> <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
四、sturts.xml:this
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts.ui.theme" value="simple" /> <package name="users" extends="struts-default" namespace="/users"> <action name="users_*" class="com.pop.project.myftl.test.action.UserAction" method="{1}"> <result name="index" type="freemarker">/WEB-INF/ftl/index.ftl</result> <result name="profile" type="freemarker">/WEB-INF/ftl/profile.ftl</result> </action> </package> </struts>
五、UserAction:
package com.pop.project.myftl.test.action; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.opensymphony.xwork2.ActionSupport; import com.pop.project.myftl.test.bean.UserInfo; public class UserAction extends ActionSupport { private static final long serialVersionUID = 1L; private String username; private String password; private UserInfo userInfo; /** * 首頁 * @return */ public String index() { return "index"; } /** * 登陸 * @return */ public String login() { userInfo = new UserInfo() ; userInfo.setAddr("shaanxi baoji") ; userInfo.setAge(25) ; userInfo.setSigninTime(new Date()) ; userInfo.setQq("77276575") ; List<String> books = new ArrayList<String>() ; books.add("Thinking in Java") ; books.add("禪意花園") ; books.add("敏捷編程") ; books.add("代碼大全") ; userInfo.setBooks(books) ; return "profile" ; } // setters and getters public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public UserInfo getUserInfo() { return userInfo; } public void setUserInfo(UserInfo userInfo) { this.userInfo = userInfo; } }
UserInfo類是一個有幾個屬性的javabean,這裏就不用列了。
本身跑一下例子慢慢來吧。
運行結果:
注意:要想在Freemarker中使用Struts2標籤必須配置一個新SERVLET
<servlet> <servlet-name>JspSupportServlet</servlet-name> <servlet-class> org.apache.struts2.views.JspSupportServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>
2/ <reslutl>元素的type 屬性必須設置爲freemarker,這是由於Freemarker模板文件必須由Freemarker模板引擎來解析,而Struts2內部實現了 Freemarker模板引擎,但咱們必須聲明返回結果類型爲freemarker才能夠.
把result-type的freemarker類型聲明出來並定義成default的。 <result name="index" type="freemarker">這裏的type就能夠省了。
配置freemarker.properties,設置datetime_format=yyyy-MM-dd HH:mm:ss,
這個${userInfo.signinTime?string("yyyy-MM-dd HH:mm:ss")}
就能夠簡寫爲${userInfo.signinTime?datetime}