Java下Struts框架中的ActionForm類詳解
ActionForm的應(yīng)用
(1) 、創(chuàng)建一個(gè)form類必須繼承四個(gè)父類中的一個(gè)。比如繼承ActionForm。
(2) 、一個(gè)form類中的每一個(gè)屬性都將和頁(yè)面中form 表單中的每一個(gè)元素一一對(duì)應(yīng)
例如、
一個(gè)表單為:
<form> <input type="text" name="username"></input> <input type="password" name="password"></input> <input type="text" name="email"></input> </form>
一個(gè)與之對(duì)應(yīng)的form類
public class UserForm extends ActionForm{ private String username; private String password; private String email; //下面省略getter和setter方法 }
一個(gè)引用該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.這個(gè)userForm默認(rèn)會(huì)被放在session中,使用scope可以指定存儲(chǔ)該form對(duì)象的地方,自然attribute就是用來(lái)給存放在該范圍中的form對(duì)象起的別名,如果不設(shè)置attribute該范圍中的form對(duì)象起的別名,如果不設(shè)置attribute屬性那么attribute默認(rèn)的就使用name的值
2.原理跟普通HTML表單使用Form的工作原理大同小異,不同在于ActionServlet對(duì)struts-config進(jìn)行解析時(shí),當(dāng)解析到某個(gè)action中存在一個(gè)屬性name,那么ActionServlet中的RequestProcessor就會(huì)根據(jù)該name的值找到對(duì)應(yīng)的form-bean然后創(chuàng)建一個(gè)對(duì)應(yīng)的form類實(shí)例,放在我們定義的存儲(chǔ)范圍中,當(dāng)表單提交到該action對(duì)應(yīng)的appAction之前也就是到達(dá)FC的時(shí)候,FC會(huì)做以下事情
1.根據(jù)路徑找到對(duì)應(yīng)的內(nèi)存中存放著的配置對(duì)象中的action
2.根據(jù)action中的attribute屬性,從session中得到一個(gè)對(duì)應(yīng)的form實(shí)例
3.該form實(shí)例調(diào)用reset方法對(duì)自己進(jìn)行清空
4.用表單中的值去填充該form實(shí)例
5.如果要該form要進(jìn)行驗(yàn)證那么就該form就會(huì)調(diào)用validate方法按照我們規(guī)定的驗(yàn)證規(guī)則進(jìn)行驗(yàn)證
(三)、struts表單使用Form的工作原理
1.利用struts的HTML標(biāo)簽庫(kù)定義的HTML元素其實(shí)是服務(wù)器端的java代碼,java代碼是編譯型代碼而HTML則是解釋型代碼,所以在使用struts的HTML標(biāo)簽庫(kù)定義的HTML元素要更加的嚴(yán)謹(jǐn),只要某個(gè)元素甚至是某個(gè)屬性沒(méi)有定義對(duì),那么編譯就不能通過(guò)從而拋出異常,例如在使用struts的HTML標(biāo)簽庫(kù)定義表單的時(shí)候action屬性是在編譯的時(shí)就要被確定的如果action屬性所定義的提交路徑是空或者是錯(cuò)誤,那么服務(wù)器在編譯的時(shí)候就會(huì)拋出500的異常,而不像普通HTML表單action屬性是在提交的時(shí)候才確定的
2.原理跟普通HTML表單使用Form的工作原理大同小異,不同在于當(dāng)服務(wù)器對(duì)form表單進(jìn)行編譯的時(shí)候會(huì)向action所指定的地址發(fā)一個(gè)請(qǐng)求,看是否正確,所以這個(gè)時(shí)候其實(shí)就已經(jīng)提交了一次表單,當(dāng)表單到達(dá)FC的時(shí)候跟上面做的幾件事情中就第三件不同,不同在于表單和form中的值都將互相填充,
這就是struts對(duì)表單的回添機(jī)制
Example:
表單為:
//先導(dǎo)入struts的html標(biāo)簽庫(kù) <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> 俄語(yǔ)<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.顯示頁(yè)面之前服務(wù)器會(huì)向text.do發(fā)送一次請(qǐng)求,該請(qǐng)求也就是提交表
2.當(dāng)上面的請(qǐng)求到FC的時(shí)候會(huì)用form中的值去填充這個(gè)表單然后回顯給用戶所以用戶看到的頁(yè)面顯示結(jié)果是salary文本框中有一個(gè)值為1000
3.當(dāng)用戶再次提交表單,請(qǐng)求到達(dá)FC的時(shí)候服務(wù)器會(huì)首先檢查你所提交的表單元素的值跟session中這個(gè)form與之對(duì)應(yīng)的屬性的值是否相同,如果相同就直接利用該form去填充表單,如果不相同就先把提交的表單元素的值賦給form中與之對(duì)應(yīng)的屬性再利用form去填充表單
4.該實(shí)例有一個(gè)問(wèn)題,就是當(dāng)用戶第一次選擇了兩種語(yǔ)言,然后提交,第二次用戶一種語(yǔ)言都沒(méi)選,然后提交,這時(shí)候回顯的結(jié)果出人意料,復(fù)選框中的值既然是第一次用戶所選擇的值,
原因是,復(fù)選框有一個(gè)特性,如果用戶什么都不選擇,那么提交表單的時(shí)候就不提交復(fù)選框,如果我們使用get請(qǐng)求提交的話就能明顯的看到這種情況表單提交的屬性只有username和salary兩個(gè),這兩個(gè)元素即使沒(méi)有值也會(huì)提交,就因?yàn)檫@一點(diǎn),當(dāng)表單到達(dá)FC的時(shí)候,服務(wù)器只看到提交的兩個(gè)表單元素username和salary,然后檢查form中的屬性也只會(huì)檢查username和salary兩個(gè),而不會(huì)檢查lang,如果表單中的username和salary與form中與之對(duì)應(yīng)的username和salary屬性不一樣,那么就先把表單中的username和salary值賦給form中的username和salary屬性,然后利用form去填充表單,如果一樣,那么就利用原來(lái)的form去填充表單,在這兩種情況下form中的lang屬性都將不會(huì)被檢查更不用提改變,所以lang用的還是上一次的值,自然回顯的時(shí)候form中的復(fù)選框的值就是上一次的值
5.解決這一問(wèn)題可以有兩種辦法,在提交表單以后就把session中的form對(duì)象給刪除掉,每一次提交都新創(chuàng)建一個(gè)form對(duì)象也就是在頁(yè)面的末尾加一個(gè)<%session.removeAttribute("uf")%>
第二種解決辦法是在UserForm中覆蓋父類的reset方法,該reset方法將在form填充之前做,這樣我們就能在reset中把我們想要復(fù)位的屬性先復(fù)位
(四)、Form與實(shí)體對(duì)象之間的關(guān)系
有的時(shí)候我們?yōu)榱朔奖銜?huì)把取到的form中的值直接拷貝到實(shí)體對(duì)象中去然后把實(shí)體對(duì)象再存儲(chǔ)到數(shù)據(jù)庫(kù)中,這樣給我們的編程帶來(lái)了很多的方便,但前提是實(shí)體對(duì)象中需要拷貝的屬性,form中要拷貝過(guò)去的屬性,與form對(duì)應(yīng)的表單元素他們?nèi)弑仨氁灰粚?duì)應(yīng).
這樣我們就可以把表單中的值得到封裝到form中然后再把form中與實(shí)體對(duì)象中屬性相同的值拷貝到實(shí)體對(duì)象中
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對(duì)象中:
//下面這條語(yǔ)句是在action的某個(gè)方法中做的所以form直接可以用
BeanUtils.copyProperties(user,form);
3.將user對(duì)象存放在數(shù)據(jù)庫(kù)中
到此這篇關(guān)于Java下Struts框架中的ActionForm類詳解的文章就介紹到這了,更多相關(guān)Java Struts框架 ActionForm類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中 % 與Math.floorMod() 區(qū)別詳解
- 詳解Java時(shí)區(qū)處理之Date,Calendar,TimeZone,SimpleDateFormat
- Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.Transformer異常
- 詳解java.lang.NumberFormatException錯(cuò)誤及解決辦法
- Java對(duì)象轉(zhuǎn)json JsonFormat注解
- java map轉(zhuǎn)Multipart/form-data類型body實(shí)例
- java模擬發(fā)送form-data的請(qǐng)求方式
- AndroidStudio插件GsonFormat之Json快速轉(zhuǎn)換JavaBean教程
- 這么優(yōu)雅的Java ORM沒(méi)見(jiàn)過(guò)吧!
相關(guān)文章
javax.mail.SendFailedException: Sending failed問(wèn)題原因
這篇文章主要介紹了javax.mail.SendFailedException: Sending failed問(wèn)題原因,需要的朋友可以參考下2015-05-05Springboot允許logger.debug輸出日志方式
這篇文章主要介紹了Springboot允許logger.debug輸出日志方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06Java之next()、nextLine()區(qū)別及問(wèn)題解決
這篇文章主要介紹了Java之next()、nextLine()區(qū)別及問(wèn)題解決,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08ByteArrayOutputStream簡(jiǎn)介和使用_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
ByteArrayOutputStream 是字節(jié)數(shù)組輸出流。它繼承于OutputStream。這篇文章主要介紹了ByteArrayOutputStream簡(jiǎn)介和使用,需要的朋友可以參考下2017-05-05Mybatis如何自動(dòng)生成數(shù)據(jù)庫(kù)表結(jié)構(gòu)總結(jié)
這篇文章主要給大家介紹了關(guān)于Mybatis如何自動(dòng)生成數(shù)據(jù)庫(kù)表結(jié)構(gòu)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11SpringBoot實(shí)現(xiàn)阿里云短信發(fā)送的示例代碼
這篇文章主要為大家介紹了如何利用SpringBoot實(shí)現(xiàn)阿里云短信發(fā)送,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下2022-04-04