问题描述:
刚学,写了个jsp+javabean+servlet小例子。过程是:
通过servlet的方法query()获取了数据库记录集放在request对象中,然后转向(request.getRequestDispatcher)到show.jsp
通过show.jsp打开新增记录界面add.jsp
add.jsp将表单数据再提供给servlet的方法
insert(),执行数据库操作后,重定向(response.sendRedirect)到该servlet的query方法,再次获取记录集放在request对象中,并再次转向到show.jsp问题是:增加数据库记录再次转向到show.jsp后,页面上没有显示新增加的数据,必须手动刷新后才能显示。请问:如何避免手动刷新就自动更新呢?我试过了取消缓冲,没有效果。还有暂时不想用ajax。恳请路过的朋友指点!先谢了

解决方案 »

  1.   

    如果是刚学的话建议你把request和response两种方式的区别弄清楚
    你把response.sendRedirect也换成request.getRequestDispatcher试试
      

  2.   

    request.getRequestDispatcher()是请求转发,前后页面共享一个request ; 
    response.sendRedirect()是重新定向,前后页面不是一个request。 
    所以你应该用request.getRequestDispatcher() 否则你的数据放在request里,找不到。自然用之前的数据了。
      

  3.   

    to wxxy20071547:
    谢了!用重定向时除非把数据存到session中,送数组、记录集等复杂数据有点不方便吧?
      

  4.   

    to kai27ks:您看我的操作过程:
    add.jsp将表单数据再提供给servlet的方法insert(),执行数据库操作后,重定向(response.sendRedirect)到该servlet的query方法,再次获取记录集放在request对象中,并再次转向到show.jsp增加操作后在query()方法中,我确实再次获取了记录集,放到request对象中了;并且是用request.getRequestDispatcher() 转到show.jsp的,但是show.jsp中没有更新。
      

  5.   

    建议你在query方法中调试下,看看获取的记录是不是最新的。
      

  6.   

    to todaydiy:
    确实如您所说,我获取的记录并未更新,但确实我调用到重新查询的语句了
    为什么没有更新,还在迷惑中!
      

  7.   

    你还是用重定向吧,sendRedirect是发送一次请求,而重定向的话是相当于发送两次请求,这样的话你心提阿尼啊的记录就可以在show.jsp页面中显示了……
      

  8.   

    to dragonsky_w:
    我菜鸟:) 知道的重定向就只有sendRedirect,dragonsky_w哥说的重定向是?另外正困惑:调用到重新查询的语句了,却没有更新到记录集
      

  9.   

    你用的什么插入方法?hiberante的?可能是hibernate的缓存问题
      

  10.   

    to kai27ks:
    还没解决,不是hibernate,没有使用框架。不过使用PreparedStatement对象来执行的查询,有影响吗?
      

  11.   

    你添加的语句发来看看。执行添加后,你马上用sql在查询分析器执行 看表添加进去了没有。
      

  12.   

    to a810889915:
    access数据库,jdbc-odbc方式连的,我是菜鸟,又被要求去培训,急了insert代码:
    String sql = "insert into tb_student values(?,?,?,?,?)";
    Object [] obj = new Object[]{stu.getId(),stu.getName(),stu.getSex(),
    stu.getBirth(),stu.getDept};
    DBOperator db = new DBOperator();
    try {
    n = db.executeUpdate(sql, obj);
    } catch (SQLException e) {
    e.printStackTrace();
    } DBOperator的executeUpdate方法代码:
                      ...
    stmt = con.prepareStatement(sql);
    for (int i=0;i<obj.length;i++) {
    stmt.setObject(i+1,obj[i]);
    }
    int ri = stmt.executeUpdate();
    return ri;执行过程中没有报异常
      

  13.   

    你这样写看看
        request.setAttribute("userlist", userList);  
             request.getRequestDispatcher("xx.jsp").forward(request,response);  
      

  14.   

    你再添加一行数据后立刻看Access数据库是否有这条数据。如果有。就与后台代码无关。那就看你的跳转的问题了。
      

  15.   

    你添加一行数据。立刻看Access数据库里面是否有。然后再调用query()方法看是否获得最新的数据
      

  16.   

    to todaydiy:查询代码:
    query(int page){ 
    pageSize = 10;//每页显示记录数
    if(page<1){
    currentPage=1;
         }
         else{
         currentPage=page;
         }
         //SQL语句,从表格tb_student里面获得所有数据   
    String sql = "select * from tb_student order by val(Id)";
    DBOperator db = new DBOperator();
    Collection ret=new ArrayList();
    try {
    rs = db.executeQuery(sql,new Object[]{});
    ResultSet tmpRs=db.executeQuery(sql,new Object[]{});
    // 过滤结果集的变量
    int skipBegin = (currentPage - 1) * pageSize;
    int skipEnd = currentPage * pageSize;
    // 翻页计数器
    int currentNum = 0;
    // 当返回结果集中有记录时
    while(tmpRs.next()){
    rowCount = tmpRs.getInt(1); 
    }
    tmpRs.close();
             pageCount = (rowCount+pageSize-1)/pageSize;
             //调整待显示的页码
             if(currentPage>pageCount) currentPage=pageCount;
             if(pageCount>0)
    while (rs.next()) {
    // 以下情况将保证在结果集中有记录时的应用
    if (currentNum >= skipBegin && currentNum < skipEnd) {
                String id=rs.getString("Id");
             String name=rs.getString("Name");
                 String sex=rs.getString("Sex");
    String dept=rs.getString("Dept");
                 int Birth;
                 String tmp=rs.getString("Birth");
                 if(tmp==null) sbirth=0;
                 else sbirth=Integer.parseInt(tmp);

             StudentVO tmpStu=new StudentVO();
             tmpStu.setId(id);tmpStu.setName(name);
             tmpStu.setSex(sex);
             tmpStu.setBirth(birth);
             tmpStu.setDept(dept);
             ret.add(tmpStu);
                         if (currentNum == skipEnd - 1)
                             break;
                     }
    currentNum++;
    }
    }catch (SQLException e) {
    e.printStackTrace();
    }
    return ret;
    }
      

  17.   

    DBOperator中的excuteQuery方法代码:
    stmt = con.prepareStatement(sql);
    for (int i=0;i<obj.length;i++) {
    stmt.setObject(i+1,obj[i]);
    }
    rs = stmt.executeQuery();
    return rs;另外其他几位朋友的意见我也参考了,还不行to a810889915:
    我有增加了一条记录,页面没有刷新立即去看了数据库,第一次看没有增加上,再打开时已经增加上了
      

  18.   

    我刷新就相当于又执行了query()方法了,能看到新数据
      

  19.   

    增加数据库记录再次转向到show.jsp;
    你不会在增加之后就直接到show.jsp了吧?应该重新进入query查询方法里面去.
      

  20.   

    to Jerry_BJ:
    您看我1楼的过程:
    ...
    add.jsp将表单数据再提供给servlet的方法insert(),
    执行数据库操作后,重定向(response.sendRedirect)到该servlet的query方法,再次获取记录集放在request对象中,并再次转向到show.jsp我很郁闷a,本来觉得看懂了的
      

  21.   

    或者哪位朋友告诉我下如何取消缓存,我在show.jsp中加入了:
    <meta http-equiv="Pragma"  content="no-cache">      
    <meta http-equiv="Cache-Control" content="no-cache">      
    <meta http-equiv="Expires" content="0"> 在servlet每次重定向前都加了:
     response.setHeader("Pragma", "No-cache");
    response.setHeader("Cache-control", "no-cache");//Cache-control值为“no-cache”时,访问此页面不会在Internet临时文章夹留下页面备份。
    response.setDateHeader("Expires", 0);还是不行,哭...
      

  22.   

    目前还是无解,我仔细看了下重定向和转发,两者都能重定向到一个页面并刷新,而转发时可以传递request属性参数,而重定向不行,只能传递url参数;我也写简单例子验证了但我的代码,用转发方式时不能刷新,求解阿!哪位大人和我讨论下呢?