今天遇到了一个问题,我用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对象)
于是这样,问题便完美解决!