最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java下Struts框架中的ActionForm類詳解

 更新時間:2020年07月23日 15:02:26   作者:qq1312583369  
這篇文章主要介紹了Java下Struts框架中的ActionForm類詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

ActionForm的應(yīng)用

(1) 、創(chuàng)建一個form類必須繼承四個父類中的一個。比如繼承ActionForm。

(2) 、一個form類中的每一個屬性都將和頁面中form 表單中的每一個元素一一對應(yīng)

例如、

一個表單為:

<form>
 <input type="text" name="username"></input>
 <input type="password" name="password"></input>
 <input type="text" name="email"></input>
</form>

一個與之對應(yīng)的form類

public class UserForm extends ActionForm{
 private String username;
 private String password;
 private String email;

//下面省略getter和setter方法

 }

一個引用該form的appAction

<form-beans>
 <form-bean name="userForm" type="form.UserForm"></form-bean>
</form-beans>
<action-mappings>
<action path="/test" type="action.TestAction" name="userForm" attribute="uf" scope="request"></action>
</action-mappings>

3.在引用了form-bean的action中name屬性的值就是form-bean中name的值

4.這個userForm默認(rèn)會被放在session中,使用scope可以指定存儲該form對象的地方,自然attribute就是用來給存放在該范圍中的form對象起的別名,如果不設(shè)置attribute該范圍中的form對象起的別名,如果不設(shè)置attribute屬性那么attribute默認(rèn)的就使用name的值

2.原理跟普通HTML表單使用Form的工作原理大同小異,不同在于ActionServlet對struts-config進(jìn)行解析時,當(dāng)解析到某個action中存在一個屬性name,那么ActionServlet中的RequestProcessor就會根據(jù)該name的值找到對應(yīng)的form-bean然后創(chuàng)建一個對應(yīng)的form類實(shí)例,放在我們定義的存儲范圍中,當(dāng)表單提交到該action對應(yīng)的appAction之前也就是到達(dá)FC的時候,FC會做以下事情

1.根據(jù)路徑找到對應(yīng)的內(nèi)存中存放著的配置對象中的action
2.根據(jù)action中的attribute屬性,從session中得到一個對應(yīng)的form實(shí)例
3.該form實(shí)例調(diào)用reset方法對自己進(jìn)行清空
4.用表單中的值去填充該form實(shí)例
5.如果要該form要進(jìn)行驗(yàn)證那么就該form就會調(diào)用validate方法按照我們規(guī)定的驗(yàn)證規(guī)則進(jìn)行驗(yàn)證

(三)、struts表單使用Form的工作原理

1.利用struts的HTML標(biāo)簽庫定義的HTML元素其實(shí)是服務(wù)器端的java代碼,java代碼是編譯型代碼而HTML則是解釋型代碼,所以在使用struts的HTML標(biāo)簽庫定義的HTML元素要更加的嚴(yán)謹(jǐn),只要某個元素甚至是某個屬性沒有定義對,那么編譯就不能通過從而拋出異常,例如在使用struts的HTML標(biāo)簽庫定義表單的時候action屬性是在編譯的時就要被確定的如果action屬性所定義的提交路徑是空或者是錯誤,那么服務(wù)器在編譯的時候就會拋出500的異常,而不像普通HTML表單action屬性是在提交的時候才確定的

2.原理跟普通HTML表單使用Form的工作原理大同小異,不同在于當(dāng)服務(wù)器對form表單進(jìn)行編譯的時候會向action所指定的地址發(fā)一個請求,看是否正確,所以這個時候其實(shí)就已經(jīng)提交了一次表單,當(dāng)表單到達(dá)FC的時候跟上面做的幾件事情中就第三件不同,不同在于表單和form中的值都將互相填充,

這就是struts對表單的回添機(jī)制

Example:

表單為:

//先導(dǎo)入struts的html標(biāo)簽庫

<html:form action="test.do" method="post">

 <html:text property="username"></html:text>

 <html:text property="salary"></html:text>

 中文<html:multibox property="lang" value="zh"></html:multibox>

 英文<html:multibox property="lang" value="en"></html:multibox>

 俄語<html:multibox property="lang" value="ey"></html:multibox> 

