首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

!jsp页面迭代ArrayList有关问题

2012-08-31 
求助!jsp页面迭代ArrayList问题!主要问题概述:我的开发环境是struts1,现在我在我的action里面 把我需要在j

求助!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.getSession().setAttribute("list", al);
,取得时候应该用session取,ArrayList)request.getSession().getAttribute("list");
这样写不好吧,还有,你 ArrayList al=new ArrayList();
这样new了一个对象,在页面取得时候那样不转……

[解决办法]
每次都提交一次都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中应该可以解决传参问题。【仅供参考】

热点排行