问题描述:
刚学,写了个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。恳请路过的朋友指点!先谢了
刚学,写了个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。恳请路过的朋友指点!先谢了
你把response.sendRedirect也换成request.getRequestDispatcher试试
response.sendRedirect()是重新定向,前后页面不是一个request。
所以你应该用request.getRequestDispatcher() 否则你的数据放在request里,找不到。自然用之前的数据了。
谢了!用重定向时除非把数据存到session中,送数组、记录集等复杂数据有点不方便吧?
add.jsp将表单数据再提供给servlet的方法insert(),执行数据库操作后,重定向(response.sendRedirect)到该servlet的query方法,再次获取记录集放在request对象中,并再次转向到show.jsp增加操作后在query()方法中,我确实再次获取了记录集,放到request对象中了;并且是用request.getRequestDispatcher() 转到show.jsp的,但是show.jsp中没有更新。
确实如您所说,我获取的记录并未更新,但确实我调用到重新查询的语句了
为什么没有更新,还在迷惑中!
我菜鸟:) 知道的重定向就只有sendRedirect,dragonsky_w哥说的重定向是?另外正困惑:调用到重新查询的语句了,却没有更新到记录集
还没解决,不是hibernate,没有使用框架。不过使用PreparedStatement对象来执行的查询,有影响吗?
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;执行过程中没有报异常
request.setAttribute("userlist", userList);
request.getRequestDispatcher("xx.jsp").forward(request,response);
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;
}
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:
我有增加了一条记录,页面没有刷新立即去看了数据库,第一次看没有增加上,再打开时已经增加上了
你不会在增加之后就直接到show.jsp了吧?应该重新进入query查询方法里面去.
您看我1楼的过程:
...
add.jsp将表单数据再提供给servlet的方法insert(),
执行数据库操作后,重定向(response.sendRedirect)到该servlet的query方法,再次获取记录集放在request对象中,并再次转向到show.jsp我很郁闷a,本来觉得看懂了的
<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);还是不行,哭...