FreeMarker系列学习笔记(2)

使用FreeMarker作为Struts2的视图技术
  Struts2使用FreeMarker作为其黙认的模板技术,因此Strus2对FreeMarker的支持非常良好。因此,为了在Struts2应用中使用FreeMarker模板技术,只需要在Struts.xml文件中进行简单配置即可。
一.在FreeMarker模板中使用Struts2标签.
  虽然FreeMarker自己提供了一些FTL指令,可以对数据模型中的数据进行迭代输出,也提供了一定的条件判断能力。但Struts2提供的标签远不止于此,它还提供了一系列的表现标签,例如form标签等。因此,还是需要在FreeMarker模板中使用Strut2标签.
  在FreeMarker模板中使用标签毕竟不同于在jsp页面中使用标签,因为FreeMarker不支持使用taglib指令来导入标签库。但Struts2为了在FreeMarker模板中使用标签库,提供了额外的支持。

  为了在FreeMarker模板中使用标签库,可按如下步骤进行
第一步
将系统所需的标签库定义文件(也就是*.tld文件)复制到web应用中,对于struts2系统,则需要将Struts2-core.ja压缩文件中的struts-tags.tld文件释放出来,并复制到了web应用中,具体来说就是复制到WEB-INF目标下。
第二步
在web.xml文件中启动JspSupportServlet,需要在web.xml文件中作如下配置

<servlet>
  <servlet-name>JspSupportServlet</servlet-name>
  <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
        <!--配置JspSupportServlet自启动-->
  <load-on-startup>1</load-on-startup>
</servlet>
第三步
在FreeMarker模板中使用assign指令导入标签库。导入标签库的代码如下
<#--定义web-inf/strust-tags.tld文件对应的标签库前缀为s-->
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />

在上面导入的标签库定义文件中,指定了标签库前缀为s,而该前缀对应的标签库定义文件主放置在/WEB-INF/struts-tags.tld路径下

第四步
在FreeMarker模板中增加了标签库定义后,就可以在FreeMarker模板中使用Struts2标签了。在FreeMarker使用标签与在jsp中使用标签略有差别.
下面是FreeMarker模板中使用标签的代码示例
<#--在FreeMarker模板中使用Struts2标签-->
<@s.form action="Login.action">
<@s.textfield name="username" label="用户名"/>
<@s.textfield name="password" label="密码"/>
<@s.submit value="提交"/>
</@s.form>

如果是在jsp中,则使用下述代码
<s:form action="Login.action">
<s:textfield name="username" label="用户名"/>
<s:textfield name="password" label="密码"/>
<s:submit value="提交"/>
</s:form>

经过上述步骤后,即可在应用的FreeMarker模板中使用Struts2标签。使用Struts2标签的FreeMarker模板如下

<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />
<html>
<head>
<title>登录页面</title>
</head>
<body>
请输入用户名和密码来登陆<br>
<@s.form action="Login.action">
<@s.textfield name="username" label="用户名"/>
<@s.textfield name="password" label="密码"/>
<@s.submit value="提交"/>
</@s.form>
</body>
</html>





补充一点说明
  我们不能直接通过浏览器直接请求该页面,否则看到的不是我们想要的结果,而是该模板页面的源代码(WEB容器默认不会处理 FreeMarker模板页面的)

正如前面使用FreeMarker模板作为视图组件时看到的,FreeMarker 作为视图组件是由Servlet负责加载该模板,并使用数  据模型填充该模板,并且填充后的标准HTML响应输出给浏览者。
  在Strtus2框架的支持下,Struts2框架充当了之前的Servlet角色,只要浏览者的请求经过了Struts2处理后,Struts2框架就会自动加载FreeMarker模板,并使用数据模型填充该模板,并且将最后的HTML页面输出给浏览者.
  为了让所有的用户请求都经过Struts2框架处理,我们将所有的FreeMarker框架放在web-inf/ftl路径下.
  因为浏览者无法直接访问web-inf/ftl路径下的资源,所以我们在struts.xml配置文中增加了如下配置片段
        <action name="*">
            <result type="freemarker">/WEB-INF/ftl/{1}.ftl</result>
        </action>

       在上面配置片段中,配置了一个能匹配所有请求的Action,该Action被映射到一个动态Result,这个动态Result是根据请求来决定的
       因为增加了上面的配置片段,在浏览器中请求login.action,该Action将被转向到login.ftl模板。具体效果如下





