springMVC數據封裝成POJO


springMVC把前台的數據封裝為POJO與struts2的封裝形式不同。struts2需要在控制器聲明需封裝的POJO,而springMVC不需要任何准備工作,只需在相應的方法的參數中加上需封裝的POJO,當用戶提交表單時,springMVC會根據表單中dom元素的name屬性與請求的方法中的參數中的POJO的屬性名進行比對,如果相同,則將name屬性的值賦給這個屬性,進而完成封裝,下面舉例說明:

一、先看一下定義的POJO

Orders(訂單)

/**
 * 訂單
 * @author Administrator
 *
 */
public class Orders implements Serializable {
    private String oid;//訂單id
    
    private Opportunity  opportunity;//銷售機會 
    private Linkman linkman;//聯系人 
    private User user;//業務員 
    
    private Date bdate; //開單日期
    private Date fdate;//合同到期時間
    private Float ysprice;//應收金額
    private int statues;//審核狀態
    private Integer flag;//訂單狀態 
    private String remark;//備注
    private Integer uids;//訂單審核人
}

上面的Orders類中有一個Opportunity屬性(銷售機會),屬性名為opportunity,下面是定義的Opportunity類:

Opportunity(銷售機會)(注:Orders與Opportunity呈一對一關聯)

/**
 * 銷售機會
 * @author Administrator
 *
 */
public class Opportunity implements Serializable{
    private int opid;
    private Float allprice;//所有商品的購買總價
    private int allcount;//所有商品的購買數量
    private String odate;//下單時間
    
    private User user;//業務員
    private Linkman linkman;//聯系人
    
}

二、再看一下提交的jsp相關片段

三、上面的表單的請求地址是${pageContext.request.contextPath}/addOrder,我們來看一下這個方法的定義:

當用戶提交表單后,springMVC會找到這個方法,然后將表單中的name為opportunity對應的值賦給這個方法中Orders類中實例引用名orders的opportunity屬性,通過debug調試,可以印證這一點:

可以看出,對應表單中的name="opportunity.linkman.lname"對應的值,springMVC是先將此值賦給Opportunity類中的linkman屬性,再將opportunity的值賦給addOrder方法中參數Orders中的opportunity屬性,即完成了對其引用名orders的封裝。

四、如果將表單、請求方法修改成以下的情況,那又會如何呢?

還是bug調試,看一下執行addOrder方法時的情況:

以上的結果表明表單提交后,springMVC並沒有為addOrder方法參數中的Orders封裝opportunity這個屬性,這是因為表單中根本找不到這個屬性,何談封裝呢?但表單中有opid和linkman.lname這兩個屬性,且在addOrder方法中有Opportunity opp這個參數,在Opportunity 類中有opid、linkman這個兩個屬性,因此springMVC會將表單中的opid和linkman.lname這兩個屬性的值賦給參數中的Opportunity opp的opid、linkman這兩個屬性,從而進行封裝。

 

后記:springMVC相比於struts2,封裝機制更為智能,代碼會簡化很多。

 


免責聲明!

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



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