1. 程式人生 > >Struts中模型驅動與屬性驅動共同使用可能會遇到的問題

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實體類

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;
	}

}
可以看到User裡面也有username屬性。

這時就會出現頁面明明傳遞了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的displayvisibility,但是你可能忽略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的“特性”屬性” attributeproperty

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