Struts2 結合 Freemarker 實例


   Freemarker 是一個不依賴 web 容器的模板引擎,一個基於模板生成文本輸出的工具。其工作的原理如下圖:

  freemarker 不是一個 web 應用的框架,而適合作為 web 應用的一個組件。使用 freemarker ,可以用已經定義好的模板,生成各種想要的文件,在某些方面使用起來還是挺快捷的,例如使用 freemarker 編寫一個代碼生成器。本文就是一個結合 Struts2 web 應用框架的使用 Freemarker 的例子。具體的理論方面的知識,就不在此贅述了。

  這個例子是結合 Struts2 2.3.15版本,freemarker 2.3.19。主要的配置文件及代碼如下:

  (1)首先是配置 Struts2

  

  <!-- 配置 Struts2  -->
  <filter>
      <filter-name>struts2AFreemarker</filter-name>
      <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>struts2AFreemarker</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

  (2)其次是配置 Freemarker

  <!-- 配置 Freemarker    (不需要配置,只需要配置 JspSupportServlet 即可使用 Freemarker 組件,但是配置了,也不會有什么錯誤!)-->
  <servlet>
      <servlet-name>freemarker</servlet-name>
      <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
      <!-- 配置模板的路徑 -->
      <init-param>
          <!-- 配置模板存放的位置(我這里放在了主目錄下面) -->
          <param-name>TemplatePath</param-name>
          <param-value>/</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>freemarker</servlet-name>
      <url-pattern>*.ftl</url-pattern>
  </servlet-mapping>

  (3)然后就是配置 Struts.xml 文件,基本上和單獨使用 Struts 沒什么大的變動,就是在 result 的返回頁面時,type 類型要設為 freemarker ,這樣,響應的信息就可以交給 Freemarker 組件處理了。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />

    <package name="default" namespace="/" extends="struts-default">

        <default-action-ref name="index" />

        <global-results>
            <result name="error">/error.jsp</result>
        </global-results>

        <global-exception-mappings>
            <exception-mapping exception="java.lang.Exception" result="error"/>
        </global-exception-mappings>
        
        <action name="freemarker" class="com.struts2freemarker.test.action.FreemarkerAction">
            <result name="success" type="freemarker">
               /index.ftl
            </result>
        </action>
    </package>

    <include file="example.xml"/>

    <!-- Add packages here -->

</struts>

  (4)在 Action 中,使用正常的方法,如果想要將某個值傳到 Freemarker 的模板中時,只要將這個值綁定到相應的屬性中,就行了。我是將變量 freemarker 傳到 index.ftl 中,部分 action 代碼如下:

    /**
     * 序列編號
     */
    private static final long serialVersionUID = 1L;
    
    private String freemarker = "free";

    /**
     * 構造方法
     */
    public FreemarkerAction() {
        
    }
    
    public String execute(){
        
        log.info("execute 方法執行了!");
        
        return SUCCESS;
    }

    /**
     * @return the freemarker
     */
    public String getFreemarker() {
        return freemarker;
    }

    /**
     * @param freemarker the freemarker to set
     */
    public void setFreemarker(String freemarker) {
        this.freemarker = freemarker;
    }

  (5)具體的模板文件(index.ftl)如下:

<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] /> <#--這一句是為了讓Freemarker識別struts2的標簽 -->

            <#--struts-tags.tld ,如果沒有此文件,則在模板中,就不能使用 Struts2 的標簽了,但可以使用 Freemarker 的語言下的標簽 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>測試 Freemarker 的頁面</title> </head> <body> this is the testing Freemarker's page! <h1>${freemarker}</h1> <@s.form action="reg" > <@s.textfield label="用戶名" name="uname" /> <@s.submit /> </@s.form> </body> </html>

如上面所寫的,如果要想使用 Struts2 的標簽,還需要將 struts2-core-2.3.15.jar 的在 MATA-INF 下的 struts-tags.tld 文件復制出來,放到想要放置的位置。這里,我是放在了項目目錄下的 WEB-INF/struts-tags.tld 下,然后再在 web.xml 文件中,配置標簽的 Servlet ,如下:

<!-- 配置使用標簽時的標簽支持配置 --> 
 <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> 

這樣,就可以在 index.ftl 模板中,使用 Struts2 的標簽了。

  這樣,就完成了一個簡單的 Struts2 和 Freemarker 的整合了,使用起來還是挺容易的,適合模塊化開發,只要前台人員將頁面組織好,后台人員只需要將數據塞到指定的頁面中的位置就行了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM