1. 程式人生 > >Struts2中資料封裝機制

Struts2中資料封裝機制

Struts2當中資料封裝的三種機制:屬性驅動、標籤驅動、模型驅動。下面來一一介紹。

一、屬性驅動
1、需要提供對應屬性的set方法進行資料的封裝。
2、表單的哪些屬性需要封裝資料,那麼在對應的Action類中提供該屬性的set方法即可。
3、表單中的資料提交,最終找到Action類中的setXxx的方法,最後賦值給全域性變數。
4、注意:Struts2的框架採用的攔截器完成資料的封裝。
5、注意:這種方式不是特別好:因為屬性特別多,提供特別多的set方法,而且還需要手動將資料存入到物件中.
6、注意:這種情況下,Action類就相當於一個JavaBean,就沒有體現出MVC的思想,Action類又封裝資料,又接收請求處理,耦合性較高。

具體來看一個action的實現:

public class LoginActio extends ActionSupport{
    //Action需要處理表單提交的兩個資料:使用者名稱和密碼。
    //此處的屬性值應與表單中的name值一致
    //並且必須得有對應的set和get方法
   private String username;//與表單的相應name一致
   private String password;
   @Override
   public execute()throws Exception{
        System.out.println("username="+username);
        System.out.println("password="+password);
       return"success";
   }
   public String getUsername() {
       return username;
   }
   publicvoid setUsername(String username) {
       this.username= username;
   }
   public String getPassword() {
       return password;
   }
   publicvoid setPassword(String password) {
       this.password= password;
   }
}


表單提交格式如下:

<form action="LoginActio" method="post">
    <input type="text" name="username">
    <input type="text" name="password">
    <button type="submit">提交</button>
</form>


在配置完成後便可以將表單中form中的的action屬性改為當前的action的name(注意字尾是.action,也可自行設定,使用constant屬性)。然後啟動專案轉到相應頁面中輸入使用者名稱和密碼後可以看到在控制檯中已經打印出來了相關資訊。

但是我們卻並沒有在程式碼中做過任何相關的資料封裝操作,但是對應的資料卻已經被封裝到屬性當中了。
這便是struts2的資料封裝中的屬性封裝機制,只需在Action中設定當前表單中要提交的資料的屬性(注意這裡可能會存在屬性型別的轉換問題,這個例子只涉及到String型別的屬性,同時表單中提交的資料也是String型別的。所有不牽扯到型別轉換問題)待表單提交過來資料時便直接會被封裝到對應的屬性中去。事實上這是通過java的反射機制實現的。

二、標籤驅動
可以通過在頁面上使用OGNL表示式進行資料封裝。想要通過Struts2中的標籤來實現表單資料的自動封裝的前提是得在表單中加入Struts2標籤支援。
<%@taglib prefix="s" uri="/struts-tags" %>
1、在頁面中使用OGNL表示式進行資料的封裝,就可以直接把屬性封裝到某一個JavaBean的物件中。
2、在頁面中定義一個JavaBean,並且提供set方法:例如:private User user;
3、頁面中的編寫發生了變化,需要使用OGNL的方式,表單中的寫法:<input type="text" name="user.username">
4、注意:只提供一個set方法還不夠,如果沒有user例項化,必須還需要提供user屬性的get和set方法,先呼叫get方法,判斷一下是否有user物件的例項物件,如果沒有,呼叫set方法把攔截器建立的物件注入進來。

具體的Action例項如下:

//省略包匯入
/**
 * 動態引數封裝:屬性驅動
 *      OGNL
 * 所有的封裝動態引數操作:都是一個叫params的攔截器封裝的。
 */
public class TestAction extends ActionSupport {


    private User user = new User();//User是一個封裝好了的javaBean模型


    public String execute(){
        System.out.println("name is "+user.getName()+" and age is "+user.getAge());
        return SUCCESS;
    }


    public User getUser() {
        System.out.println("getUser");
        return user;
    }


    public void setUser(User user) {
        System.out.println("setUser");
        this.user = user;
    }
}


form表單提交如下:

<%--動態引數封裝:物件導航對映 
        此時表單元素的name屬性取值已經不是一個普通的字串了。
        而是一個OGNL表示式。
        OGNL:Object Graphic Navigationg Language
               物件   圖        導航       語言
    --%>
    <form action="${pageContext.request.contextPath}/testAction.action" method="post">
        使用者名稱:<input type="text" name="user.name"/><br/>
        年齡:<input type="text" name="user.age"/><br/>
        <input type="submit" value="提交"/>
    </form>


還可以使用struts2的標籤:

