mvc多重嵌套参数的提交和封装

项目中经常遇到需要提交多重集合参数的提交问题,今天分享下这样一个场景:前台页面提交多个商品的属性而每个属性又对应多个属性值。这就涉及多个嵌套对象的参数提交问题。下面我们来一步一步的分析这种参数的提交方式。
首先我们有个属性对象T_MALL_ATTR :

package com.cn.mall.bean;

import java.util.Date;
//属性Attr
public class T_MALL_ATTR {

	private int id;
	private String shxm_mch;   //属性名称
	private String shfqy;      //是否启用
	private int flbh2;          //分类编号2
	private Date chjshj;    //创建时间


	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getShxm_mch() {
		return shxm_mch;
	}

	public void setShxm_mch(String shxm_mch) {
		this.shxm_mch = shxm_mch;
	}

	public String getShfqy() {
		return shfqy;
	}

	public void setShfqy(String shfqy) {
		this.shfqy = shfqy;
	}

	public int getFlbh2() {
		return flbh2;
	}

	public void setFlbh2(int flbh2) {
		this.flbh2 = flbh2;
	}

	public Date getChjshj() {
		return chjshj;
	}

	public void setChjshj(Date chjshj) {
		this.chjshj = chjshj;
	}

}

还有一个属性值对象,他和属性之间通过shxm_id关联:

package com.cn.mall.bean;

import java.util.Date;

public class T_MALL_VALUE {

	private int id;                            
	private String shxzh;                //属性值
	private String shfqy;               //是否启用
	private int shxm_id;               //属性名id与属性id关联
	private String shxzh_mch;      //属性值的单位
	private Date chjshj;          //创建时间

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getShxzh() {
		return shxzh;
	}

	public void setShxzh(String shxzh) {
		this.shxzh = shxzh;
	}

	public String getShfqy() {
		return shfqy;
	}

	public void setShfqy(String shfqy) {
		this.shfqy = shfqy;
	}

	public int getShxm_id() {
		return shxm_id;
	}

	public void setShxm_id(int shxm_id) {
		this.shxm_id = shxm_id;
	}

	public String getShxzh_mch() {
		return shxzh_mch;
	}

	public void setShxzh_mch(String shxzh_mch) {
		this.shxzh_mch = shxzh_mch;
	}

	public Date getChjshj() {
		return chjshj;
	}

	public void setChjshj(Date chjshj) {
		this.chjshj = chjshj;
	}

}

在后台Controller中我们的目的是将含有多个属性及每个属性对应的多个属性值同时提交到后台:

/*
	 * 保存属性
	 */
	@RequestMapping("attr_add")
	public ModelAndView attr_add(int flbh2, *****object*****) {

		// 保存属性
		attrService.save_attr(flbh2, list_attr.getList_attr());

		ModelAndView mv = new ModelAndView("redirect:/goto_attr_add.do");
		mv.addObject("flbh2", flbh2);

		return mv;
	}
1.页面表达式ognl

ognl(object Graphic navigation language)对象图导航语言,它是struts2框架里面的第三方语言(即可以再别的地方用,struts2只是拿过来了而已),它可以调用对象中的方法,获取struts2里值栈的数据。这里我们也可采用这种方式来提交表单:

