实现类似微博、QQ空间等的动态加载

微博、QQ空间等的动态加载方式属于滚屏加载技术,获取当前滚动条位置来触发onscroll()函数,向服务器发起请求,将请求得到的新的数据动态加载在页面上

本文利用该原理实现了动态加载,但不是检测当前滚动条位置来触发函数,而是由按钮事件触发,因此更简单一些。

走过的弯路

1) 将目前读取到的数据库中的位置存放在session中,当要加载更多的时候,去session中获得该值,动态加载后修改session中的值

错误原因:session是有缓存的,如果停留在当前页面,得到的值还是一开始的session值,就算在该页面进行了修改

2) 将服务器逻辑控制代码通过内嵌的方式放在网页页面中,即通过<% %>的方式嵌入

错误原因:这些代码在一开始加载网页的时候,便在服务器端一次执行过后加载在网页中,不会因为网页的后续事件而触发代码段的重新执行

思路

1) 在数据库中,为表项添加一个属性state,用于表示该项是否已经加载

2) 进入该页面时,先将所有的元素的state置0,表示所有的项目都还没加载;通过选中根据一定排序规则排序后的前n项,并将这n项的state置1,表示已经加载

3) 在后续的操作中,若用户想查看更多,选择“加载更多”,即触发加载事件,向服务器发送ajax请求,服务器取得还没加载的项目根据一定排序规则后的前n项,生成网页代码字符串并返回;最后将这n项的state置1

4)当数据库中所有的项目都已加载,则返回0,以供网页端判断处理

注意

1)
网页端通过append()函数动态加载网页元素,无法加载css等,会显示异常,要加上$(‘#id‘).trigger("create");才能加
载成功;另外,我的例子中是在jquery
mobile中实现的,为<ul>元素动态加载子元素,因此需要刷新<ul>,
即$(‘ul‘).listview("refresh");

2) Mysql语言中,选择符合条件的记录m到n,不能直接写select * where condition limit m,n

该句的意思是从m开始的n项记录

以上方式利用数据库实现,在实际应用中,若考虑到多用户,则不用采用上述情况,可以考虑使用cookie来存储当前加载位置或者直接在js中利用变量存储当前位置

源码如下:"user_message.jsp"(用于显示留言页)

<%-- 
    Document   : staff_info
    Created on : 2013-7-22, 9:28:58
    Author     : zengyi
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>乘客留言墙</title>
        <link rel="shortcut icon" href="../image/wireless_box.ico">
        <link rel="stylesheet"  href="../jquery.mobile-1.3.0/jquery.mobile-1.3.0.min.css">
        <script src="../jquery.mobile-1.3.0/jquery-1.9.1.min.js"></script>
        <script src="../jquery.mobile-1.3.0/jquery.mobile-1.3.0.min.js"></script>
        <script src="../js/record_user_behavior_1.js"></script>
        <style>
            #wrap { 
                white-space:normal;
                word-wrap: break-word;   
                word-break: break-all;
                overflow: hidden;
                text-align: left;
            }
        </style>
    </head>
    <body>
        <%
            ResultSet re = null;
            Statement stmt = null;
            Connection con = null;
            String date, descript, time;
            try {  
                Class.forName("com.mysql.jdbc.Driver").newInstance();
                String connectionUrl = "jdbc:mysql://localhost/wb?" + 
                                   "user=root&password=526156";
                con = DriverManager.getConnection(connectionUrl);
                stmt = con.createStatement();
            } catch (SQLException e) {
                System.out.println("SQL Exception: "+ e.toString());
            }
            re = stmt.executeQuery("SELECT * FROM user_message_other order by id DESC limit 10");               //选择前十条未读的显示
        %>
        <div data-role="page" data-theme="a">
            <div data-role="header" data-position="fixed">
                <h1 style="color: white; font-family: Helvetica,Arial,sans-serif; font-weight: bold;">乘客留言</h1>
                 <a href="index.jsp" data-shadow="false"
