首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

WebWork 2 + FreeMarker 實現數據列表顯示:從 Action 到模板的完整範例

     編輯:Java 相關知識

技術棧版本

  • WebWork 2.2+ (後併入 Struts 2)
  • FreeMarker 2.3+
  • JDBC 連接池 (範例自行封裝 DBConnManager)

專案結構

src/
├── com/action/TestAction.java          # Action
├── com/ResultGather.java               # 資料存取封裝
├── conn/DBConnManager.java             # 連接池
└── xwork.xml                           # Action 映射
template/
└── test.flt                            # FreeMarker 模板

核心代碼解析

1. Action:TestAction.java

public class TestAction extends ActionSupport {
    private List lis;           // 對應模板 ${lis}
    private ResultGather rs;

    public List getLis() { return lis; }

    public String execute() throws Exception {
        rs = new ResultGather();
        // 查詢所有用戶,回傳 List>
        lis = rs.selectRS("SELECT * FROM userbasedatum");
        return SUCCESS;
    }
}

2. 資料存取:ResultGather.java

public List selectRS(String sqlStr) {
    this.sql = sqlStr;
    return selectRS();
}

public List selectRS() {
    List rsall = new ArrayList();
    Connection con = null;
    Statement stmt = null;
    ResultSet rs = null;
    try {
        DBConnManager conn = DBConnManager.getInstance();
        con = conn.getConnection("mssql");
        stmt = con.createStatement();
        rs = stmt.executeQuery(sql);

        ResultSetMetaData rsmd = rs.getMetaData();
        int cols = rsmd.getColumnCount();

        while (rs.next()) {
            Map row = new HashMap(cols);
            for (int i = 1; i <= cols; i++) {
                row.put(rsmd.getColumnName(i), rs.getObject(i));
            }
            rsall.add(row);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        // 關閉資源...
    }
    return rsall;
}

關鍵:使用 ResultSetMetaData 動態獲取欄位名,構建 List 通用結構,FreeMarker 即可通用迭代。

3. xwork.xml 映射

<action name="test" class="com.action.TestAction">
    <result type="freemarker" name="success">/test.flt</result>
</action>

4. FreeMarker 模板:test.flt

<#list lis as x>
${x.username},${x.passWord}<br>
</#list>
  • <#list sequence as item> 迭代
  • ${item.key} 存取 Map 值 (FreeMarker 自動處理 null 顯示為空字串)
  • 無 JSP 標籤、Scriptlet,純模板語法

FreeMarker 進階語法速查

語法說明範例
${expr}輸出運算式結果${user.name}
<#if cond>...</#if>條件判斷<#if user.age > 18>成年</#if>
<#list seq as x>...</#list>迭代<#list users as u>${u.name}</#list>
<#include "inc.ftl">引入片段頁首/頁尾共用
<#macro name(p)>...</#macro>定義巨集可重用 UI 元件
?html, ?url, ?json_string內建轉義${content?html}
?size, ?first, ?last集合屬性<#if list?size > 0>

分頁擴展示意

// Action 新增分頁參數
private int page = 1;
private int pageSize = 10;
// SQL 改為分頁查詢 (SQL Server 2000: TOP + NOT IN / ROW_NUMBER)
// 模板新增分頁導航
<#if page > 1><a href="test.action?page=${page-1}">上一頁</a></#if>
<#if hasNext><a href="test.action?page=${page+1}">下一頁</a></#if>

優缺點評析

優點缺點
嚴格分離邏輯與視圖FreeMarker 語法學習曲線
模板可獨立測試 (無 Servlet 容器)標籤庫生態不如 JSP 豐富
效能優於 JSP (編譯為 Java 類、緩存)IDE 支援較弱 (早期版本)
支援巨集/繼承/包含,模組化強國際化 (i18n) 需自行整合

遷移至現代框架

  • Struts 2:WebWork 2 直接更名,配置檔改 struts.xml,FreeMarker 整合內建
  • Spring MVC:@Controller + FreeMarkerConfigurer + FreeMarkerViewResolver
  • Spring Boot:spring-boot-starter-freemarker 自動配置,模板放 src/main/resources/templates/
  • Thymeleaf:自然模板 (瀏覽器可直接預覽)、Spring 整合更緊密、現代首選

總結

WebWork 2 + FreeMarker 以 Action 封裝業務邏輯 → 返回 List 通用結構 → 模板純迭代輸出 實現乾淨的 MVC 分離。核心技巧在於 ResultSetMetaData 動態構建 Map,使模板不依賴具體領域類。此模式在現代 Spring MVC + Thymeleaf/FreeMarker 中依然適用,是「控制器薄、模板無邏輯、資料結構通用」的經典實踐。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved