不能够在jsp页面取到页面传到后台的参数(对象中的参数)(模型驱动加对象驱动)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yuan_qh/article/details/84716628

今天遇到了一个问题,我用ssh框架写了一个项目,后台的数据库是这样的:

Borrow对象:

package cn.yqh.domain;

import java.util.Date;
import java.util.Set;


public class Borrow {
	/*
	borrowID  Numeric(12,0)	借书顺序号【主键】
	rdID	Int	读者序号【外键TB_Reader】
	bkID	Int	图书序号【外键TB_Book】
	ldContinueTimes	Int	续借次数(第一次借时,记为0)
	ldDateOut	DateTime	借书日期
	ldDateRetPlan	DateTime	应还日期
	ldDateRetAct	DateTime	实际还书日期
	ldOverDay	Int	超期天数
	ldOverMoney	Money	超期金额(应罚款金额)
	ldPunishMoney	Money	罚款金额
	lsHasReturn	Bit	是否已经还书,缺省为0-未还
	OperatorLend	Nvarchar(20)	借书操作员
	OperatorRet	Nvarchar(20)	还书操作员*/

	private Long borrowID;
	private Integer ldContinueTimes ;
	private Date  ldDateOut;
	private Date  ldDateRetPlan;
	private Date  ldDateRetAct;
	private Integer  ldOverDay;
	private Float  ldOverMoney;
	private Float  ldPunishMoney;
	private Boolean  lsHasReturn;
	private String  operatorLend;
	private String  operatorRet;
	
	private Reader rdID;
	private Book bkID;
	
	
	
	省略getset方法。。。
	
	
}

映射:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="cn.yqh.domain.Borrow" table="TB_Borrow">
		<id name="borrowID"  >
			<generator class="native"></generator>
		</id>
		<property name="ldContinueTimes"  ></property>
		<property name="ldDateOut"  ></property>
		<property name="ldDateRetPlan"  ></property>
		<property name="ldDateRetAct"  ></property>
		<property name="ldOverDay"  ></property>
		<property name="ldOverMoney"  ></property>
		<property name="ldPunishMoney"  ></property>
		<property name="lsHasReturn"  ></property>
		<property name="operatorLend" length="40" ></property>
		<property name="operatorRet" length="40" ></property>
		
		<many-to-one name="rdID" column="rdID" class="cn.yqh.domain.Reader" not-null="true"></many-to-one>
		<many-to-one name="bkID" column="bkID" class="cn.yqh.domain.Book" not-null="true"></many-to-one>

		
	</class>
</hibernate-mapping>

Book对象:

package cn.yqh.domain;

import java.util.Date;


public class Book {
	/*bkID	Int	图书序号【标识列,主键】
	bkCode	Nvarchar (20)	图书编号或条码号(前文中的书号)
	bkName	Nvarchar(50)	书名
	bkAuthor	Nvarchar(30)	作者
	bkPress	Nvarchar(50)	出版社
	bkDatePress	datetime	出版日期
	bkISBN	Nvarchar (15)	ISBN书号
	bkCatalog	Nvarchar(30)	分类号(如:TP316-21/123)
	bkLanguage	SmallInt	语言,0-中文,1-英文,2-日文,3-俄文,4-德文,5-法文
	bkPages	Int	页数
	bkPrice	Money	价格
	bkDateIn	DateTime	入馆日期
	bkBrief	Text	内容简介
	bkCover	image	图书封面照片
	bkStatus	NChar(2)	图书状态,在馆、借出、遗失、变卖、销毁*/
	
	
	private Integer bkID;
	private String bkCode;
	private String bkName;
	private String bkAuthor;
	private String bkPress;
	private Date bkDatePress;
	private String bkISBN;
	private String bkCatalog;
	private Short bkLanguage;
	private Integer bkPages;
	private Float bkPrice;
	private Date bkDateIn;
	private String bkBrief;
	private byte[] bkCover;
	private String bkStatus;

    省略getset方法
}

映射:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="cn.yqh.domain.Book" table="TB_Book">
		<id name="bkID" >
			<generator class="native"></generator>
		</id>
		<property name="bkCode" length="40" ></property>
		<property name="bkName" length="100" ></property>
		<property name="bkAuthor" length="60" ></property>
		<property name="bkPress" length="100" ></property>
		<property name="bkDatePress"  ></property>
		<property name="bkISBN" length="30" ></property>
		<property name="bkCatalog" length="60" ></property>
		<property name="bkLanguage"  ></property>
		<property name="bkPages"  ></property>
		<property name="bkPrice"  ></property>
		<property name="bkDateIn"  ></property>
		<property name="bkBrief" type="text" ></property>
		<property name="bkCover"  ></property>
		<property name="bkStatus" length="4" ></property>
		
		
		
	</class>
</hibernate-mapping>

当我向borrow表里插入一个对象的时候,由于borrow.java里面有一个bkID对象,所以我在前台页面传数据的时候,对于bkID只能够传bkID对象的bkID属性,也就是一个int值,故我应该这么写:

<td>图书序号:</td>
			<td>
			<INPUT class=textbox id=sChannel2  style="WIDTH: 180px" maxLength=50 name="bkID.bkID">
			</td>

后台的action当然用的是模型驱动,所以这个(bkID.bkID)会自动保存到borrow的属性,也就是bkID对象中去,有因为这是bkID.bkID,其中有一个点,所以存到bkID对象中的时候,对象会自动将bkID封装到自己的属性中去,也就是bkID(Integer)中,这样就完成了对borrow表的bkID属性赋值,(这里是用到了Struts2的模型驱动加对象驱动)

现在的问题是,我想让前台输入的这个值回显,所以我这样取值:

value='<s:property value="#parameters.bkID.bkID"/>'

利用s标签,从parameters中取值,但是结果是取不出这个值,用s:debug标签去看的时候,是这样的

也就是说有bkID.bkID,但是前台取不出来,我百思不得其解,后来实在不行,直接在action里面吧这个前台的参数重新取到,然后放在action域中,然后让前台取值并回显,问题解决,但是这个方法肯定不是最好的,

于是我继续找其中的缘由,

当前台的input传值的name为bkID.bkID的时候,Struts2知道用模型驱动加对象驱动来识别并进行封装,但是前台能否识别这个(bkID.bkID)是(对象.属性)呢,由于我前台取值用的是

value='<s:property value="#parameters.bkID.bkID"/>'

这个对于jsp来说是从parameters域中先取到bkID对象,然后从bkID对象中取到bkID属性,

但是对于parameters这个域对象来说,你前台刚刚传过来的是(bkID.bkID),parameters把他解析为一个名字,也就是map集合中的键,所以在parameters中,没有什么所谓的bkID对象和bkID属性,只有一个名为(bkID.bkID)的键,故,你肯定是娶不到这个相应的值,

弄清楚这一点之后,取值回显就好说了:

value='<s:property value="#parameters["bkID.bkID"]/>'

通过这个方式取值,由于.是特殊的符号,所以我们要告诉jsp,我们要取的是名为(bkID.bkID)的键所对应的值,而不是bkID对象下的bkID属相(因为根本没有bkID对象)

于是这样,问题便完美解决!

猜你喜欢

转载自blog.csdn.net/yuan_qh/article/details/84716628