data-iconshadow="false" data-icon="arrow-l" data-iconpos="notext"
data-ajax="false">Back</a>
            </div>
            <div data-role="content">
                <ul data-role ="listview" data-inset ="true">
                        <%
                            if(re.next()){
                                if(re.previous()){};
                                while(re.next()){
                                    descript = re.getString("descrip");
                                    date = re.getString("date");
                                    time = re.getString("time");
                        %>
                        <div data-role="button" style="width: 100%; height: auto">
                            <div id="wrap" style="font-size: 16px;
color: white; width: 100%; height: auto; "><%= descript
%></div>
                            <br />
                            <p style="margin-left:-15px;">
                                <span style="float:left; color:
white; "><strong>发布时间:<%= date %> <%= time
%></strong></span>
                            </p>
                        </div>
                        <%
                                }
                            }
                        %>
                </ul>
                <div data-role="button" style="width: 100%; height: auto" onclick="loadmore()">
                     加载更多
                </div>
            </div>
        </div>
        <script>
            var load_pos = 10;
            function loadmore(){
                var xmlhttp;
                if (window.XMLHttpRequest){
                    xmlhttp=new XMLHttpRequest();
                }
                else{
                    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
                }
                xmlhttp.onreadystatechange=function(){
                    if (xmlhttp.readyState==4 && xmlhttp.status==200){
                        if(xmlhttp.responseText==0){
                            alert("已加载完所有留言");
                        }
                        else{
                            load_pos += 10;
                            $(‘ul‘).append(xmlhttp.responseText);
                            $(‘ul‘).trigger("create");
                            $(‘ul‘).listview("refresh");
                        }
                    }
                }
                xmlhttp.open("GET","message_load.jsp?load_pos="+load_pos,false);
                xmlhttp.send();
            }
        </script>
                <%
                        re.close();
                        stmt.close();
                        con.close();
                %>
    </body>
</html>

"message_load.jsp"用于服务器端加载信息及返回

