在父页面usermanager.jsp中打开子窗口updateuser.jsp,并在在子窗口关闭时刷新父窗口。
要做的功能是:
父页面usermanager.jsp
子窗口updateuser.jsp
在点修改的时候,弹出子页面(里面包含此用户的信息)
在子页面中,修改完点保存的时候,保存数据,自身关闭,父页面刷新,以显示修改后的数据
功能清楚了,下面我就来实现它!!
点 修改时弹出子窗口的代码(用window.showModalDialog主要是让用户必须点此修改响应后才能做其他的任务):
<a href="#" onClick="window.showModalDialog('userupdate.do?userid=<%=lo_dt.uf_GetValue(i, 0)%>',window,'dialogWidth:480px;dialogHeight:180px;status:no;')">修改</a>
userupdate.do中是根据传过去的用户ID取用户的信息,然后再mapping.findforward()到子窗口updateuser.jsp ,在此窗口是显示用户的其他信息。
在子窗口中点保存修改,并刷新父窗口的代码:注意提交方式是在一个iframe中隐式提交 的
<iframe name="commitArea" style='display:none;'></iframe>
<form action="usersave.do" method="post" target="commitArea">
<input type="button" value="保存" onClick="check();">
</form>
<script>
function check(){
var obj = document.getElementById("user_dm");
var obj1 = document.getElementById("user_pwd");
var obj2 = document.getElementById("user_mc");
if(obj.value == "" || obj1.value=="" || obj2.value==""){
obj.focus();
alert("用户账号、用户名称、用户密码均不能为空!");
}else{
document.forms[0].submit(); //提交保存 修改后的数据,usersave.do来保存并mappinf.findforware返回到显示用户列表页面
window.dialogArguments.window.location="user.do"; //刷新父窗口以显示修改后的数据
self.close(); //关闭自己
}
}
</script>
这样就可以了吗?经实验查正,确实是可以的。不过还存在一个问题,就是在机子配置比较好的时候,保存的比较快,在刷新父窗口取最新值时,可以取到最新值,但当机子配置比较低时,取到的值还是老数据。这是因为刷新页面的动作 发生 在action里修改保存 之前了!!
如何保证刷新时,已经修改保存完成了呢??
加子页面一个标志变量!!
就是在保存修改的action里面
执行更新语句
request.setAttribute("updateuserok","修改成功");
根据用户ID重新查询用户的信息,保存到request里面,mapping.findforware()到子页面,
在子页面里判断此变量是否存在,并刷新父页面,关闭自己。
<logic:present name="updateuserok">
<script>
alert("保存成功!");
window.dialogArguments.window.location="user.do";
self.close();
</script>
</logic:present>