struts2前台jsp对后台action传递list集合时为什么list是空的

代码如下:
action中:
public class SetAction extends BaseAction {

private List<User> list;
.....getter 和setter方法

//list显示到jsp页面

public String select(){
UserService userService = new UserServiceImpl();
list = userService .getUserList(); //调用dao中的方法获得的list集合,集合中存放的是User对象
return “select”;
}
//取jsp中的list插入待后台
public String insert(){
system.out.println(list); //这边测试拿到数据的时候就显示null,没拿到数据

return "insert";
}
}

User的类:
public class User{
private String name;

private String id;

private double age;

.......getter和setter方法
}
jsp页面
<form method="post" action="set!insert" onsubmit=""> //此处何以点击按钮可以跳到action中的insert方法,配置文件就不写了
<table>
<s:iterator value="list">
<tr>
<td width="120px"><s:property value="name"/></td>
<td width="180"><input type="text" name="user.id" size="30" value="<s:property value='age'/>" /></td>
</tr>
<tr>
<td width="120px"></td>
<td width="180"><input type="submit" value="提交"/></td>
</tr>
</table>
</form>

现在的问题是select方法得到的list可以传到jsp中显示出来,可是jsp中form提交到action中insert方法里时,得不到list集合,得到的是空指针异常,求帮助,如何解决,为什么这样
最新回答
后巷的猫街少女

2024-04-29 08:19:36

两次action的数据无法共享,可以在select方法中将list放到session里面,在insert方法中从session中取list
追问
dao方法

public List getAUserList(){
Session session = super.getSession();
Query query = session.createQuery(hql);

。。。
追答
public abstract class AbstractAction extends ActionSupport implements SessionAware {

protected Map session;

public void setSession(Map session) {
this.session = session;
}

你那个session是查询的session,我说的是session域,就像request域,但是适用范围比request大,在select里面session.put("list",list);然后在insert里面list = session.get("list");
追问
用您的方法的确可以拿到list中的对象了,可是拿的是select方法传过去的list,list中数据没有做过修改;我需要的list中的对象,在jsp页面这边有做过修改的,传给insert的是修改后的list对象的,这个怎么解决呢
追答
那你的select和insert就是毫无关系,select用来向页面传递数据,insert用来从页面取数据

' name="userEdit" value=''>

var data = "";
$("input[name='userEdit']").each(function(){
var user = $(this).attr("id") + "_" + $(this).val();
data = data + "," + user;
});
location.href = "xxx.action?data=" + data;

这里就是给你提供一个思路,页面显示list的时候用name划定list的范围,就是方便你用name属性找到所以需要的list,同时要保留user的id,因为你操作数据库都需要用到,接下来就是需要显示的实际数据了,也要坚持显示的同时保证自己能很方便的用js取到的原则,最后在表单提交前用js把你需要的数据收集起来组成字符串,json的原理其实也是组合字符串,然后后台action取到字符串后用split拆分组成User对象。同一个模块的每一次页面跳转都是首尾连接的,你要时刻注意下一次跳转需要从这次跳转中取到什么数据,这些数据需要你在页面上整理好以方便js取到,传递给下一次跳转,而不是简单的只关注这次的页面有没有成功显示
追问
问题解决了,是struts标签的迭代器的问题
].age" size="30" value="${result.age}"/>
这样取就好,
少女爷爷

2024-04-29 15:23:09

你这个表单里的s标签没有写一个list的域,而是一个iterater,list没有提交给action。加一个<input type="hidden" name="list" id="list" />就可以了。
追问
请问下,这个标签写在哪里呢
夕颜为谁舞

2024-04-29 08:34:57

private List<User> list;
是不是应该改为数组接收
杯别

2024-04-29 11:30:10

后台list集合有值么? 有的话 你在后台接收list的变量要设成全局并且get set 在前台用<s:iterator value="" >value属性里填写后台list名字 然后在s:iterator里写<s:property value="">value属性里填写list里对象里的字段名
小故事里的海

2024-04-29 12:38:50

private List<User> list = new ArrayList<User> 试试
澜小丝光

2024-04-29 12:31:30

form中input元素的name属性加上list(如list.user.id)试试
追问
用您的方法改后,后台action中insert方法里得到的list有null变为了[],list的长度是0,也就是说,jsp中的list对象没放到list里面,用那位网友的sessoin传到时能传成功,可是老大不建议session传,说开销会大,