FreeMarker作为Struts2的视图

Struts使用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 >

 虽然这样说明,相信我们还是一头雾水,下面我们将以一下简单的实例来指导大家真正会用FreeMarker.

2.登录示例:

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

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

login.ftl代码如下

<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />
<html>
<head>
<title>Login Form</title>
</head>
<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>
<head>
<title>Success</title>
</haed>
<body>
WelCome,${username},you logined!<br>
<a href="ShowInfo.action">Show Information</a>
</body>
</html>

showinfo.ftl代码如下:

<html>
<head>
<title>User Information</title>
<body>
<table border="1" width="360">
<caption>User Information</caption>

<tr>
<td>username:</td>
<td>${username}</td>
</tr>
<tr>
<td>sex:</td>
<td>${sex}</td>
</tr>
<tr>
<td>age:</td>
<td>${age}</td>
</tr>
</table>
</body>
</html>

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

String dir = "D:\\share\\JavaProjects\\oa\\freemarker\\src\\com\\bjsxt\\freemarker";
       
        Configuration cfg = new Configuration();
       
        //从什么地方加载模板文件
        cfg.setDirectoryForTemplateLoading(new File(dir));
       
        //忽略异常
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
       
        //定义模板
        Template template = cfg.getTemplate("test04.ftl");
       
        //定义数据
        Map root = new HashMap();
        root.put("name", "李四");
       
        //定义输出
        PrintWriter out
            = new PrintWriter(
                new BufferedWriter(
                    new FileWriter(dir+"\\test04_out.txt")
                )
            );
       
        //解释模板,并输出
        template.process(root, out);
       
    }
   
    //freemarker auto-import特性的演示
    public void testFreemarker05() throws Exception{
       
        String dir = "D:\\share\\JavaProjects\\oa\\freemarker\\src\\com\\bjsxt\\freemarker";
       
        Configuration cfg = new Configuration();
       
        //从什么地方加载模板文件
        cfg.setDirectoryForTemplateLoading(new File(dir));
       
        //忽略异常
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
       
        //自动引入的特性,自动import其他的模板文件
        cfg.addAutoImport("my", "common.ftl");
       
        //定义模板
        Template template = cfg.getTemplate("test05.ftl");
       
        //定义数据
        Map root = new HashMap();
        root.put("name", "李四");
       
        //定义输出
        PrintWriter out
            = new PrintWriter(
                new BufferedWriter(
                    new FileWriter(dir+"\\test05_out.txt")
                )
            );
       
        //解释模板,并输出
        template.process(root, out);

(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="GetBooks" class="com.test.action.GetBooksAction">
   <result name="login" type="freemarker">/WEB-INF/ftl/login.ftl</result>
   <result name="success" type="freemarker">/WEB-INF/ftl/showBook.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>

到现在为止,我们的示例已经全部写好啦,接焉就是我们要启动Tomcat,打开IE,在地址栏上输入:http://localhost:8080/struts2/login.action 就可以看到该示例的效果。

上面虽然是一个很简单的示例,但用来入门应该算不错,希望大家继续加深对FreeMarker的认识。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/csuliky/archive/2009/06/08/4251433.aspx

你可能感兴趣的:(freemarker,Web,struts,servlet,360)