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