在用struts2的ognl语言编写的jsp中如何对iterator循环中的textfield取值

    xiaoxiao2023-07-13  151

    在用struts2的ognl语言编写的jsp中如何对iterator循环中的textfield取值

    记录一下在做架构实验时遇到的一个比较头疼的问题。背景是一个购物车场景,前端jsp中通过s:iterator循环获取cartItemList中的cartItem,其中数量是通过s:textfiled来展示,编写updateAction实现对文本框中的内容取值,计算总金额。

    最开始的方法

    一开始主要是考虑在s:textfield中加name属性,在action中通过写get()、set()方法来获取每一个循环中的值,再在Action里面对获取到的字符串进行格式转化来计算。 hhh这样肯定是不行的啦,可能当时脑子秀逗了才这么写的,这种写法根本不可能实现预期功能。当时可能觉得jsp那边是循环,action这边也是写在循环里面的,应该是一一对应计算的哈哈哈哈T T 运行的时候看到了报错信息,发现获取到的字符串和想要的相差甚远,比如我第一个商品的数量是1,第二个商品的数量是2,然后他报错的内容是这个: 然后就发现,原来我们直接用get、set方法在循环中的输入框里获取到的字符串,程序会直接帮我们自动拼接起来,于是想到用字符分割的方法来进行取值。

    用split语句进行字符串分割

    因为之前看到了程序报错返回的获取到的字符串信息,发现是用‘ , ’来进行拼接的,于是之后就用split语句来实现字符串的分割:

    String[] q = Q.split(","); //Q是我获取的页面中的字符串

    执行程序后,发现还是报错,报错信息是: 不知道为啥,他直接获取到的是数组中的第二段内容,试了一下,发现再加一个商品,获取到的还是第二段的内容…下面讲一下为什么和如何解决这个最后发现很令人无语的问题吧。

    最后的解决方法

    我先是通过在程序中写System语句的方法来粗略判断一下我哪里出错了:

    System.out.println(Q); String[] q = Q.split(","); for(int i=0;i<q.length;i++) { System.out.println(q[i]); }

    发现输出的内容和我想像的不一样 比如还是我上面说的第一件商品1件,第二件商品2件,输出结果为: 我这个时候发现了原来底层帮我们自动拼接的时候,并不是直接用’ , ‘拼接的,而是在’ , '前面还加了一个空格号,难怪我之前转格式的时候一直报错,是因为多了一个空格… 而那个最开始的报错信息"…1, 3…",这样写不仔细看根本看不出他前面原来还有一个空格来连接。这也是为什么我再加一件商品我一直输出的还是第二件商品数量的原因了,因为程序根本就是卡在那了,到第二个他就没法进行格式的自动转换了。 最后把原来的split语句改一下就可以正确实现功能:

    for(int i=0; i<cart.getCartItemList().size(); i++) { CartItem cartItem = cart.getCartItemList().get(i); workingItemId = cartItem.getItem().getItemId(); if(!Q.equals(null)) { String[] q = Q.split(", "); quatity = Integer.valueOf(q[i]); } else { quatity = Integer.valueOf(Q); } cartItem.setQuantity(quatity); session.put("cartItem", cartItem); }

    最后

    其实我最后发现那个多了一个空格之后还是走了一步弯路,就是我那个split语句写的不是 “,” 而是 " , |\ \s ",错误的把一起作为分隔符写成了或的关系,因此还是无法实现预期效果orz,最后在舍友的提醒下才发现这个问题。 这篇文章可能对一些和我一样比较粗心的初学者来说才有一些用处吧,然后希望可以多学会用一些技巧来判断程序到底是哪里出错了,产生了什么样的问题,这样解决问题的效率才会提高。

    最新回复(0)