现在有个
Servlet:admin    控制的servlet
jsp:prolist.jsp   产品列表展示页面在admin中,验证登录之后
list = db.getAllProduct();
session.setAttribute("productlist",list);
session.setAttribute("adminName",adminName);
this.forward(request, response, "productlist.jsp");
此时,能正常的显示产品的内容
但是,如果从其他页面,比如说addproduct.jsp中设置跳转"productlist.jsp"中,这时候内容的列表皆为空,请问是为什么呢?如何解决?如果是说session.setAttribute("productlist",list); 已经失效,那么对于session.setAttribute("adminName",adminName);也为空,这时会让我跳到login.jsp的。而且应该不存在session过期的问题。prolist.jsp 主要代码
if(session.getAttribute("adminName")==null){
session.setAttribute("nouser","nouser");
%>
<jsp:forward page="login.jsp"/>
<%
}else if((session.getAttribute("productlist"))!=null){ 
请问各位大大怎么解决,谢了

解决方案 »

  1.   

    首先 楼主要注意session的作用域 是浏览器 一但浏览器关闭 session也就消失你从addproduct.jsp中设置跳转"productlist.jsp"
    你要保证 在执行完 session.setAttribute("productlist",list); 
    session.setAttribute("adminName",adminName); 
    this.forward(request, response, "productlist.jsp"); 
    后页面从没有关过
      

  2.   

    你一定要注意那个adminUser,productlist的设置位置,不能一进这个页就设置
      

  3.   

    楼上朋友说的session作用域不够准确session的开始容易判断(浏览器发出第一个HTTP请求即可认为会话开始),但结束就不好判断了(因为浏览器关闭时不会通知服务器“我关了,会话可以结束了”),所以只能通过这种方法判断:如果一定的时间内客户端没有反应,则认为会话结束。 Tomcat的默认值为120分钟,但这个值也可以通过 HttpSession 的 setMaxInactiveInterval 方法来设置。 
      

  4.   

    前提是你从其他页面跳转之前已经访问过那个list=db.getAllProduct()的页面呀,总不能没获取到就存在吧?
      

  5.   

    准确的说,确实是这样,如果当前浏览器进程关闭的话,再次启动浏览器发出HTTP请求就会获得新的session,原先的session在过期后自动销毁
      

  6.   

    登录的时候就已经访问过productlist页面了。当然也 list=db.getAllProduct() 过了。PS:我没有关闭过浏览器,也没有空闲下来过,也就是在几个页面中来回点了一两下而已,就出现这种情况了。请问怎么解决呢?
    找不到问题出在哪里,浪费好多时间了。希望能得到大家的帮忙
      

  7.   

    如果从其他页面,比如说addproduct.jsp中设置跳转"productlist.jsp"中,这时候内容的列表皆为空。
    你要是从登陆页面跳转过来有,上面没有,说明,你从login.jsp页面跳转到productlist.jsp页面中触发了db.getAllProduct() 。
    你从其他页面来可能没有触发该该方法。还有以种可能就是的数据库连接是专门写一个类,在里面初始化数据库连接。
    而你在db.getAllProduct()方法种没有实例化该类及连接
      

  8.   

    先不过于争论session作用域的问题
    lz的意思就是从另一个页面 跳 过去之后
    session中并没有值
    就这个问题  三楼 说的就很正确了 ,因为你跳转后的页面需要session中的attribute
    所以你要保证在跳转到该页面之前就set 了这些 attribute
      

  9.   

    productlist.jsp 的代码贴出来看看呢。
      

  10.   

    你的ist = db.getAllProduct();写在了登陆admin页了吧,从别处跳转没有调用该方法和session
      

  11.   

    list里有值么?Debug调试看下
    根据楼主的说明,似乎不是session生命周期的问题楼主追随数据流检查下你数据的传送吧
      

  12.   

    我也觉得不是session生命周期的问题。
    我也做了很多测试,比如在每个页面比如说处理addproduct.jsp的servlet中还有deleteproduct.jsp的
    serlvet中都加入了getAllproduct()并setAttribute了list。但是每当我add或者del一个产品跳转到
    productlist的时候都不能正常显示产品内容。
      

  13.   

    你add或del一个产品时,数据库的操作是否完整。
    比如:事务提交后的关闭,数据库连接的关闭,批处理等
      

  14.   

    addproduct.jsp
    <form action="/Youngdental/adminservlet" name="myform" method="post">
                商品名称:<input type="text" name="productName"><br>
                商品价格:<input type="text" name="productPrice"><br>
                商品类型:
    <select name="productType">
    <% DataBean db = new DataBean();
    ArrayList list = new ArrayList();
    list = db.getProductTypeList();
    if(list.size() > 0){
    for(int i=0;i<list.size()-1;i++){
    String str = (String)list.get(i);
    %>
    <option value="<%=str %>"><%= str %></option>
    <% } %>
    </select>
    <% }else{ %>
    没有数据
    <% } %>
    <br>
    <input type="hidden" name="productImage" value=<%= productImage %> />
    <br>
                是否推荐:<input type="radio" name="productIsbest" value="yes"> 是 ||
                  <input type="radio" name="productIsbest" value="no"> 否<br>
                商品介绍:<br><textarea cols="100" rows="30" name="productIntro"></textarea><br>
                <input type="hidden" value="addproduct" name="action">
                <input type="submit" value="添加">
            </form>
            <%
                if(session.getAttribute("adminName")==null){
                    session.setAttribute("nouser","nouser");
               
            %>
            <jsp:forward page="login.jsp"/>
            <%
                }if(session.getAttribute("addproduct")!=null){
                    String insert=(String)session.getAttribute("addproduct");
                    if(insert.equals("ok")){
                        out.println("成功添加商品");
                    }else{
                        out.println("添加商品失败");
                    }
                    session.setAttribute("addproduct",null);
                }
            %>
       <a href="/Youngdental/adminservlet?action=showlist">返回商品列表</a>
        </body>
    </html>
    处理的servlet
    if(action.equals("addproduct")){
    pro = new ProductBean();
    pro.setProductName(request.getParameter("productName"));
      pro.setProductIntro(request.getParameter("productIntro"));
      pro.setProductPrice(Float.parseFloat(request.getParameter("productPrice")));
      pro.setProductImage(request.getParameter("productImage"));
      pro.setProductNm(request.getParameter("productType"));
      pro.setProductType(request.getParameter("productType"));
      pro.setProductIsBest(request.getParameter("productIsbest"));
      boolean result = db.addProduct(pro);
      if(result){
      session.setAttribute("addproduct","ok");
      session.removeAttribute("productlist");
        list = db.getAllProduct();
      session.setAttribute("productlist",list);
      }else{
      session.setAttribute("addproduct","nook");
      }
      this.forward(request,response,"yyadmin/productlist.jsp");
      

  15.   

    因为为了方便做测试,所以在servlet处理的时候直接forward到了productlist页面了
      

  16.   

    处理的servlet 全部发不来看看