<%-- 
    Document   : update_message
    Created on : 2013-5-13, 20:08:31
    Author     : zengyi
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%  
    ResultSet re = null;
    Statement stmt = null;
    Connection con = null;
    String date, descript, time;
    int load_pos_start = Integer.parseInt(request.getParameter("load_pos"));
    String outstring = "";
    try {  
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        String connectionUrl = "jdbc:mysql://localhost/wb?" + 
                           "user=root&password=526156";
        con = DriverManager.getConnection(connectionUrl);
        stmt = con.createStatement();
        re = stmt.executeQuery("SELECT * FROM user_message_other order
by id DESC limit "+load_pos_start+",10");       //从未读的消息中选择十条显示
        if(re.next()){
            if(re.previous()){};
            while(re.next()){
                descript = re.getString("descrip");
                date = re.getString("date");
                time = re.getString("time");
                outstring += "<div align=\"center\" data-role=\"button\" style=\"width: 100%; height: auto\">";
                outstring += "<div id=\"wrap\" style=\"font-size:
16px; color: white; width: 100%; height: auto;
\">"+descript+"</div>";
                outstring += "<br />";
                outstring += "<p style=\"margin-left:-15px;\">";
                outstring += "<span style=\"float:left; color: white;

\"><strong>发布时间:"+date+time+"</strong></span><
/p></div>";
            }
            out.print(outstring);
        }
        else{
            out.print(0);
        }
    } catch (SQLException e) {
        System.out.println("SQL Exception: "+ e.toString());
    } catch (ClassNotFoundException cE) {
        System.out.println("Class Not Found Exception: "+ cE.toString());
    }
    finally{
        if (re !=null){
            try{ re.close(); }catch(SQLException sqlEx){}
        }
        if (stmt !=null){
            try{ stmt.close(); }catch(SQLException sqlEx){}
        }
        if (con !=null){
            try{ con.close(); }catch(SQLException sqlEx){}
        }
    }
    //-------------------------------------------------
%>

时间: 2024-10-15 00:16:44

实现类似微博、QQ空间等的动态加载的相关文章

Android动态加载XML文件及控件来简单实现QQ好友印象的功能

在android开发中,我们常常会遇到界面布局控件不确定的情况.由于某些功能的原因或者为了体现某些app的特色等这些原因会导致我们在实现界面布局时需要动态去加载一些控件,那么下面就来介绍一下如何用动态加载控件来简单实现QQ中好友印象的功能,其中也会提到如何来动态加载一个XML的配置文件. 那么要实现好友印象的功能,我们需要通过以下这几个步骤: 1.界面一开始需要加载一个EditText和Button控件,用于填写好友印象和添加好友印象: 2.需要新建一个arrays.xml,在xml文件中添加上

携程Android App插件化和动态加载实践

携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实现细节,回顾携程Android App的架构演化过程,期望我们的经验能帮助到更多的Android工程师. 需求驱动 2014年,随着业务发展需要和携程无线部门的拆分,各业务产品模块归属到各业务BU,原有携程无线App开发团队被分为基础框架.酒店.机票.火车票等多个开发团队,从此携程App的开发和发布

滚屏无刷新动态加载数据

我们经常会见到滚动条滑动到底部时会自动加载数据,比如QQ空间的查看动态.下面就用一个简单的Demo来实现 1.首先建一个html文件,代码如下 1 <!DOCTYPE html> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=ut

[JS前端开发] js/jquery控制页面动态加载数据 滑动滚动条自动加载事件

页面滚动动态加载数据,页面下拉自动加载内容 相信很多人都见过瀑布流图片布局,那些图片是动态加载出来的,效果很好,对服务器的压力相对来说也小了很多 有手机的相信都见过这样的效果:进入qq空间,向下拉动空间,到底部时,会动态加载剩余的说说或者是日志 今天我们就来看看他们的实现思路和js控制动态加载的代码 下面的代码主要是控制滚动条下拉时的加载事件的 在下面代码说明出,写上你的操作即可,无论是加载图片还是加载记录数据  都可以 别忘了引用jquery类库 [JavaScript] 纯文本查看 复制代码

jQuery页面滚动图片等元素动态加载实现

一.关于滚动显屏加载 常常会有这样子的页面,内容很丰富,页面很长,图片较多.比如说光棍节很疯狂的淘宝商城页面. 或者是前段时间写血本买了个高档耳机的京东商城页面,或者是新浪微博之类. 这些页面图片数量多,而且比较大,少说百来K,多则上兆.要是页面载入就一次性加载完毕.乖乖,估计黄花都变成黄花菜了.所以,我们得做点什么,避 免这种糟糕的状况发生.目前很流行的做法就是滚动动态加载,显示屏幕之外的图片默认是不加载的,随着页面的滚动,这个要显示图片的区域进入了浏览器可是窗 口范围,则触发图片的加载显示.

【Jquery mobile】动态加载ListView 转

[Jquery mobile]动态加载ListView 分类: Jquery Mobile2011-12-01 09:04 13984人阅读 评论(1) 收藏 举报 jquerylistviewmobilestylesheetjavascriptlist 动态增加列表项是一个基本的功能,今天测试了一下.先贴下效果图: 点击“更多...”,就会增加列表项. 代码如下: [html] view plaincopy <!DOCTYPE html> <html> <head>

[Android]动态加载/热部署框架汇总

1.DroidPlugin 用途:动态加载 使用案例:360手机助手 GitHub地址:https://github.com/Qihoo360/DroidPlugin ppt介绍:https://github.com/Qihoo360/DroidPlugin/tree/master/DOC Demo:https://github.com/SpikeKing/wcl-plugin-test-app 详解: http://blog.csdn.net/yzzst/article/details/480

【转】Unity3D AssetBundles 动态加载游戏资源

AssetBundles are files which you can export from Unity to contain assets of your choice. These files use a proprietary compressed format and can be loaded on demand in your application. This allows you to stream content like models, textures, audio c

180729-Quick-Task 动态脚本支持框架之任务动态加载

Quick-Task 动态脚本支持框架之任务动态加载 前面几篇博文分别介绍了整个项目的基本架构,使用说明,以及整体框架的设计与实现初稿,接下来则进入更细节的实现篇,将整个工程中核心实现捞出来,从为什么这么设计到最终的实现给予说明 相关系列博文: 180702-QuickTask动态脚本支持框架整体介绍篇 180719-Quick-Task 动态脚本支持框架之使用介绍篇 180723-Quick-Task 动态脚本支持框架之结构设计篇 I. 任务动态加载 这个动态脚本调度框架,最大的一个功能点就是