添加商品属性
	<hr>
	<form action="attr_add.do">
		<input type="text" value="${flbh2}" name="flbh2"/>
		<table border="1" width="800px">
			<tr><td>属性名:<input type="text" name="list_attr[0].shxm_mch"/></td><td></td><td>添加属性值</td></tr>
			<tr><td>属性值:<input type="text" name="list_attr[0].list_value[0].shxzh"/></td><td>单位:<input type="text" name="list_attr[0].list_value[0].shxzh_mch"/></td><td>删除</td></tr>
			<tr><td>属性值:<input type="text" name="list_attr[0].list_value[1].shxzh"/></td><td>单位:<input type="text" name="list_attr[0].list_value[1].shxzh_mch"/></td><td>删除</td></tr>
		</table>
		
		<table border="1" width="800px">
			<tr><td>属性名:<input type="text"  name="list_attr[1].shxm_mch"/></td><td></td><td>添加属性值</td></tr>
			<tr><td>属性值:<input type="text"  name="list_attr[1].list_value[0].shxzh"/></td><td>单位:<input type="text" name="list_attr[1].list_value[0].shxzh_mch"/></td><td>删除</td></tr>
			<tr><td>属性值:<input type="text"  name="list_attr[1].list_value[1].shxzh"/></td><td>单位:<input type="text" name="list_attr[1].list_value[1].shxzh_mch"/></td><td>删除</td></tr>
		</table>
		添加:<input type="submit" value="提交"/>
	</form>

list_attr是属性的集合,list_attr[i].list_value是第i个属性所对应的属性值的集合,list_attr[i].list_value[j].shxzh,这样我们就能取到第i个属性的第j个属性值的具体的属性了比如shxzh(属性值),shxzh_mch(属性值名称即单位)。

2.mvc如何封装这些提交的参数

由于提交的参数是两个嵌套对象的集合,后台接收时必然时用集合来接收,这里我们需要记住有setter方法就能封装成功,没有setter方法就不能完成封装。我们首先想到的是将参数值封装成list如下:

package com.cn.mall.bean;

import java.util.List;

public class OBJECT_T_MALL_ATTR extends T_MALL_ATTR {

	private List<T_MALL_VALUE> list_value;

	public List<T_MALL_VALUE> getList_value() {
		return list_value;
	}

	public void setList_value(List<T_MALL_VALUE> list_value) {
		this.list_value = list_value;
	}

}

这样我们就能通过OBJECT_T_MALL_ATTR 中定义private List<T_MALL_VALUE> list_value;属性能够访问多个T_MALL_VALUE对象。因此我们考虑用List<OBJECT_T_MALL_ATTR > attr_list来接收页面传来的一些列参数如下:

/*
	 * 保存属性
	 */
	@RequestMapping("attr_add")
	public ModelAndView attr_add(int flbh2, List<OBJECT_T_MALL_ATTR > list_attr) {

		// 保存属性
		attrService.save_attr(flbh2, list_attr.getList_attr());

		ModelAndView mv = new ModelAndView("redirect:/goto_attr_add.do");
		mv.addObject("flbh2", flbh2);

		return mv;
	}
	

是否这样就能够成功封装页面传来的参数呢?答案是否定的!
因为上面我们说过了,这样的封装必须严格遵守“有setter方法才能封装成功”这条准则。因为list_attr这个参数并没有其对应的setter方法,因此这样封装依然不行(有兴趣的同学可以测试一下哦),所以我们必须还得定义list_attr的setter方法:

package com.cn.mall.bean;

import java.util.List;

public class MODEL_T_MALL_ATTR {

	private List<OBJECT_T_MALL_ATTR> list_attr;

	public List<OBJECT_T_MALL_ATTR> getList_attr() {
		return list_attr;
	}

	public void setList_attr(List<OBJECT_T_MALL_ATTR> list_attr) {
		this.list_attr = list_attr;
	}

}

如上我们定义了list_attr的setter,这样一来我们方可成功接收后台传来的多个嵌套参数!
还有一个细节我们必须了解,如果我们加Controller中的参数list_attr参数名改成任意参数(比如attr)这样我们还能接收到页面提交的参数吗?。。。。答案是肯定的,这里要再次注意“有setter方法就能封装,无setter方法则不能封装”这句口诀!,这里我们虽热改变了接收参数的名称list_attr,但是别忘了我们在MODEL_T_MALL_ATTR 中封装这个参数时依然用的setList_attr()方法!因此不管controller中的形参如何变化,只要MODEL_T_MALL_ATTR 中的private属性名称与页面中的list_attr保持一致就能成功封装!
今天的分享就到这里,希望能帮到大家哦!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值