struts.xml文件内容如下
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="GBK"/>

    <package name="ish" extends="struts-default">
        <action name="Login" class="ish.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="ish.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="*">
            <result type="freemarker">/WEB-INF/ftl/{1}.ftl</result>
        </action>
    </package>
</struts>



二.使用FreeMarker Result
  对于Struts2应用中Action而言,使用FreeMarker模板 和 使用jsp页面作为视图组件没有任何区别,Action一样是取得用户请求参数,处理用户请求,返回一个逻辑视图
本应用的Action代码如下
package ish;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;


public class LoginAction implements Action
{
    private String username;
    private String password;

    public String getUsername()
{
        return username;
    }
    public void setUsername(String username)
{
        this.username = username;
    }

    public String getPassword()
{
        return password;
    }
    public void setPassword(String password)
{
        this.password = password;
    }

public String execute() throws Exception
{
        if (getUsername().equals("scott")
                && getPassword().equals("tiger") )
  {
   ActionContext.getContext().getSession().put("user" , getUsername());
            return SUCCESS;
        }
  else
  {
            return ERROR;
        }
    }
}

  这个Action类与前面的Action类没有任何区别。配置该Action的Result时,需要使用FreeMarker类型的Result,该Result意味着使用FreeMarker模板作为视图组件

配置该Action的配置片段如下
        <action name="Login" class="ish.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类代码看出,当用户输入的用户名为scott,密码为tiger时,即可完成转入success逻辑视图。

success对应的视图为/web-inf/ftl/welcome.ftl模板
该模板的代码如下
<html>
    <head>
        <title>成功页面</title>
    </head>
    <body>
        欢迎,${user},您已经登录!<br>
<a href="GetBooks.action">查看作者李刚已出版的图书</a>
    </body>
</html>








当点击查看链接时,转入GetBooks.action,即
GetBooks对应的Action 代码如下

package ish;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
public class GetBooksAction implements Action
{
//用于初始化books属性的初始化块
//静态块 在类加载的时候,就先加载到内存中了
{
  books = new String[]{
   "Spring2.0宝典" ,
   "轻量级J2EE企业应用实战",
   "基于J2EE的Ajax宝典",
   "Struts,Spring,Hibernate整合开发"
  };
}
//用于封装全部图书的属性
private String[] books;
//返回books属性的getter方法
public String[] getBooks()
{
  return books;
}
//用于用户请求的execute方法
public String execute() throws Exception
{
  String user = (String)ActionContext.getContext().getSession().get("user");
  if (user != null && user.equals("scott"))
  {
   return SUCCESS;
  }
  else
  {
   return LOGIN;
  }
    }
}

配置该Action的配置片段如下
        <action name="GetBooks" class="ish.GetBooksAction">
            <result name="login" type="freemarker">/WEB-INF/ftl/login.ftl</result>
            <result name="success" type="freemarker">/WEB-INF/ftl/showBook.ftl</result>      
        </action>

showBook.ftl模板文件对应的代码如下

<html>
    <head>
        <title>作者李刚的图书</title>
    </head>
    <body>

<table border="1" width="360">
<caption>作者李刚的图书</caption>
<#list books as book>
<tr>
  <td>书名:</td>
  <td>${book}</td>
</tr>
</#list>
</table>

    </body>
</html>

猜你喜欢

转载自zyongpei.iteye.com/blog/1541870