<html:submit value="click me">

</html:submit>

</html:form>

form類為:

public class UserForm extends ActionForm{
 
 private String username; 
private double salary=1000.00;
 private String[] lang; 
 
 //省略getter和setter方法
 
  }

配置文件為:

<form-beans>
 <form-bean name="userForm" type="form.UserForm"></form-bean>
</form-beans>
<action-mappings>
 <action path="/test" type="action.TestAction" name="userForm" attribute="uf">
 <forward name="success" path="/show.do"></forward>
 </action> 
 <action path="/show" type="action.ShowAction" >
 <forward name="success" path="/test.do"></forward>
 </action>
</action-mappings>

經(jīng)驗(yàn):

1.顯示頁面之前服務(wù)器會向text.do發(fā)送一次請求,該請求也就是提交表

2.當(dāng)上面的請求到FC的時候會用form中的值去填充這個表單然后回顯給用戶所以用戶看到的頁面顯示結(jié)果是salary文本框中有一個值為1000

3.當(dāng)用戶再次提交表單,請求到達(dá)FC的時候服務(wù)器會首先檢查你所提交的表單元素的值跟session中這個form與之對應(yīng)的屬性的值是否相同,如果相同就直接利用該form去填充表單,如果不相同就先把提交的表單元素的值賦給form中與之對應(yīng)的屬性再利用form去填充表單

4.該實(shí)例有一個問題,就是當(dāng)用戶第一次選擇了兩種語言,然后提交,第二次用戶一種語言都沒選,然后提交,這時候回顯的結(jié)果出人意料,復(fù)選框中的值既然是第一次用戶所選擇的值,

原因是,復(fù)選框有一個特性,如果用戶什么都不選擇,那么提交表單的時候就不提交復(fù)選框,如果我們使用get請求提交的話就能明顯的看到這種情況表單提交的屬性只有username和salary兩個,這兩個元素即使沒有值也會提交,就因?yàn)檫@一點(diǎn),當(dāng)表單到達(dá)FC的時候,服務(wù)器只看到提交的兩個表單元素username和salary,然后檢查form中的屬性也只會檢查username和salary兩個,而不會檢查lang,如果表單中的username和salary與form中與之對應(yīng)的username和salary屬性不一樣,那么就先把表單中的username和salary值賦給form中的username和salary屬性,然后利用form去填充表單,如果一樣,那么就利用原來的form去填充表單,在這兩種情況下form中的lang屬性都將不會被檢查更不用提改變,所以lang用的還是上一次的值,自然回顯的時候form中的復(fù)選框的值就是上一次的值

5.解決這一問題可以有兩種辦法,在提交表單以后就把session中的form對象給刪除掉,每一次提交都新創(chuàng)建一個form對象也就是在頁面的末尾加一個<%session.removeAttribute("uf")%>
第二種解決辦法是在UserForm中覆蓋父類的reset方法,該reset方法將在form填充之前做,這樣我們就能在reset中把我們想要復(fù)位的屬性先復(fù)位

(四)、Form與實(shí)體對象之間的關(guān)系

有的時候我們?yōu)榱朔奖銜讶〉降膄orm中的值直接拷貝到實(shí)體對象中去然后把實(shí)體對象再存儲到數(shù)據(jù)庫中,這樣給我們的編程帶來了很多的方便,但前提是實(shí)體對象中需要拷貝的屬性,form中要拷貝過去的屬性,與form對應(yīng)的表單元素他們?nèi)弑仨氁灰粚?yīng).

這樣我們就可以把表單中的值得到封裝到form中然后再把form中與實(shí)體對象中屬性相同的值拷貝到實(shí)體對象中

Example:

entity:

public class User{


 private String name;
 private String password;
 private double salary;
 private String address;


 //省略getter和setter方法


}

form:

public class UserForm{


 private String name;
 private String password;
 private String salary;


 //省略getter和setter方法


}

表單:

