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

Struts2 參數接收全解析:三種核心方式與集合數據綁定實戰

     編輯:Java 綜合教學

Struts2 參數接收全解析:三種核心方式與集合數據綁定實戰

在 Struts2 開發中,Action 接收前端傳遞的參數是最基礎也最關鍵的環節。本文將系統梳理三種主流接收方式——Action 屬性直接接收、Domain Model 封裝接收、ModelDriven 模型驅動接收,並深入講解 List 集合與巢狀物件的綁定技巧,助你靈活應對各類表單提交場景。

一、Action 屬性直接接收——最直觀的入門方式

這是最符合直覺的做法:在 Action 類中定義與表單字段同名的私有屬性,並提供對應的 Getter/Setter。Struts2 的參數攔截器會自動根據名稱匹配完成賦值。

1.1 實戰步驟演示

步驟 1:建立登入頁面 login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>用戶登入</title>
</head>
<body>
    <form action="loginAction.action" method="post">
        用戶名:<input type="text" name="username">
        密碼:<input type="password" name="password">
        <input type="submit" value="登入">
    </form>
</body>
</html>

步驟 2:編寫 LoginAction

package com.zzh.action;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    private String username;
    private String password;

    // Getter/Setter 省略

    public String login() {
        System.out.println("接收到用戶名:" + username);
        // 此處可接續業務邏輯驗證
        return SUCCESS;
    }
}

步驟 3:配置 struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "https://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="login" extends="struts-default" namespace="/">
        <action name="loginAction" method="login" class="com.zzh.action.LoginAction">
            <result name="success">/success.jsp</result>
        </action>
    </package>
</struts>

步驟 4:建立成功頁面 success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html><body>你好!歡迎登入系統</body></html>

啟動 Tomcat 訪問 https://localhost:8080/專案名/login.jsp,輸入用戶名密碼提交,控制台即可輸出接收到的參數,頁面跳轉至成功頁。

二、Domain Model 封裝接收——物件導向的最佳實踐

隨著業務增長,Action 中堆砌大量屬性會導致代碼膨脹。此時應引入領域模型(如 User 類)封裝相關屬性,Action 僅持有模型對象引用。

2.1 重構步驟

1. 建立 User 實體類

package com.zzh.us;

public class User {
    private String username;
    private String password;
    // Getter/Setter 省略
}

2. 修改 LoginAction 持有 User 對象

package com.zzh.action;

import com.zzh.us.User;
import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    private User user;

    public User getUser() { return user; }
    public void setUser(User user) { this.user = user; }

    public String login() {
        System.out.println("Domain Model 接收:" + user.getUsername());
        return SUCCESS;
    }
}

3. 關鍵點:JSP 中需指定屬性所屬對象

<form action="loginAction.action" method="post">
    用戶名:<input type="text" name="user.username">
    密碼:<input type="password" name="user.password">
    <input type="submit" value="登入">
</form>

表單字段名採用 對象名.屬性名 格式,OGNL 表達式引擎會自動實例化 User 並賦值。若頁面存在多個同屬性名的對象,此寫法可有效避免衝突。

三、ModelDriven 模型驅動接收——極簡開發體驗

實現 ModelDriven<T> 介面,Action 直接成為模型的代理,JSP 表單字段無需前綴即可映射,代碼更乾淨。

3.1 核心實現

package com.zzh.action;

import com.zzh.us.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class LoginAction extends ActionSupport implements ModelDriven<User> {
    private static final long serialVersionUID = 1L;
    private User user = new User(); // 必須預先實例化

    @Override
    public User getModel() {
        return user;
    }

    public String login() {
        System.out.println("ModelDriven 接收:" + user.getUsername());
        return SUCCESS;
    }
}

3.2 JSP 簡化為無前綴寫法

<form action="loginAction.action" method="post">
    用戶名:<input type="text" name="username">
    密碼:<input type="password" name="password">
    <input type="submit" value="登入">
</form>

注意:一個 Action 僅能對應一個 Model,不適用於需綁定多個獨立模型的場景。

四、集合與巢狀物件綁定進階

實際開發中常需接收列表數據(如多書籍、多收貨地址),Struts2 透過下標或屬性鏈完美支援。

4.1 接收 List<String> 簡單集合

User 類新增屬性

private List<String> bookList; // 含 Getter/Setter

JSP 使用下標命名

書籍1:<input type="text" name="bookList[0]">
書籍2:<input type="text" name="bookList[1]">

Action 驗證

System.out.println(user.getBookList().get(0)); // 輸出第一本書名

4.2 接收 List<User> 巢狀物件集合

若書單變為物件列表,JSP 需進一步指定屬性:

書籍1:<input type="text" name="bookList[0].username">
書籍2:<input type="text" name="bookList[1].username">

Action 取值同理:

System.out.println(user.getBookList().get(0).getUsername());

測試結果顯示後台完美接收到巢狀物件屬性值。

五、總結與選型建議

方式優點缺點適用場景
Action 屬性簡單直觀,零配置屬性多時類膨脹,難維護極簡表單、原型開發
Domain Model物件導向清晰,支援多模型共存JSP 需加前綴,稍繁瑣中大型專案、多模型表單
ModelDriven代碼最精簡,JSP 無前綴單 Action 單模型,靈活度受限單一核心模型的 CRUD 操作

實戰中建議:以 Domain Model 為主,輔以 ModelDriven 處理核心單一模型,複雜集合綁定靠下標/屬性鏈解決。掌握三種方式的優劣與轉換,才能在 Struts2 參數接收上遊刃有餘。

登入頁面截圖

控制台輸出截圖

成功頁面截圖

集合綁定測試截圖

控制台集合輸出截圖

巢狀物件測試截圖

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