Struts中模型驅動與屬性驅動共同使用可能會遇到的問題
當模型驅動與屬性驅動共同使用時,我們可能會遇到屬性驅動獲取不到值的問題。例如,當我們的Action類繼承的模型驅動的泛型設定為ModelDriven<User>,並且Action類使用了User實體類裡面的成員變數作為屬性驅動。
Action類的部分程式碼(可以看到裡面有username屬性驅動也有User模型驅動)
public class UserAction extends ActionSupport implements ModelDriven<User> { /** * */ private static final long serialVersionUID = 1L; private User model = new User(); //模型驅動 private String username; //屬性驅動 public void setUsername(String username) { this.username = username; }
下邊貼出User實體類
可以看到User裡面也有username屬性。package cn.itcast.bos.domain.system; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashSet; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import com.alibaba.fastjson.annotation.JSONField; /** * @description:後臺使用者 */ @Entity @Table(name = "T_USER") public class User implements Serializable{ @Id @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="hehe") @SequenceGenerator(name="hehe",sequenceName="seq_bos") @Column(name = "C_ID") private Integer id; // 主鍵 @Column(name = "C_BIRTHDAY") private Date birthday; // 生日 @Column(name = "C_GENDER") private String gender; // 性別 @Column(name = "C_PASSWORD") private String password; // 密碼 @Column(name = "C_REMARK") private String remark; // 備註 @Column(name = "C_STATION") private String station; // 狀態 @Column(name = "C_TELEPHONE") private String telephone; // 聯絡電話 @Column(name = "C_USERNAME", unique = true) private String username; // 登陸使用者名稱 @Column(name = "C_NICKNAME") private String nickname; // 真實姓名 @ManyToMany @JoinTable(name = "T_USER_ROLE", joinColumns = { @JoinColumn(name = "C_USER_ID", referencedColumnName = "C_ID") }, inverseJoinColumns = { @JoinColumn(name = "C_ROLE_ID", referencedColumnName = "C_ID") }) @JSONField(serialize=false) private Set<Role> roles = new HashSet<Role>(0); public String getBirthdayStr() { if(birthday!=null){ return new SimpleDateFormat("yyyy年MM月dd日").format(birthday); }else{ return "不詳"; } } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } public String getStation() { return station; } public void setStation(String station) { this.station = station; } public String getTelephone() { return telephone; } public void setTelephone(String telephone) { this.telephone = telephone; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public Set<Role> getRoles() { return roles; } public void setRoles(Set<Role> roles) { this.roles = roles; } }
這時就會出現頁面明明傳遞了username的值,但是username的值卻在Action裡面拿不到的問題。
這是因為Struts在給模型驅動和屬性驅動賦值的時候是從valueStack(值棧)中取值的,當struts給Action裡面的模型驅動和屬性驅動賦值時,會將valueStack中對應的值取出,依次賦值給模型驅動(模型驅動的賦值實際上是struts呼叫模型驅動裡面的set方法給模型驅動的成員變數賦值的)以及每一個帶有set方法的屬性驅動,但struts給某個屬性賦值時,只會呼叫一次該屬性的set方法,而且模型驅動中的set方法會被優先呼叫,所以屬性驅動的set方法就不會被呼叫。放到上面的例子中就表現為,User實體類裡面的set方法會被呼叫,但屬性驅動username的set方法不會被呼叫,這就造成了在Action裡面直接使用username時會沒有值的問題。
解決辦法就是,將屬性驅動刪除,當需要username的值時,直接呼叫User中的getUsername()方法獲取該值就行了。
相關推薦
Struts中模型驅動與屬性驅動共同使用可能會遇到的問題
當模型驅動與屬性驅動共同使用時,我們可能會遇到屬性驅動獲取不到值的問題。例如,當我們的Action類繼承的模型驅動的泛型設定為ModelDriven<User>,並且Action類使用了User實體類裡面的成員變數作為屬性驅動。 Action類的部分程式碼(可
【SSH學習】--Structs2模型驅動與屬性驅動
兩種方式 When:當你從jsp介面調到action時, 屬性驅動 屬性驅動需要你在action中定義屬性,這些屬性就是jsp表單屬性,當你從jsp介面跳到action,struts的攔截器就會呼叫你的action的setxx方法,將你表單的屬性注入act
Struts2淺析 之 模型驅動與屬性驅動
1.Struts2的屬性驅動. Struts2的屬性驅動指的是在action中JSP頁面的每一個form中的name都對應在action中有一個屬性與之對應。看下面程式碼片段: <form action="register.do" name="RegisterFo
也許你知道css中的display與visibility,但是你可能會忽略display: flex--伸縮容器與display: block的關係和區別
複習display與visibility display: none;–元素的摧毀(元素消失) display: block;–元素的重建(設定為塊級元素,元素出現) visibility: hidden;–元素的隱藏(佔有元素原有位置,實質則是不透明度 opacity為0的改變)
JAVA -- Struts模型驅動和屬性驅動
1.屬性驅動請求一個action,它會把對應的action中屬性的名稱對應到表單的名稱上,並且呼叫set方法注入2.模型驅動ModelDriver(模型驅動):它把屬性名稱最終對映成一個User物件。在表單中直接用屬性,而不是物件.屬性的形式,這種方式比較麻煩。它繼承了Mod
(九)模型驅動和屬性驅動
tag rda add struts put username strong get exists 出於結構清晰的考慮,應該采用單獨的Model實例來封裝請求參數和處理結果,這就是所謂的模型驅動, 所謂模型驅動,就是使用單獨的JavaBean來貫穿整個MVC流程。 所謂屬性
Struts2的模型驅動、屬性驅動的理解
因為在struts1的版本中,屬性的攔截以及控制的處理是被封裝為兩個對立的ActionForm、Action來獲取HttpServerRequest的引數、控制訪問的MAPPING的。而在Struts2中我們可以直接通過Action來獲取請求引數,並把處理的資源對映返回給
資料驅動與關鍵字驅動
資料驅動:資料驅動從資料檔案讀取輸入資料,通過變數的引數化將測試資料傳入測試指令碼,不同的資料檔案對應不同的測試用例,資料和指令碼分離。資料來控制測試的業務流。 比如你測一個WEB程式,有很多頁面,你可
訊息驅動與事件驅動比較
簡單記錄自己對於 訊息驅動 和 事件驅動的理解。 關於這二者的具體區別,於實現上來說,二者都是 註冊繫結,然後交付執行。 訊息驅動模型在註冊的時候僅僅註冊一個回撥函式作為處理函式。 而事件驅動模型則需要註冊多個函式作為處理函式。 訊息驅動模型由於處理函式
JS中的“特性”與“屬性” attribute與property
DOM元素的attribute和property很容易混倄在一起,分不清楚。特別區分一下。attribute是HTML標籤上的"特性",它的值只能夠是字串property是DOM中的"屬性",是JavaScript裡的物件;attribute節點都是在HTML程式碼中可見的,
AS3中的類與屬性的修飾符
第一類訪問控制符 internal 只在當前包中可見(預設) public 在任何位置都可見 dynamic 動態類,允許在執行時向物件動態新增屬性 final 不允許被其他類繼承第二類成員修飾符(成員的屬性) internal 在同一個包裡面可見(預設) public
Java中的變數與屬性
1、變數的型別 在java中主要有三種變數,類變數、例項變數和區域性變數,三者的區別如下: 類變數 例項變數 區域性變數 定義位置 類的內部、方法的外部 類的內部、方法的外部 方法的內部 初始化值
屬性驅動與模型驅動 中應該注意的問題。
Struts2 - 屬性驅動與模型驅動 中應該注意的問題: 屬性驅動例子程式碼如下: import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport{p
Struts2-屬性驅動與模型驅動
Struts2 - 屬性驅動與模型驅動 一、為什麼要使用屬性驅動和模型驅動? :struts2與struts很大的不同點在於,struts的execute方法提供了HttpServletRequest和 HttpServletResp
屬性驅動與模型驅動概念
Struts2 - 屬性驅動與模型驅動 一、為什麼要使用屬性驅動和模型驅動? :struts2與struts很大的不同點在於,struts的execute方法提供了HttpServletRequest和 HttpServletResp
屬性驅動與模型驅動的比較
a) 屬性驅動靈活、準確;模型驅動不靈活,因為很多時候,頁面所提交過來的引數並不屬於模型中的屬性. 也就是說頁面所提交過來的引數,與模型中的屬性 並不一致,這是很常見的情況。 b) 模型驅動更加符合面向物件的程式設計風格,使得我們獲得的是物件而不是一個個
Struts2屬性驅動與模型驅動
1屬性驅動是指用Action的屬性來封裝來回請求的引數. 2.模型驅動 模型驅動是指使用JavaBean來封裝來回請求的引數.(個人理解) 建議使用模型驅動,因為相比struts 1的Action類,struts 2的Action類承擔了太多的責任:既用於封裝來回請
Struts-setter、getter方法自動 ActionSupport類-屬性驅動+模型驅動
【setter、getter方法自動設定獲取】 屬於攔截器的功能 在TestAction類裡設定兩個屬性 bookId bookName並且聲稱setter、getter方法 public class TestAction implements Action { pri
屬性驅動 and 模型驅動
參數 ces over upd 實例 str ring new div //1.創建一個UserBean public class User { private String username; private String pwd; publi
屬性驅動和模型驅動的簡單了解
一個 getpara java col bsp set get 宋體 定義 1)屬性驅動:就是jsp表單中的name都和action當中的一一屬性對應,這樣在action當中就不用像servlet一樣去通過String username=request.getParamet