<form>


 <input type="text" name="name"></input>
 <input type="password" name="password"></input>
 <input type="text" name="salary"></input>


</form>

1.把表單中的值賦值給UserForm

2.把UserForm中的值拷貝到User對象中:
//下面這條語句是在action的某個方法中做的所以form直接可以用
BeanUtils.copyProperties(user,form);

3.將user對象存放在數(shù)據(jù)庫中

到此這篇關(guān)于Java下Struts框架中的ActionForm類詳解的文章就介紹到這了,更多相關(guān)Java Struts框架 ActionForm類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合MongoDB的實(shí)現(xiàn)代碼

    SpringBoot整合MongoDB的實(shí)現(xiàn)代碼

    自己本科時候一直使用的是Mysql,目前的課題組使用的是MongoDB,因此就花了一部分時間整理了一下,實(shí)現(xiàn)springboot與MongoDB的整合,并且實(shí)現(xiàn)基本的增刪改查操作,從頭到尾給出一個完整的案例。
    2021-05-05
  • Java簡單實(shí)現(xiàn)動態(tài)代理模式過程解析

    Java簡單實(shí)現(xiàn)動態(tài)代理模式過程解析

    這篇文章主要介紹了Java動態(tài)代理模式簡單案例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Java使用BIO和NIO進(jìn)行文件操作對比代碼示例

    Java使用BIO和NIO進(jìn)行文件操作對比代碼示例

    這篇文章主要介紹了Java使用BIO和NIO進(jìn)行文件操作對比代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • Java?Thread.currentThread().getName()?和?this.getName()區(qū)別詳解

    Java?Thread.currentThread().getName()?和?this.getName()區(qū)別詳

    本文主要介紹了Thread.currentThread().getName()?和?this.getName()區(qū)別詳解,TestThread?testThread?=?new?TestThread();
    2022-02-02
  • java8新特性之Optional的深入解析

    java8新特性之Optional的深入解析

    這篇文章主要給大家介紹了關(guān)于java8新特性之Optional的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Spring事務(wù)框架之TransactionStatus源碼解析

    Spring事務(wù)框架之TransactionStatus源碼解析

    這篇文章主要為大家介紹了Spring事務(wù)框架之TransactionStatus源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 如何使用會話Cookie和Java實(shí)現(xiàn)JWT身份驗(yàn)證

    如何使用會話Cookie和Java實(shí)現(xiàn)JWT身份驗(yàn)證

    這篇文章主要介紹了如何使用會話Cookie和Java實(shí)現(xiàn)JWT身份驗(yàn)證,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-03-03
  • 關(guān)于jdk9、jdk10、jdk11、jdk12、jdk13新特性說明

    關(guān)于jdk9、jdk10、jdk11、jdk12、jdk13新特性說明

    這篇文章主要介紹了關(guān)于jdk9、jdk10、jdk11、jdk12、jdk13新特性說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • java上界通配符(? extends Type)的使用

    java上界通配符(? extends Type)的使用

    在Java中,? extends Type是一個上界通配符,本文主要介紹了java上界通配符(? extends Type)的使用,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • java判斷對象中某個屬性是否為空方法代碼

    java判斷對象中某個屬性是否為空方法代碼

    這篇文章主要給大家介紹了關(guān)于java判斷對象中某個屬性是否為空的相關(guān)資料,最近遇到后臺接收值的時候,需要對接收對象進(jìn)行非空校驗(yàn),需要的朋友可以參考下
    2023-07-07

最新評論

色达县| 治县。| 蒲江县| 钟山县| 清水河县| 巴塘县| 逊克县| 手机| 云阳县| 牡丹江市| 河曲县| 临高县| 调兵山市| 新晃| 台中市| 屯留县| 秦皇岛市| 凤城市| 拜城县| 水城县| 栖霞市| 南靖县| 舟曲县| 玉屏| 大关县| 泽库县| 绵阳市| 黄山市| 巴林右旗| 花莲市| 黑水县| 明光市| 镇雄县| 确山县| 荆门市| 延津县| 屯门区| 淮阳县| 卢湾区| 成武县| 天全县|