和所有的介绍一样,我们以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
  1. 暂时我们用不到spring,没有必要引人
  2. 至于后缀,个人爱好,我不喜欢那么多的东西,没有任何后缀.

工程整体结构如下:

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的表达式,暂时不管它,先了解一下即可,以后会有专门的介绍.

  1. userName?exists 判断该变量是否存在
  2. 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/

分享到:
评论