刘林栋ID:lldwolf
38245次访问,排名2774好友15人,关注者26
桃花坞里桃花庵,桃花庵下桃花仙。

桃花仙人种桃树,又摘桃花换酒钱。

酒醒只在花前坐,酒醉还来花下眠。

半醉半醒日复日,花落花开年复年。

但愿老死花酒间,不愿鞠躬车马前。

车尘马足显者事,酒盏花枝隐士缘。

若将显者比隐士,一在平地一在天。

若将花酒比车马,彼何碌碌我何闲。

别人笑我太疯癫,我笑他人看不穿。

不见五陵豪杰墓,无花无酒锄作田。
lldwolf的文章
原创 48 篇
翻译 0 篇
转载 1 篇
评论 106 篇
最近评论
flyever581549:谢谢你的分享..
学到了很多..
以后继续关注你的博客..
并期待更多你的分享..
999:很经典啊, 麻烦也给我发个源码, 谢谢908184856@qq.com
javalfans:不错的文章,受益匪浅...谢谢啦!
fengjikun:请教一下,ajax_callback.jsp页面在onload的时候即使在主页面<iframe>里主页面也有刷新吧?
代码可以发给我一份吗?
fengjikun@gmail.com
谢谢!
Sunny:请教一下,在ajax_callback.jsp中
<div id="div1">${uname}</div>一句中
${uname}是什么用法啊?JSP中有这样的语法吗?
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创  J2EE下使用AJAX(四) 隐藏帧 -- 史前的AJAX实现收藏

    新一篇:  J2EE下使用AJAX(五) jsonplugin -- struts2下的AJAX插件 | 旧一篇: 听说要抵制家乐福, 有感, 口占一打油诗

    在我们的第一个例子中,我使用XmlHttpRequest实现AJAX,我称之为原始的AJAX实现,那么,使用隐藏帧来实现AJAX,则可称之为史前的AJAX实现了。这是AJAX最早的实现方法,事实上,Google的主页及Gmail都是使用隐藏帧技术实现的AJAX。

    隐藏帧技术描述如下:使用一个隐藏的frame/iframe,主页面发送请求时,指定返回页面为该隐藏帧,这样,整个页面就不会被刷新,然后,主页面到隐藏帧中去取得返回的数据并进行处理即可。

    使用隐藏帧技术实现AJAX有如下好处:

    • 只需浏览器支持HTML 4即可,不须ActiveX之类的支持
    • 可以维护浏览器历史,用户仍然可以使用浏览器上的后退和前进按钮。

    尤其是第2个优点,如果用户有很强烈的要求的话,使用隐藏帧几乎就成了惟一的选择(如果使用AJAX),曾经看到有人提出了在使用AJAX的情况下如何保持前进/后退按钮的功能,主要就是如可以时间键存储页面信息,JS代码写得繁复无比,并且也没有完全解决这个问题。呵呵,如果使用隐藏帧技术,就不用这么麻烦了。

    使用隐藏帧的缺点是如果隐藏帧载入失败,用户得不到任何出错信息,调试起来会比较费力一点。

    好了,言归正传,我使用隐藏帧技术实现前面例子的简单功能,根据页面传入的一个字符串参数后台生成一个字符串,并在前台显示,为了显示前进/后退按钮是可用的,我加了一个时间标记。

    本例包含如下几个文件:

    • hidden_frame.jsp: 用于发送AJAX请求
    • ajax_callback.jsp: 用于隐藏帧,接收AJAX请求
    • HiddenFrameAjaxServlet.java: 后台的servlet类
    • web.xml

    4.1 hidden_frame.jsp

    <%@ page language="java" contentType="text/html; charset=GB18030"
        pageEncoding
    ="GB18030"
    %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
    <title>Insert title here</title>
    </head>
    <body>
    <form name="form1">
        
    <input type='button' value='Hello' onclick='hello()' /> 
    </form>
    <div id="div1"></div>
    <iframe id="frame1" src="about:blank" width="0" height="0" style="display:none">
    </iframe>
    <script type="text/javascript">

    function hello() 
    {
        
    var user = "London";
        
    var hid_frame = document.getElementById("frame1");
        hid_frame.src 
    = "HiddenFrameAjax.do?uname=" + user + "&reqid=" + Math.random();
        
    }

     
    function callbackAjax(msg) 
    {
       document.getElementById(
    "div1").innerHTML = msg;
    }
     
    </script> 
    </body>
    </html>

    页面里我定义了一个iframe,使用CSS属性定义为隐藏,对于Firefox,仅设其高度和宽度为0是不够的,你会看到有一个小点,呵呵,不晓得Mozila这样的目的是啥。

    4.2 ajax_callback.jsp

    <%@ page language="java" contentType="text/html; charset=GB18030"
        pageEncoding
    ="GB18030"
    %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
    <title>Insert title here</title>
    </head>
    <body>
    <h1>aaa</h1>
    <div id="div1">${uname}</div>
    <script type="text/javascript">
    window.onload 
    = function()
    {
        
    var retstr = document.getElementById("div1").innerHTML;
        parent.callbackAjax(retstr);
    }

    </script>
    </body>
    </html>

    这个页面功能更简单,用于接收请求结果,该页面是要放到隐藏帧中的。关键在于设定window.onload事件,在页面载入完成后调用父页面的响应函数callbackAjax。

    4.3 HiddenFrameAjaxServlet.java

    package lld.test.ajax;

    import java.io.IOException;
    import java.util.Date;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    public class HiddenFrameAjaxServlet extends HttpServlet
    {
        
    private static final long serialVersionUID = -595334169176542957L;

        @Override
        
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                
    throws ServletException, IOException
        
    {
            
    this.doPost(req, resp);
        }


        @Override
        
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                
    throws ServletException, IOException
        
    {
            String uname 
    = req.getParameter("uname");
            System.out.println(
    "get uname = " + uname);
            String retstr 
    = "Hello, " + uname + "" + (new Date());
            req.setAttribute(
    "uname", retstr);
            req.getRequestDispatcher(
    "/ajax_callback.jsp").forward(req, resp);
        }


    }

    这是用于处理请求的普通Servelt,与非AJAX的Servlet完全一样,这是与前几例不同的地方。使用隐藏帧,功夫全在前台javascript上,后台不用去操心。

    4.4 web.xml

    添加Servlet描述

    <servlet>
        
    <servlet-name>HiddenFrameAjax</servlet-name>
        
    <servlet-class>lld.test.ajax.HiddenFrameAjaxServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        
    <servlet-name>HiddenFrameAjax</servlet-name>
        
    <url-pattern>/HiddenFrameAjax.do</url-pattern>
    </servlet-mapping>

    4.5 Post方式

    上例我是使用了Get方式发送请求,如果要使用post方式的话,只需要一个简单的小技巧,那就是使用form标签的target属性,将其设为隐藏帧即可。


    还是那句话, 如果哪位需要示例的完整代码, 可发送邮件至lldwolf@163.com

    发表于 @ 2008年04月25日 23:40:00|评论(loading...)|编辑

    新一篇:  J2EE下使用AJAX(五) jsonplugin -- struts2下的AJAX插件 | 旧一篇: 听说要抵制家乐福, 有感, 口占一打油诗

    评论

    #flyfanc 发表于2008-04-25 23:45:54  IP: 58.248.164.*
    哈哈,收到代码了,还是要过来支持一下,顺便看一下程序说明
    #小骗子 发表于2008-05-05 14:57:56  IP: 59.109.75.*
    上面的代码,在实际使用中,出现了username=London 这个毛病,如何解决? 可以的话,给发到linyanjing@yeah.net中
    2008-05-05 15:15:32作者回复
    我不清楚你说的这个毛病是怎么回事,我把我的原始代码发到了你的信箱,你对比一下
    #sniperfox 发表于2008-05-06 10:34:38  IP: 121.229.89.*
    看了代码,理解了一下恩很不错,对AJAX的一些基本上的概念有了一点认识
    #Sunny 发表于2008-05-29 10:50:38  IP: 58.246.65.*
    请教一下,在ajax_callback.jsp中
    <div id="div1">${uname}</div>一句中
    ${uname}是什么用法啊?JSP中有这样的语法吗?
    2008-05-29 12:06:24作者回复
    属于JSP表达式语言, 是JSP 2.0后添加的功能, 等同于&lt;%= %&gt;, 在本例中等同于&lt;%= request.getAttribute("uname") %&gt;
    #fengjikun 发表于2008-05-30 11:07:07  IP: 221.217.204.*
    请教一下,ajax_callback.jsp页面在onload的时候即使在主页面<iframe>里主页面也有刷新吧?
    代码可以发给我一份吗?
    fengjikun@gmail.com
    谢谢!
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © lldwolf