Struts2
使用
FreeMarker
作为其默认的模板技术,因此
Struts2

FreeMarker
的支持非常良好。因此,为了
Struts2
应用中使用
FreeMarker
模板技术,只需要在
struts.xml
文件中进行简单配置即可。

由于
FreeMarker
自供的
FTL
指令的能力非常有限,让我们编写一些相对复杂的界面里有点力不从心。不过不用担心,
Struts2
已经为我们提供了额外的标签库的支持。


1.
要在
FreeMarker
模板使用标签库,只要四步,如下:


(1)解压
struts2-core-X.X.X.jar
文件,把在
META-INF
文件夹下面的
struts-tags.tld
文件复制到
WEB-INF
文件夹下。



(2)在
web.xml
文件中启动
JSPSupportServlet.
代码如下:


<servlet>

<!-- define a JspSupportServlet Object -->

<servlet-name>JspSupportServlet</servlet-name>

<servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>

<!-- setting JspSupportServlet auto start -->

<load-on-startup>1</load-on-startup>

</servlet>


(3)在
FreeMarker
模板中使用
assign
指令导入标签库。代码如下


<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />
注:这里我把
struts-tags.tld
放在
WEB-INF
下面



4
)现在我们可以在
FreeMarker
模板中使用标签了,示例代码如下:


<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />

<@s.form action="login">

<@s.textfield name="username" label="username"/>

<@s.submit value="login" />

</@s.form >


2.
登录示例:



1
)在
WEB-INF
文件夹下面建立一个名为
ftl
的文件夹,其实就是
FreeMarker
容器,我们把所有的
ftl
文件都放在里面。


现在我们先在下面建立三个名字分别为
login.ftl,welcome.ftl,showinfo.ftl
的文件。


login.ftl
代码如下

<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />

<html>……

<body>

please input username and password login<br>

<@s.form action="Login.action">

<@s.textfield name="username" label="username"/>

<@s.password name="password" label="password" />

<@s.submit value="submit" />

</@s.form >

</body>

</html>


welcome.ftl
代码如下:

<html>…WelCome,${username},you logined!<br>

<a href="ShowInfo.action">Show Information</a>…</html>


showinfo.ftl



2
)从上面的
ftl
中我们可以看出,我们必须建立两个
Action



我是在
com.test.action
包下建立
Action
的。


LoginAction.java ShowInfo.java



3
)剩下的就是配置文件啦,也就是
struts.xml

代码片段如下:

<!--
因为浏览者无法直接访问
WEB-INF/ftl
路径下的资源,所以我们在
struts.xml
文件中配置下面片段代码。

也就是配置了一个能匹配所有请求的
Action,

Action
被映射到一个动态
Result. -->

<action name="*">

<result type="freemarker">/WEB-INF/ftl/{1}.ftl</result>

</action>


<!-- define a LoginAction -->

<action name="Login" class="com.test.action.LoginAction">

<result name="error" type="freemarker">/WEB-INF/ftl/error.ftl</result>

<result name="success" type="freemarker">/WEB-INF/ftl/welcome.ftl</result>

</action>

<action name="ShowInfo" class="com.test.action.ShowInfo">

<result name="login" type="freemarker">/WEB-INF/ftl/login.ftl</result>

<result name="success" type="freemarker">/WEB-INF/ftl/showinfo.ftl</result>

</action>


3 、国际化
        类似 JSP+Struts2 的国际化,可参考: ​​​Struts2的国际化​​​
( 1 )准备资源属性文件
baseName_language_country.properties 
baseName_language.properties 
baseName.properties

( 2 ) Struts2 加载全局资源文件  
加载全局资源文件的方式是通过配置常量来实现的。( struts.custom.i18n.resources )
        具体配置:在 struts.properties 配置文件中增加以下信息
        struts.custom.i18n.resources =  baseName (文件名,不含后缀)

( 3 )访问国际化资源  
ftl 页面输出:
A :不带占位符的信息加载
login.title = welcome into page
<@s.text   用 name 属性来加载资源文件的 key 值。  
或 <@s.property value="%{getText('login.title')}"/>

B
:带占位符的信息加载

login.title
=
welcome {0} into {1} page
<@s.text name="login.title">

<@s.param>hello</@s.param>

<@s.param>index</@s.param>

</@s.text>


<@s.property value="%{getText('login.title',{'hello','index'})}"/>


C
:在表单标签中加载信息

login.name
=
login name

<@s.textfield label="%{getText('login.name')}" name="name"/>

<@s.textfield label="%{getText('login.title',{'hello','index'})}" name="name2"/>

如果占位符对应的参数来自
Action
,那么可以直接在
action
中调用国际化返回一个参数变量即可。

<@s.textfield label="%{tab1}" name="address3"/>


<@s.textfield label="${tab1}" name="address5"/>
均可正常显示。


Action
中访问:


Action
类中获取带占位符的国际化信息,可以使用
getText(String key, String[] args)

getText(String aTextName, List args)
方法。

login.title
=
welcome into page


String[]
mess
=
new
String[]{
"
数组占位值
1"
,
"
数组占位值
2"
};

System.
out
.println(getText(
"login.title"
,
mess
));

String
mes1
=
"
单一占位值
1"
;String
tab2
=
"
单一占位值
2"
;

System.
out
.println(getText(
"login.title"
,
new
String[]{
mes1
,
mes2
}));


以上显示均通过测试。