和所有的介紹一樣,我們以Hello World開始,在以后所有的例子中,我們采用webwork/xwork作為Controller.
package cn.martin.freemarker.quickstart.action;

import com.opensymphony.xwork.ActionSupport;


/**
* @author martin
*/

public class HelloAction extends ActionSupport
{
private String message;


public String getMessage()
{
return message;
}


public String execute() throws Exception
{
this.message ="Hello World!";
return SUCCESS;
}
}我們的頁面很簡單,只是顯示message
<html>
<head>
<title>FreeMarker Quick Start</title>
</head>

<body>

${message}

</body>
</html>
- ${message}:稱為interpolations,FreeMarker會在輸出時用實際值進行替代,它會按以下的順序查找message變量
- The value stack
- The action context
- Request scope
- Session scope
- Application scope
- Built-in variables
如果沒有該變量,會拋出異常。
其他還有
- FTL標記(FreeMarker模板語言標記):以<#開頭,我們會在下面用到
- 注釋:包含在<#-
和->之間
配置xwork.xml
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">

<xwork>
<include file="webwork-default.xml"/>

<package name="default" extends="webwork-default">
<action name="demo"
class="cn.martin.freemarker.quickstart.action.HelloAction">
<result name="success" type="freemarker">/templates/demo.ftl</result>
</action>
</package>
</xwork>webwork.properties
# extension for actions
webwork.action.extension=

# spring integration
#webwork.objectFactory=spring
#webwork.objectFactory.spring.autoWire=type

### Configuration reloading
# This will cause the configuration to reload xwork.xml when it is changed
webwork.configuration.xml.reload=true

### Load custom default resource bundles
webwork.custom.i18n.resources=default

### character encoding
webwork.i18n.encoding=UTF-8
- 暫時我們用不到spring,沒有必要引人
- 至于后綴,個人愛好,我不喜歡那么多的東西,沒有任何后綴.
工程整體結構如下:

web.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<filter>
<filter-name>webwork</filter-name>
<filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
</filter>

<filter-mapping>
<filter-name>webwork</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>demo.action</welcome-file>
</welcome-file-list>
<taglib>
<taglib-uri>webwork</taglib-uri>
<taglib-location>/WEB-INF/lib/webwork.jar</taglib-location>
</taglib>
</web-app>
OK!deploy到server看一下結果:

Next:繼續前進
我們來將頁面做的更友好一些,用戶輸入姓名,顯示Hello + 用戶名
<html>
<head>
<title>FreeMarker Quick Start</title>
</head>

<body>

<#if userName?exists&&userName?has_content>
Hello ${userName}!
</#if>


<form action="demo" method="post">
Input your name:<input type="text" size="8" name="userName"/>
<input type="submit" value="Get Words"/>
</form>

</body>
</html>在該頁面中,我們見到一些奇怪的表達式
<#if userName?exists&&userName?has_content>

Hello $
{userName}!
</#if>
這是FreeMarker的表達式,暫時不管它,先了解一下即可,以后會有專門的介紹.
- userName?exists 判斷該變量是否存在
- userName?has_content 判斷該變量是否不為null并且不為empty
修改Action
package cn.martin.freemarker.quickstart.action;

import com.opensymphony.xwork.ActionSupport;

//**
* @author martin
*/

public class HelloAction extends ActionSupport
{
private String userName;


public void setUserName(String userName)
{
this.userName = userName;
}


public String getUserName()
{
return userName;
}


public String execute() throws Exception
{
System.out.println("HelloAction.execute() begin");
return SUCCESS;
}
}
結果如下:

代碼:freemarker.rar
去掉了webwork/xwork/freemarker lib,請自行添上。
參考:
xwork:http://www.opensymphony.com/xwork
webwork:http://www.opensymphony.com/
freemarker:http://freemarker.org/