在項目中,需要針對一批数据进行或添加或着修改操作。使用Struts2.0 实现。本人仅使用Web
使用是防止对个对象修改添加时,可能出项空造成部分数据不对应所以进行,进行特殊处理。
(1)首先在 Action 代码中定义了 List 类型变量。并且运用 Java5 中的泛型来表明该 List 集合类型变量中的元素都是 ProductItemPrice对象。当然,也可以在 Action 代码中不使用泛型来标明是何种对象作为 List 集合类型的元素。另一种方法就是示例中写明的在属性文件中指定 List 集合类型的元素是何种对象。
注意:该属性文件属于局部类型转换属性定义文件。文件名要以 ActionName 打头,然后以“ --conversion.properties ”结尾。这表示是对该 Action 中的 List 集合类型指定元素类型。而且该属性文件一定要和 Action 放在同一目录下。否则运行系统时候 Struts2 是不会知道该 Action 的 List 集合类型变量元素是何种类型对象。
( 2 )试设想有一种情况,多个 Action 都需要将某一变量的类型进行转换。此时可以像之前所述使用属性文件来定义被转换类型的变量。但是 1 个 Action 定义 1 个属性文件则太浪费时间。因此 Struts2 中还有个全局类型转换属性定义文件,这样所有需要类型转换的 Action 都可以调用该文件中定义的需要类型转换的变量。全局属性文件名字必须为“ xwork-conversiion.properties ”。文件中定义的内容其实和局部属性文件中大同小异,只是这些被定义的变量可以在所有 Action 中进行类型转换。全局属性文件没必要和具体 Action 代码文件放在一起,只需要放在源代码根目录下即可。也就是说全局属性文件直接放在“ src ”文件夹下即可。
( 3 )在页面输入的 JSP 中,千万不能将 List 集合类型的变量名写错,否则 Action 是得不到具体在页面上输入的值。而且因为是 List 类型,所以可以利用 OGNL 来循环遍历。这样在页面上可依次输入数据。数据显示的 JSP 页面上没有什么特别需要注意的,读者可以看到只是利用 Struts2 的标签来显示这些数据。
( 4 )读者可由图 7.3 、图 7.4 看出,批量的 Material 对象数据输入其实和单个 Material 对象输入本质上没有多大区别。在视图界面上只是利用 OGNL 、 Struts2 标签来保证数据可以输入和显示。在 Action 这一层和普通的 Struts2 的 Action 导航没有多大区别。最重要的是全局和局部类型转换属性文件的定义。让系统明白集合类型中包含的元素是何种对象。不过也请读者不要误解,以为 Set 集合类型转换也是如此。接下来笔者将讲解 Set 集合类型数据类型转换的注意点。
/**
* 可选项产品价格的管理
*
* @author longgangbai
*
*/
@SuppressWarnings("serial")
public class ProductPriceAction extends
BaseAction<ProductItemPrice, ProductItemPriceService>
以上struts2的action采用和SpringSide中设计思路一样:
简述如下:
ProductItemPrice:父类实体
ProductItemPriceService:实体对应的Service层
其中ProductItemPrice有两个子类:
/**
* 可选项关联的价格项
*
* @author longgangbai
*
*/
@Entity
@DiscriminatorValue("MultipleProductItemPrice")
@GenericGenerator(name = "seq_gen", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", parameters = {
@Parameter(name = "sequence_name", value = "seq_MultipleProductItemPrice"),
@Parameter(name = "initial_value", value = "100000") })
public class MultipleProductItemPrice extends ProductItemPrice
和
/**
* 单选项关联的价格项信息
*
* @author longgangbai
*
*/
@Entity
@DiscriminatorValue("SingleProductItemPrice")
@GenericGenerator(name = "seq_gen", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", parameters = {
@Parameter(name = "sequence_name", value = "seq_SingleProductItemPrice"),
@Parameter(name = "initial_value", value = "100000") })
public class SingleProductItemPrice extends ProductItemPrice
特殊处理的地方分为以下几点:
/**
* 查询可选项或单选项的价格的信息
*/
private List<ProductItemPrice> productItemPrices; //仅仅用于展示
/**
* 查询可项的价格的信息
*/
@SuppressWarnings("unchecked")
private List mproductItemPrices; //用于操作可选项操作MultipleProductItemPrice
/**
* 查询多选项的价格的信息
*/
@SuppressWarnings("unchecked")
private List sproductItemPrices;//用于操作可选项操作SingleProductItemPrice
有点怪异的地方:
mproductItemPrices 存储MultipleProductItemPrice 的集合但是不可以泛型有点郁闷
sproductItemPrices存储SingleProductItemPrice 的集合但是不可以泛型有点郁闷
但是如果不存在父子关系可以使用泛型,郁闷吧?^_^
希望有高人指点!!
通过Struts2.0的IOC功能实现注入:
在Struts2.0的Action的局部属性文件内容配置如下:
Action局部配置文件的命名规则:
如下:
Action的名称+“-”+conversion.properties
配置的属性:
Element_集合的名称=集合对象中对应的对象类
Element_productItemPrices=com.unutrip.vacation.model.product.ProductItemPrice
Element_sproductItemPrices=com.unutrip.vacation.model.single.SingleProductItemPrice
Element_mproductItemPrices=com.unutrip.vacation.model.multiple.MultipleProductItemPrice
在展示是的技巧:
重点在针对标签的命名规则
针对可选项集合:MultipleProductItemPrice
便利显示并支持修改如下:
<s:iterator status="sta" value="mproductItemPrices">
<tr id="<s:property value='%{#sta.index+1}'/>">// 目的为动态生成对象做准备
<td>
<s:hidden name="%{'mproductItemPrices['+#sta.index+'].productId'}"/>
<s:hidden name="%{'mproductItemPrices['+#sta.index+'].id'}"/>
<s:property value="%{#sta.index+1}"/>
</td>
<td>
<s:textfield name="%{'mproductItemPrices['+#sta.index+'].startDate'}" size="6" />
</td>
<td>
<s:textfield name="%{'mproductItemPrices['+#sta.index+'].endDate'}" size="6" />
</td>
<td><s:textfield name="%{'mproductItemPrices['+#sta.index+'].adultPrice'}" size="6" /></td>
<td><s:textfield name="%{'mproductItemPrices['+#sta.index+'].adultBasePrice'}" size="6" /></td>
<td><s:textfield name="%{'mproductItemPrices['+#sta.index+'].childPrice'}" size="6" /></td>
<td><s:textfield name="%{'mproductItemPrices['+#sta.index+'].childBasePrice'}" size="6" /></td>
<td><s:textfield name="%{'mproductItemPrices['+#sta.index+'].babyPrice'}" size="6" /></td>
<td><s:textfield name="%{'mproductItemPrices['+#sta.index+'].babyBasePrice'}" size="6" /></td>
<td><s:textfield name="%{'mproductItemPrices['+#sta.index+'].adultOfferPrice'}" size="6" /></td>
<td><s:textfield name="%{'mproductItemPrices['+#sta.index+'].childOfferPrice'}" size="6" /></td>
</tr>
</s:iterator>
由于项目支持动态添加所以:
本人经过思考,不得其解,则查看源代码是发现生成静态标签的规则如下:
得到规律如下:
<input type='text' name='mproductItemPrices[0].startDate' size='6'/>
备注其中红色的规律:集合的名称【下标】.属性
最后根据静态标签的规则实现需要的动态添加,并且组成的集合对象的目的