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

梦里梦外; 2023-07-19 12:04 66阅读 0赞

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

  1. package com.cn.mall.bean;
  2. import java.util.Date;
  3. //属性Attr
  4. public class T_MALL_ATTR {
  5. private int id;
  6. private String shxm_mch; //属性名称
  7. private String shfqy; //是否启用
  8. private int flbh2; //分类编号2
  9. private Date chjshj; //创建时间
  10. public int getId() {
  11. return id;
  12. }
  13. public void setId(int id) {
  14. this.id = id;
  15. }
  16. public String getShxm_mch() {
  17. return shxm_mch;
  18. }
  19. public void setShxm_mch(String shxm_mch) {
  20. this.shxm_mch = shxm_mch;
  21. }
  22. public String getShfqy() {
  23. return shfqy;
  24. }
  25. public void setShfqy(String shfqy) {
  26. this.shfqy = shfqy;
  27. }
  28. public int getFlbh2() {
  29. return flbh2;
  30. }
  31. public void setFlbh2(int flbh2) {
  32. this.flbh2 = flbh2;
  33. }
  34. public Date getChjshj() {
  35. return chjshj;
  36. }
  37. public void setChjshj(Date chjshj) {
  38. this.chjshj = chjshj;
  39. }
  40. }

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

  1. package com.cn.mall.bean;
  2. import java.util.Date;
  3. public class T_MALL_VALUE {
  4. private int id;
  5. private String shxzh; //属性值
  6. private String shfqy; //是否启用
  7. private int shxm_id; //属性名id与属性id关联
  8. private String shxzh_mch; //属性值的单位
  9. private Date chjshj; //创建时间
  10. public int getId() {
  11. return id;
  12. }
  13. public void setId(int id) {
  14. this.id = id;
  15. }
  16. public String getShxzh() {
  17. return shxzh;
  18. }
  19. public void setShxzh(String shxzh) {
  20. this.shxzh = shxzh;
  21. }
  22. public String getShfqy() {
  23. return shfqy;
  24. }
  25. public void setShfqy(String shfqy) {
  26. this.shfqy = shfqy;
  27. }
  28. public int getShxm_id() {
  29. return shxm_id;
  30. }
  31. public void setShxm_id(int shxm_id) {
  32. this.shxm_id = shxm_id;
  33. }
  34. public String getShxzh_mch() {
  35. return shxzh_mch;
  36. }
  37. public void setShxzh_mch(String shxzh_mch) {
  38. this.shxzh_mch = shxzh_mch;
  39. }
  40. public Date getChjshj() {
  41. return chjshj;
  42. }
  43. public void setChjshj(Date chjshj) {
  44. this.chjshj = chjshj;
  45. }
  46. }

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

  1. /*
  2. * 保存属性
  3. */
  4. @RequestMapping("attr_add")
  5. public ModelAndView attr_add(int flbh2, *****object*****) {
  6. // 保存属性
  7. attrService.save_attr(flbh2, list_attr.getList_attr());
  8. ModelAndView mv = new ModelAndView("redirect:/goto_attr_add.do");
  9. mv.addObject("flbh2", flbh2);
  10. return mv;
  11. }

1.页面表达式ognl

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

  1. 添加商品属性
  2. <hr>
  3. <form action="attr_add.do">
  4. <input type="text" value="${flbh2}" name="flbh2"/>
  5. <table border="1" width="800px">
  6. <tr><td>属性名:<input type="text" name="list_attr[0].shxm_mch"/></td><td></td><td>添加属性值</td></tr>
  7. <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>
  8. <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>
  9. </table>
  10. <table border="1" width="800px">
  11. <tr><td>属性名:<input type="text" name="list_attr[1].shxm_mch"/></td><td></td><td>添加属性值</td></tr>
  12. <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>
  13. <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>
  14. </table>
  15. 添加:<input type="submit" value="提交"/>
  16. </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如下:

  1. package com.cn.mall.bean;
  2. import java.util.List;
  3. public class OBJECT_T_MALL_ATTR extends T_MALL_ATTR {
  4. private List<T_MALL_VALUE> list_value;
  5. public List<T_MALL_VALUE> getList_value() {
  6. return list_value;
  7. }
  8. public void setList_value(List<T_MALL_VALUE> list_value) {
  9. this.list_value = list_value;
  10. }
  11. }

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

  1. /*
  2. * 保存属性
  3. */
  4. @RequestMapping("attr_add")
  5. public ModelAndView attr_add(int flbh2, List<OBJECT_T_MALL_ATTR > list_attr) {
  6. // 保存属性
  7. attrService.save_attr(flbh2, list_attr.getList_attr());
  8. ModelAndView mv = new ModelAndView("redirect:/goto_attr_add.do");
  9. mv.addObject("flbh2", flbh2);
  10. return mv;
  11. }

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

  1. package com.cn.mall.bean;
  2. import java.util.List;
  3. public class MODEL_T_MALL_ATTR {
  4. private List<OBJECT_T_MALL_ATTR> list_attr;
  5. public List<OBJECT_T_MALL_ATTR> getList_attr() {
  6. return list_attr;
  7. }
  8. public void setList_attr(List<OBJECT_T_MALL_ATTR> list_attr) {
  9. this.list_attr = list_attr;
  10. }
  11. }

如上我们定义了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保持一致就能成功封装!
今天的分享就到这里,希望能帮到大家哦!

发表评论

表情:
评论列表 (有 0 条评论,66人围观)

还没有评论,来说两句吧...

相关阅读

    相关 mvc多重嵌套参数提交封装

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

    相关 java跳出多重嵌套循环

    在java里面,我们知道有goto这个关键字,但是实际却没有啥作用,这就让我们不像在c/c++里面能够随便让程序跳到那去执行,而break只能跳出当前的一个循环语句,如果要跳出