和所有的介绍一样,我们以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;
}
}
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 >
< 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 >
"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
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 >
<! 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>
<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>
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;
}
}
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/