求助!jsp页面迭代ArrayList问题!
主要问题概述:我的开发环境是struts1,现在我在我的action里面 把我需要在jsp页面遍历的集合request.getSession().setAttribute("list", al);了,然后我在jsp页面 ArrayList al=(ArrayList)request.getSession().getAttribute("list"); 奇怪的是,System.out.println(al);可以在控制台打印出我的表中的记录,但是System.out.println(al.size());就会抛出异常,在网上找了关于这个问题的资料,很多人都遇到了,但是没有明确的说明原因,今天我也遇到了,已经困扰我一天了,求大侠解救!
PS:我做了许多测试,当我声明一个int类型的ArrayList,结果就可以打印出来,没有任何问题:
- Java code
ArrayList tt=new ArrayList(); tt.add("a"); tt.add("b"); tt.add("c"); System.out.println("测试:"+tt); request.setAttribute("tt", tt);下面是我的主要代码,我可以保证代码没有什么问题,只是jsp页面取不到request的值,很费解!
- Java code
SysUser user = (SysUser) request.getSession().getAttribute(Globals.USER_KEY); String sfs=user.getSfs(); String orgno=user.getOrgno(); String username=user.getUsername(); String condition =null; Connection conn = DBUtil.getConnection(); if (orgno.equals("21000002")&&(sfs.equals("") || (sfs==null)) ) { //当前user是监狱 System.out.println("1"); condition ="where to_sifasuo='"+username+"'and sfs is not null"; }else if (orgno.equals("21000003")&& (sfs.endsWith("司法所")||sfs.equals("农委"))) { //当前user是司法所 condition ="where (to_jianyu='"+username+"'or to_jianyu is null )and sfs is null"; } ArrayList al=new ArrayList(); Statement stmt=null; ResultSet rs=null; Tb_newTaskVo voo = null; String sql = "SELECT RWBT , YWLX , LYDW , LRY , BLSJ , URL FROM Tb_NewTask"+" "+condition; System.out.println(sql); //System.out.println(condition); try { stmt=conn.createStatement(); //System.out.println("1"); rs=stmt.executeQuery(sql); //System.out.println("2"); while(rs.next()){ voo = new Tb_newTaskVo(); voo.setrwbt(rs.getString(1)); voo.setywlx(rs.getString(2)); voo.setlydw(rs.getString(3)); voo.setlry(rs.getString(4)); voo.setblsj(rs.getDate(5)); voo.seturl(rs.getString(6)); al.add(voo); } } catch (Exception e) { conn.rollback(); e.printStackTrace(System.out); Pub.writeXmlErrorMessage(response, this.handleError(e)); } finally{ try { rs.close(); stmt.close(); if (conn != null) { conn.close(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(System.out); } } request.getSession().setAttribute("list", al); //request.setAttribute("list", al); ArrayList tt=new ArrayList(); tt.add("a"); tt.add("b"); tt.add("c"); System.out.println("测试:"+tt); request.setAttribute("tt", tt); request.getRequestDispatcher("/jsp/framework/newblueTemplate/task.jsp").forward(request, response); //System.out.flush(); //System.out.close(); //System.out.println(al); System.out.println("sql条件语句:"+condition+"**********************"); return null; jsp页面的java代码:
- Java code
ArrayList al=(ArrayList)request.getSession().getAttribute("list"); //ArrayList al=(ArrayList)request.getAttribute("list");//类型转换错误 //ArrayList al=(ArrayList)session.getAttribute("list"); System.out.println(al.size()); //for(int i=0;i<al.size();i++){ //System.out.println(al.get(i)); //} System.out.println("执行了"); ArrayList tt=(ArrayList)request.getAttribute("tt");//可以取到!! System.out.println(tt);另外:我做的这个是一个待办事件的模块,大致逻辑是首先登录login页面,页面自动调用action(这个功能是利用javascript函数控制cookies来调用的,可以理解为一登陆页面自动找到我的action),进到我的action里面后,会根据当前user的相关属性进行判断是监狱还是司法所,查出相关记录,我的表的字段是固定的,只需要从数据库中查出记录遍历到表格即可,值得注意的是,我的action因为在开始的时候登陆进来就自动加载,然后查出记录,action的return值为null,所以我在action里面加上了个请求转发,这样会自动刷新页面,第二次刷新的时候那个控制cookies的函数就起到作用了,函数如下:
- JScript code
function doNewTask(){ //task.jsp一开始加载首先调用这个函数,把action传过去,根据action的不同条件,显示Tb_NewTask表的不同记录!!! try { //alert("error"); document.cookie="a=null"; //alert(getCookie("a")); location.href ="<%=request.getContextPath()%>/NewTask/newtask.do?method=newtask"; //window.location.href="/Test.jsp"; 这种写法是错误的!! } catch(e) {alert("wrong");}} function getCookie(cookieName) {//得到cookies var cookies=document.cookie.split("; ");//一个分号加一个空格 if (!cookies.length) {return "";} var pair=["",""]; for (var i=0;i< cookies.length;i++) { pair = cookies[i].split("=");//以赋值号分隔,第一位是Cookie名,第二位是Cookie值 if (pair[0]==cookieName) { break; } } return pair[1]; }function delCookie(cookieName) {//删除cookies var expires = new Date(); expires.setTime(expires.getTime()-1);//将expires设为一个过去的日期,浏览器会自动删除它 document.cookie = cookieName+"=; expires="+expires.toGMTString(); }function OnlydoOnce(){//onload里面的函数 if(getCookie("a")!="null"){ doNewTask(); }else{ document.cookie="a=OK"; //alert(getCookie("a")); } }我个人觉得问题出现在请求转发或者是类型转换那里,但是现在是各种没思路了,这个项目的大环境是纯struts1,我来的时候已经成型,现在要增加新的功能,工具类有写好的,只是小弟不才,实在搞不懂他写的类,只得自己重新写一个,谢谢各位了先!
[解决办法]
ArrayList al=(ArrayList)request.getSession().getAttribute("list");
这样子转换应该没错的啊。
//request.getSession().setAttribute("list", al);
有在此处加个断点调试一下吗?有真正set过来了没啊?
[解决办法]
你的写法有问题,你放值的时候是request.getSession().setAttribute("list", al);
,取得时候应该用session取,ArrayList)request.getSession().getAttribute("list");
这样写不好吧,还有,你 ArrayList al=new ArrayList();
这样new了一个对象,在页面取得时候那样不转换取很危险的,应该写个保险的,比如这样写List<Tb_newTaskVo> list = new ArrayList<Tb_newTaskVo>();
取值时这样迭代List<?> list = (List<?>)request.getAttribute("list");
for(int i = 0; i < list.size(); i++){
Tb_newTaskVo voo= (Tb_newTaskVo)list.get(i);
这样写肯定不会出问题的
[解决办法]
前提是我放在request里面的,你用session的话可以这样session().getAttribute("list");
[解决办法]
取的时候不加getAttribute..直接在session里面取试试
[解决办法]
request.getSession(ar)??
[解决办法]
request.getSession("list")
[解决办法]
[解决办法]
每次都提交一次都request肯定是有影响的,request的生命周期就是一次请求,一次请求结束一个request就消亡了,楼主检查一下你的逻辑,如果传值的范围超过一个请求范围就不能放在request里面了,必须要放进session里面了
[解决办法]
我测试有值啊:
Action:
- Java code
ArrayList tt = new ArrayList(); tt.add("a"); tt.add("b"); tt.add("c"); System.out.println("测试:" + tt); request.getSession().setAttribute("tt", tt); request.getRequestDispatcher("../test.jsp") .forward(request, response);
[解决办法]
如果你在控制台中可以看到输出结果,但在程序的接口子程序未收到该值,可能是因为你这个ArrayList输出的值是Object类型,你可以尝试将该ArrayList值导入进list中应该可以解决传参问题。【仅供参考】