Struts2表格動態明細向後臺傳值。

来源:https://www.cnblogs.com/kuroimachi/archive/2019/08/27/11421140.html
-Advertisement-
Play Games

最近培訓新人,最後練習使用Struts2框架練習,但是聯繫中碰到了畫面List對象傳後臺無法傳遞的問題。網上看了一圈沒有找到對應的解決辦法。最後自己找到了一種,寫下來後面可以再看。 註:方法千千萬,有其他能解決的,或者我寫的有不對的地方歡迎指正! 上圖表格裡面的就是我想上傳到後臺的內容,因為下麵的更 ...


最近培訓新人,最後練習使用Struts2框架練習,但是聯繫中碰到了畫面List對象傳後臺無法傳遞的問題。網上看了一圈沒有找到對應的解決辦法。最後自己找到了一種,寫下來後面可以再看。

註:方法千千萬,有其他能解決的,或者我寫的有不對的地方歡迎指正!

上圖表格裡面的就是我想上傳到後臺的內容,因為下麵的更新按鈕,刪除按鈕想要多條操作,所以最省心的辦法就是整表提交(當然也有通過js把選中的對象拼成字元串再傳到後臺分割,但是太low了。。。)

解決辦法:

兩個javaBean:ResultBean 和 ResultDetailBean(ResultDetailBean嵌套在ResultBean中)

ResultBean代碼:

package Bean;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class ResultBean {
    private String stuId = "";
    private String stuName = "";
    private String classes = "";
    private BigDecimal grade;
    private String sex = "";
    private String detailSize = "";
    //ResultDetailBean的get set方法
    private List<ResultDetailBean> detailList = new ArrayList<ResultDetailBean>();

    /**
     * @return the stuId
     */
    public String getStuId() {
        return stuId;
    }

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

    /**
     * @return the stuName
     */
    public String getStuName() {
        return stuName;
    }

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

    /**
     * @return the classes
     */
    public String getClasses() {
        return classes;
    }

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

    /**
     * @return the grade
     */
    public BigDecimal getGrade() {
        return grade;
    }

    /**
     * @param grade
     *            the grade to set
     */
    public void setGrade(BigDecimal grade) {
        this.grade = grade;
    }

    /**
     * @return the sex
     */
    public String getSex() {
        return sex;
    }

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

    public List<ResultDetailBean> getDetailList() {
        return detailList;
    }

    public void setDetailList(List<ResultDetailBean> detailList) {
        this.detailList = detailList;
    }

    public String getDetailSize() {
        return detailSize;
    }

    public void setDetailSize(String detailSize) {
        this.detailSize = detailSize;
    }
}

ResultDetailBean的代碼:

package Bean;

public class ResultDetailBean {
    private String no = "";
    private String sel = "0";
    private String curId = "";
    private String curName = "";
    private String score = "";

    /**
     * @return the no
     */
    public String getNo() {
        return no;
    }

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

    /**
     * @return the sel
     */
    public String getSel() {
        return sel;
    }

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

    /**
     * @return the curId
     */
    public String getCurId() {
        return curId;
    }

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

    /**
     * @return the curName
     */
    public String getCurName() {
        return curName;
    }

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

    /**
     * @return the score
     */
    public String getScore() {
        return score;
    }

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

JavaBean已經定義完了,接下來就是和Action進行綁定,我是用的是模型驅動,通過實現ModelDriven介面來進行綁定

代碼:

package Action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

import Bean.ResultBean;
import Bean.ResultDetailBean;

public class DeleteAction extends ActionSupport implements ModelDriven<ResultBean> {
    private ResultBean resultB = new ResultBean();