<%--這裡定位action的方式是和配置struts.xml差不多,使用namespace和action名--%>
<s:form namespace="/normal" action="testAction.action" method="POST">
    <%--name屬性也必須這樣寫--%>
    <s:textfield name="user.name"/>
    <s:password name="user.passwd"/>
    <s:submit>提交</s:submit>
</s:form>


三、模型驅動。
使用模型驅動的方式,也可以把表單中的資料直接封裝到一個JavaBean的物件中,並且表單的寫法和之前的寫法沒有區別!編寫的頁面不需要任何變化,正常編寫name屬性的值。
模型驅動的編寫步驟
* 手動例項化JavaBean,即:private User user = new User();
* 相應的Action必須實現ModelDriven<T>介面,實現getModel()的方法,在getModel()方法中返回user即可!!

下面看一個Action例項:

// 實現ModelDriven介面,泛型中寫了我們封裝的資料,也就是我們自己編寫的javaBean物件User
public class StudentAction extends ActionSupport implements ModelDriven<User> {
    // 我們必須例項化我們封裝的資料,struts2會直接使用我們的這個類,將資料set進去
    // 所以我們必須在這個類中寫get和set方法
    private User u = new User();//例項化javaBean


    // 實現此介面必須實現的方法,返回我們封裝的資料,也就是javaBean物件
    @Override
    public User getModel() {
        return u;
    }


    @Override
    // 這種方法我們完全沒有設定什麼,但是struts2依然為我們將資料放了進去
    // 這裡其實是java反射的應用
    public String execute() throws Exception {
        System.out.println(u.getName());
        System.out.println(u.getPasswd());
        return "success";
    }
}


而form表單的提交方式和第一種屬性驅動的方式一模一樣,無需更改。
上述方式實現的大致原理如下:
* 當請求傳送到action之前,呼叫我們自定義的Action類中的getModel方法,獲取封裝表單資料的javaBean物件
* 獲得該物件之後,我們便可以獲得對應的類型別 
* 利用反射可以獲取到類中的屬性列表 
* 通過request.getParameterNames()可以獲取表單中的name列表 
* 判斷name值和屬性名稱,一致的情況下,反射呼叫屬性的set方法來給對應的屬性值設定引數 
* 最後完成完成資料的封裝 

四、Action對集合物件的封裝
1、把資料封裝到Collection中
因為Collection介面都會有下標值,所有頁面的寫法會有一些區別,注意:
<input type="text" name="products[0].name" />
在Action中的寫法,需要提供products的集合,並且提供get和set方法

2、把資料封裝到Map中
Map集合是鍵值對的形式,頁面的寫法
<input type="text" name="map['one'].name" />
Action中提供map集合,並且提供get和set方法。

**在Action中不推薦使用模型驅動的方式來封裝資料到集合中。
 

相關推薦

Struts2資料封裝機制

Struts2當中資料封裝的三種機制:屬性驅動、標籤驅動、模型驅動。下面來一一介紹。 一、屬性驅動 1、需要提供對應屬性的set方法進行資料的封裝。 2、表單的哪些屬性需要封裝資料,那麼在對應的Act

Struts2總結---資料封裝機制 (10)

