最近一个新项目由于涉及到后台插数据时需要前台页面自动刷新显示,即使前台Web应用页面没有显示出来也需要进行显示,这中间即涉及后台数据库操作,又涉及中间逻辑处理,还涉及到前台页面展示,可以说是一个小应用了,很具有“典型”,最后贴下代码,说下思路,仅供参考。(黑色为大众语言,对于一般群体可速看下。红色为具体代码,对于那些真正操作者来说可以看看。蓝色为设计思路,对于那些神马大牛不需要写代码的,只需指挥大家的,可细看下。)
既然是数据库有改动时需要通知前台,首先触发器是必不可少的。触发器部分代码如下:语言种类为PL/SQl
create or replace trigger TAB_AC_LOG_INSERT
after insert OR UPDATE on tab_ac_log
for each row
declare
temp varchar(20);
ip varchar(20);
port number;
begin
select WEBHOST_IP into ip FROM TAB_MSG_HOST where rownum = 1;
select WEBGISHOST_PORT INTO port FROM TAB_MSG_HOST where rownum = 1;
select sendMessage(
'AcLogMess:In:Prison:Triggers',
ip,
PORT)
into temp
from dual;
end TAB_AC_LOG_INSERT;
代码说明:tab_ac_log为表的名字,在begin和and里,我们调用了一个名为sendMessage的函数,这函数需要三个参数,第一个是一个说明,因为可能有多个页面需要实时刷新显示,据此参数可判断是哪个页面。第二三个参数分别为服务器的IP,端口号。
数据库里sendMessage函数定义:
create or replace function sendMessage(name VARCHAR2,ip VARCHAR2,port NUMBER) return VARCHAR2
as language java name
'SocketSend.Message(java.lang.String,java.lang.String,int) return java.lang.String';
接下来要说的是前台JSP页面,在此页面主要是设置一个定时器,定时调用中间逻辑业务处理并且处理返回数据(根据返回数据决定是否刷新页面)页面代码如下所示:语言种类为javascript
function setBaojing()
{
setTimeout("getResult()",2000);
}
function getResult()
{
var flag = new Date();
var url = "./main.do?method=topAjax&isAlarm=1&zheshiyigebiaoz0hiwei=" + flag.getTime();
if (window.XMLHttpRequest)
{
req = new XMLHttpRequest();
}else if (window.ActiveXObject)
{
req = new ActiveXObject("Microsoft.XMLHTTP");
}if(req)
{
req.open("GET",encodeURI(url),true);
req.onreadystatechange = complete;
req.send(null);
}
setTimeout("getResult()",2000);
}
function complete()
{
if (req.readyState == 4)
{
if (req.status == 200)
{
// 获得报警信息
var result = req.responseText;
if(result.length < 300){
var alerm = result.split("20100920");
info = alerm[0];
setLink(alerm[0]);
flashword();
setDisk(alerm[1]);
//setACLog(alerm[0]);
}
}
}
}
代码说明:以上javascript里我们URL访问了一个地址,此地址估计大家也都猜到了,就是我们中间逻辑处理的入口。
且看中间逻辑业务处理代码:语言种类为java
public ModelAndView topAjax(HttpServletRequest request,HttpServletResponse res){
ModelAndView mav = new ModelAndView();
SocketServer socket = SocketServer.getJmsServer();
socket.setClientSession(request.getSession().getId(), request.getSession().getLastAccessedTime());
String flagString = socket.getFlag();
try {
// 取得打印输出
PrintWriter printWriter = res.getWriter();
if(flagString != null && !flagString.equals(""))
{
// 如果数据库已更新,将更新数据发送到页面
//System.out.println("MainCtrl.topAjax()"+flagString);
printWriter.print(flagString);
}else
{
//如果数据未更新
printWriter.print("nothing");
}
printWriter.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
mav.setViewName("top");
return mav;
}
代码说明:这里主要是接受处理Oracle里sendMessage发送过来的消息。 具体是保存到flagString变量里,并且通过printWriter.print(flagString)函数把值交给前台页面定时器来处理。
慢慢长征路,据此只差最后“一跃”,相信大家也都知道了,就差前台页面来处理返回的数据了。
前台页面代码如下所示:语言种类为javascript
function setLink(result)
{
var split = result.split(":");
var alarm;
var hrefDate;
var hrefTime;
var cphm;
if(split.length == 5)
{
$("#mainFrame",parent.document.body).attr("src","client.do?method=linkXxlr&msg="+encodeURI(encodeURI(split)));
}else if(split.length == 4)
{
$("#mainFrame",parent.document.body).attr("src","statistic.do?method=linkPersonEventRecord");
}
else{
return;
}
var html = "<a href='" + encodeURI(href,"iso8859_1") + "' id='texiao' target='right' οnclick='clearAlarm()' name='texiao'>" + alarm + "</a>";
document.all.baojing.innerHTML = html;
document.all.imgalarm.innerHTML="<img src='"+alarmType[split[4]]+"' height='20px' align='bottom' style='padding-top:0px;padding-bottom:0px;border: 0'>";
}
代码说明:大家可能有变量点迷糊了,现在大家可以回头去看上面说的前台页面部分,其中有一处调用了setLink函数,在setLink函数里,我们有变量split,这个变量保存的即时数据库senMessage中的第一个参数,我曾经说过,第一个参数是用来判断哪个表发生变化,哪个页面需要显示的,在此split中的值是 'AcLogMess:In:Prison:Triggers',长度为4时,我在此发送了一个请求,此请求即为刷新页面的URL,至此就可以刷新页面实时显示了。
看过了这些,是不是觉得很多不可思议的事都可以发生呢?事实上他就是发生了,至于你信不信,我反正是信了。