    /*
     * (non-Javadoc)
     * 
     * @see com.opensymphony.xwork2.ActionSupport#execute()
     */
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    public String execute() throws Exception {
System.out.println("No.     Sel    Curriculum Id");
for (ResultDetailBean detail : resultB.getDetailList()) { System.out.println(detail.getNo() + "    " + detail.getSel() + "    " + detail.getCurId()); } return SUCCESS; } @Override public ResultBean getModel() { return resultB; } }

可以看到這種綁定之後我們在execute方法中可以直接使用實例化好的對象進行操作。

struts.xml中的定義:

<?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>
    <package name="default" namespace="/" extends="struts-default">
        <action name="keyInAction" class="Action.KeyInAction">
            <result name="success" type="redirectAction">/resultAction</result>
            <result name="error">/Key-In.jsp</result>
        </action>
        <action name="resultAction" class="Action.ResultAction">
            <result name="success">/Result.jsp</result>
        </action>
        <action name="deleteAction" class="Action.DeleteAction">
            <result name="success">/Result.jsp</result>
        </action>
    </package>
</struts>

接下來是jsp頁面的代碼:

 

Result.jsp:<%@ page language="java" contentType="text/html; charset=ISO-8859    pageEncoding="ISO-8859-1"%><%@ taglib prefix="s" uri="/struts-tags"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<style type="text/css">
table.PCxxxx_table2 {
    border-top: 1px solid #696969;
    border-left: 1px solid #696969;
    border-collapse: collapse;
    border-spacing: 0;
    background-color: #ffffff;
}

.PCxxxx_table2 tr {
    
}

.PCxxxx_table2 th {
    color: #000000;
    background-color: #C0C0C0;
    padding: 0px 1px;
    text-align: center;
    border: 1px solid #696969;
}

.PCxxxx_table2 td {
    height: 26px;
    padding: 0px 1px;
    border: 1px solid #696969;
    vertical-align: middle;
}
</style>
<script type="text/javascript">
    function deleteButton() {
// 指向上面編輯的deleteAction document.resultAction.action
= "deleteAction";
// 提交 document.resultAction.submit(); }
function setCheckbox() { var detailSize = document.getElementById("detailSize").value; for (var i = 0; i < detailSize; i++) { if(document.getElementById("sel" + i).value == "1"){ document.getElementById("chk"+i).checked = "checked"; } } } function set(index) { if(document.getElementById("chk"+index).checked == "checked"){ document.getElementById("chk"+index).checked = ""; document.getElementById("sel"+index).value=""; }else{ document.getElementById("chk"+index).checked = "checked"; document.getElementById("sel"+index).value="1"; } } </script> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body onload="setCheckbox();"> <form name="resultAction" action="resultAction" method="post"> <input type="hidden" name="detailSize" value="${detailSize}" id="detailSize"> <table> <tr> <td> <table> <tr> <td colspan="3"><span>Students Score MainTenance Result</span></td> </tr> <tr> <td colspan="3"><hr></td> </tr> <tr> <td width="100px">Student Id</td> <td align="left" width="50px"><s:text name="stuId" /></td> <s:hidden name="stuId" value="%{stuId}"></s:hidden> <td width="100px">Student Name</td> <td align="left" width="50px"><s:text name="stuName" /></td> <s:hidden name="stuName" value="%{stuName}"></s:hidden> <td width="100px"></td> <td align="left" width="50px"></td> </tr> <tr> <td width="100px">Class</td> <td align="left" width="50px"><s:text name="classes" /></td> <s:hidden name="classes" value="%{classes}"></s:hidden> <td width="100px">Grade</td> <td align="left" width="50px"><s:text name="grade" /></td> <s:hidden name="grade" value="%{grade}"></s:hidden> <td width="100px">Sex</td> <td align="left" width="50px"><s:text name="sex" /></td> <s:hidden name="sex" value="%{sex}"></s:hidden> </tr> <tr> <td colspan="3"><hr></td> </tr> </table> </td> </tr> <tr> <td>
// list表格開始部分
<table border="1" class="PCxxxx_table2"> <tr> <th width="30px">No.</th> <th width="30px">Sel</th> <th width="150px">Curriculum Id</th> <th width="150px">Curriculum Name</th> <th width="30px">Score</th> </tr> <s:iterator value="detailList" status="status"> <tr> <td><s:property value="no"></s:property></td>
//這裡舉了text和CheckBox的例子 只需要這樣寫就可以了 但是單選框type=“radio”的項目目前查到的資料是無法提交後臺的,我的建議是新建一個欄位“狀態”,專門用來保存單選框是否選中,當然這個“狀態”欄位需要type=“hidden”的標簽隱藏保存值。 <td><input type="checkbox" name="sel${status.index}" id="chk${status.index}" onclick="set(${status.index});" /></td> <td><input type="text" name="detailList[${status.index}].curId" value="${curId}" /></td> <td><s:property value="curName"></s:property></td> <td><s:property value="score"></s:property></td> </tr> </s:iterator>
//需要註意的是要向把紙傳遞到後臺畫面顯示用欄位需要添加隱藏項,不然頁面是不會保存純顯示用欄位的
<s:iterator value="detailList" status="status"> <input type="hidden" value="<s:property value="no"/>" name="detailList[${status.index}].no" /> <input type="hidden" value="<s:property value="sel"/>" name="detailList[${status.index}].sel" id="sel${status.index}" /> <input type="hidden" value="<s:property value="curName"/>" name="detailList[${status.index}].curName" /> <input type="hidden" value="<s:property value="score"/>" name="detailList[${status.index}].score" /> </s:iterator> </table> </td> </tr> <tr> <td> <table> <tr> <td><input type="button" onclick="" value="Update(U)"></td> <td><input type="button" onclick="deleteButton();"//這邊只實現了刪除按鈕壓下後的操作deleteButton()中指定跳轉的action以及提交。 value="Delete(D)"></td> <td><input type="button" onclick="history.back();" value="Back(B)"></td> </tr> </table> </td> </tr> </table> </form> </body> </html>

附上最後實現結果

Delete按鈕按下後的後臺顯示效果:

 

結果:後臺確實能獲取到無論隱藏值“No”,覆選框“Sel”,text框“Curriculum Id”的值了。

以上關於Struts2表格List動態大小的項目像後臺傳值的解決辦法已經介紹完了。方法不止這一種就是了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • AOP (Aspect Oriented Programming)是Spring中一種重要的編程思想。AOP涉及Aspect、Advice、Join point、Pointcut、Weaving、Target等多個概念,實現依賴於Spring中的@Aspect、@Pointcut、@Before、@... ...
  • 概覽 MySQL數據操作: DML 在MySQL管理軟體中,可以通過SQL語句中的DML語言來實現數據的操作,包括 1. 使用INSERT實現數據的插入 2. UPDATE實現數據的更新 3. 使用DELETE實現數據的刪除 4. 使用SELECT查詢數據以及。 插入數據insert 更新數據upd ...
  • 如果你是一名前端工程師,那麼你一定對 fullPage.js 這個開源項目不會感到陌生。這是前端社區中非常著名的 JavaScript 組件,能快速給網站加上全屏幻燈片的展示效果。 https://github.com/alvarotrigo/fullpage.js 不久前,國外一家專註於報道獨立開 ...
  • 題目鏈接: https://pintia.cn/problem-sets/994805260223102976/problems/994805260990660608 分析: 這是典型的給出編號和得分然後輸出最高分和最低分的題目,只不過得分要通過x和y計算得到。 本人利用字元數組存放運動員的編號,這 ...
  • 1.創建虛擬環境 2.進入虛擬環境 3.創建項目 4.創建資料庫 5.創建應用 6.查看項目 瀏覽器輸入:127.0.0.1:8000即可查看 ...
  • 工具類,是一個單獨的工程項目 提取必要信息至ftp.properties配置文件中 封裝FtpUtils工具類 導入jar包版本: 測試調用: 註:使用的是springboot,已經集成了ftp,所以沒有配置相應的xml文件。 ...
  • hashlib模塊 用於加密相關的操作,3.x里代替了md5模塊和sha模塊 加密功能 運行結果(將hello轉換成一個密文): ...
  • SQLite是一款輕型的資料庫,是遵守ACID的關係型資料庫管理系統。 不像常見的客戶-伺服器範例,SQLite引擎不是個程式與之通信的獨立進程,而是連接到程式中成為它的一個主要部分。所以主要的通信協議是在編程語言內的直接API調用。 Python標準庫包含一個SQLite包裝器:使用模塊sql... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...