摘要: 喜欢 Confluence 最主要的原因其实是因为我喜欢他强大的wiki语法,今天闲的无事,试着用javascript写了看看:
<html><head> <title>Demo</title> <link rel="stylesheet"&...
阅读全文
和所有的介绍一样,我们以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/
http://ideas.live.com/Windows Live Messenger Beta 邀请,需要的留msn