一,屬性驅動的資料封裝 示例程式碼: public class AttributeAction extends ActionSupport { // 屬性直接放在action類中,並且每一個屬性都得寫get和set方法 private String nam

Struts2資料封裝到集合封裝到Collection

資料封裝到集合中,可以封裝到集合中,也可以封裝到Map中。該篇部落格主要講解資料封裝到集合中的封裝到Collection中。1. 封裝複雜型別的引數(集合型別 Collection 、Map介面等) 2. 需求:頁面中有可能想批量新增一些資料,那麼現在就可以使用上述的技術了。把資料封裝到集合中 3. 把資料封

Struts2資料封裝到集合封裝到map

struts框架封裝資料可以封裝到集合中也可以封裝到map中,該篇部落格主要講解將資料封裝到map中。 1. 封裝複雜型別的引數(集合型別 Collection 、Map介面等) 2. 需求:頁面中有可能想批量新增一些資料,那麼現在就可以使用上述的技術了。把資料封裝到集合中3. 把資料封裝到Map中(雙元素

十一 三種Struts2資料封裝方式

Struts2的資料封裝:Struts2是一個web層框架,框架是軟體的半成品。提供了資料封裝的基本功能。 屬性驅動:提供屬性set方法的方式 這種方式很少用,除非資料少,需要在Action類裡自己往物件裡封裝 前端jsp: 1 <%@ page language="java" cont

strutsModelDriven()介面 Struts2的ModelDriven機制及其運用、refreshModelBeforeResult屬性解決的問題

Struts2中的ModelDriven機制及其運用、refreshModelBeforeResult屬性解決的問題   1.為什麼需要ModelDriven? 所謂ModelDriven,意思是直接把實體類當成頁面資料的收集物件。比如,有實體類User如下:

Struts2的ModelDriven機制及其運用

所謂ModelDriven,意思是直接把實體類當成頁面資料的收集物件。比如,有實體類User如下: [html] view plain copy print?package cn.com.leadfar.struts2.actions;  public c

struts2學習04——資料封裝核心機制

struts2的資料封裝,主要是藉助java反射機制實現的,下面通過簡單的程式碼示例來回顧一下今天的學習。 通過模型驅動的方式,我們在Action中,常會出現以下的程式碼: public class LoginServlet extends BaseServlet {

【07】框架學習—Struts2域物件/頁面跳轉/資料封裝/攔截器技術

1.Struts2框架中使用Servlet的API 1.1 完全解耦合的方式 static ActionContext getContext():獲取ActionContext物件例項。 java.util.Map<java.lang.String,j

(八)Struts2的參數封裝

靜態 用戶名 關系 第一步 流程 什麽是 例如 string 幫我 一、靜態參數封裝 什麽是靜態參數? 靜態參數就是硬編碼的,不可隨意改變。 例子: (1)我們首先創建一個Action類,裏面有兩個參數,用來封裝請求參數 public class Us

struts2模型化獲取表單資料

             class屬性:action全路徑,對應伺服器的路徑             method屬性:action裡面預設執行的方法execute

小程式學習--請求API資料引入models(頁面請求資料封裝優化)

我的一篇部落格講到關於請求資料的優化,現在嘗試引入models進行更好的優化,如果有不清楚的,可以先看下我之前的部落格: https://blog.csdn.net/zhangzeshan/article/details/83868856 好,接下里開始講關於引入models優化頁面js請求

Struts2第二天:Struts2資料封裝、結果頁面配置

目錄     1.Struts2的Servlet的API的訪問 1.1完全解耦合的方式 1.2使用Servlet的API的原生方式(*****) 1.3介面注入的方式 2.Struts2的結果頁面的配置 2.1結果頁面的配置 2.1

將資料庫查詢資料封裝到XML檔案,進行格式化處理,並進行加密操作,和解密操作

1.pom檔案 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7&l

Struts2資料封裝&複雜型別封裝

Struts2框架是一個web層框架,web層框架(框架:軟體的辦成品,完成一部分功能)。Struts2提供了資料封裝的功能。 1、屬性驅動 1.1 提供set方法的方式(不常用) JSP編寫 <h3>方式一:屬性驅動-提供set方法的方式</h3>

Struts2框架的資料封裝一之屬性封裝(屬性封裝的第二種方式:封裝成javaBean)

Struts2中提供了兩類資料封裝的方式? 第一種方式:屬性驅動(有兩種方式:一個對屬性,另外一個是將引數封裝到javaBean中)   B. 在頁面上,使用OGNL表示式進行資料封裝。(將引數封裝到javaBean中)     * 在頁面中使用OGNL表示式進行資料的封裝,就可以直接把屬性封

關於《JavaWeb開發實戰經典》接收封裝表單的文字資料出現中文亂碼問題的解決方法

smartupload亂碼問題 今天在寫smartupload的demo時,在接收表單資料時出現了中文亂碼,從網上綜合了各種方法才得以解決。 1.smartupload.html中可見對form使用enctype進行表單封裝 <!DOCTYPE html&

Struts2框架與頁面的資料互動(1)--資料封裝

2、Struts2框架與頁面的資料互動(1)--資料封裝 上接Sturts2框架入門學習:https://blog.csdn.net/biggerchong/article/details/84540183 目錄 2、Struts2框架與頁面的資料互動 2.1

Struts2資料封裝詳解

1 屬性驅動 1.1 提供set方法的方式 該方式需要在action類中提供相應的屬性並提供屬性的set方法,並且jsp頁面中的name屬性要與Action類中的屬性相對應,下面是對應的Action類和jsp頁面 Action類 package com.itykd

七、Struts2框架的資料封裝

什麼叫框架的資料封裝? 就是將原本需要使用Servlet的Api手動去解析請求引數,然後封裝成model的操作交給了Struts2框架來完成。Struts2的框架採用了攔截器來完成資料的封裝。 兩類資料封裝的方式 1.屬性驅動方式 提供對應屬性的set方法進行資料的封裝。 表單的