【php】配合Ajax与Json,根据MVC思想,无插件,完美兼容IE6,编写一个获取动态系统

获取用户动态在一些论坛等社交网络中很常见,甚至可以说,就是一个微博嘛。其实这个系统很简单的,很容易就能写出来。

当然,你平时要做好准备,在你的后台数据库加一张动态表,在用户发帖、回帖等各个动作的执行时候,再加一条把用户的各个动作入库,记录到一张专门的动态表内。时刻收集好用户的动态,这样才能向用户的好友或者整个网站的用户展示好友动态。

现在举一个例子来说明,怎么编写一个获取动态系统,也就是微博。

一、基本目标

假设我们现在收集了16条用户动态在Testtable表里面,时间什么的具体数据居然有条1877年发表的动态,请忽略这些细节,毕竟这16数据都是我自己乱打的。

假设这个表各个字段代表的东西如下图,毕竟这个表我用来做了多个实验,因此字段名称为何number是代表发表的动态,也请忽略这些细节,先假设这个number字段,代表用户的动态。

然后在一个网页上,按时间排序,先显示5条动态,如果用户想看更多,则点击按钮,每次读出5条给用户看。

当然,考虑到用户体验性什么鬼,我们还要在加载动态的时候,显示“加载中……”

如果没有最新动态,则提示。同时削去“查看更多的按钮”

二、基本思想

目录结构如下,就三个页面。

三、制作过程

1、首先在model.php根据《【php】利用php的构造函数与析构函数编写Mysql数据库查询类》(点击打开链接)的思想,写好数据库查询类,把testTable这些用户动态表的动态按照时间的倒序查询出来,把查询结构存放到一个testTableList的二维数组里面。

<?php
class testtable{
	private $con;
	function __construct($databaseName){
		$this->con=mysql_connect("localhost","root","root");
		if(!$this->con){
			die("连接失败!");
		}
		mysql_select_db($databaseName,$this->con);
		mysql_query("set names utf8;");
	}
	public function getAll(){
		$result=mysql_query("select * from testtable order by date desc;");
		$testtableList=array();
		for($i=0;$row=mysql_fetch_array($result);$i++){
			$testtableList[$i]['id']=$row['id'];
			$testtableList[$i]['username']=$row['username'];
			$testtableList[$i]['number']=$row['number'];
			$testtableList[$i]['date']=$row['date'];
		}
		return $testtableList;
	}
	function __destruct(){
		mysql_close($this->con);
	}
}
?>  

2、之后我们要再Controller.php,根据Model.php查询出来的二维数据,构造一个如下图的Json给前台的View.html页面。这个Json其实就是第1-6条动态。Json说白了,就是一个特殊的字符串。在这个controller.php构造出如下格式的字符串,打印出来,在view.html用Ajax获取这串字符串就可以了。

不过打印这个字符串的时候,必须注意,在利用php构造循环的时候,不要在某些容易忽略的位置多打逗号,,否则前台的javascript一辈子都识别不了此乃Json。

在Json字符串前后用[ ]括起来,前台的javascript直接用eval就可以了。

具体代码如下:

<?php
	header("Content-type: text/html; charset=utf-8");//设置编码,其实不设置也可以的。接受的javascript所在的页面设置好就可以了。
	include_once("model.php");//引入数据库查询类
	$dynamicPage=$_REQUEST["dynamicPage"];//从前台传递过来的动态起始位置
    $testtable=new testtable("test");
    $testtableList=$testtable->getAll();//把整张test数据库中的testtable表拿出来再说
	$total=$dynamicPage+5;//初定查询5条动态
	if($dynamicPage+5>count($testtableList)){//如果剩余的动态不足5条
		$total=count($testtableList);//则把剩余的动态读出来就可以了
	}
	//下面根据存放查询结果的二维数组构造json字符串
	$jsonStr="";
	//注意,php中字符串与字符串的连接是点.,数字的相加是+,不要和C++,Java等语言混淆了
	$jsonStr.="[";
	for($i=$dynamicPage;$i<$total;$i++){//只构造动态起始位置到(动态起始位置+5)的共5条动态给前台的javascript
        $jsonStr.="{
			'id':'".$testtableList[$i]['id']."',
			'username':'".$testtableList[$i]['username']."',
			'number':'".$testtableList[$i]['number']."',
			'date':'".$testtableList[$i]['date']."'
		}";//注意最后一项的date结尾没有逗号
		if($i+1!=$total){//注意,如果是数组的最后一项没有逗号
			$jsonStr.=",";
		}
    }
	$jsonStr.="];";
	echo $jsonStr;//注意构造完这个字符串要打印在这个php页面上
?>

3、view.html,最后大功告成的一步也就是javascript的内容,

首先,这个页面在HTML布局中什么都没有。就一个标题,与一个设置好id的div

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>动态列表</title>
</head>
<body>
<h1>动态列表</h1>
<div id="dynamic">
</div>
</body>
</html>

之后是《【JavaScript】网页节点的增删改查》(点击打开链接)的难点。具体代码如下:

<script>
//动态的起始位置一开始是0
var dynamicPage=0;
//创建Ajax对象,不同浏览器有不同的创建方法,其实本函数就是一个简单的new语句而已。
function createXMLHttpRequest() {
	var XMLHttpRequest1;
	if (window.XMLHttpRequest) {
		XMLHttpRequest1 = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
		try {
            XMLHttpRequest1 = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            XMLHttpRequest1 = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    return XMLHttpRequest1;
}
function getDynamic(){
	//如果有“查看更多”这个按钮,那么我们在添加最新动态的时候,先删去
	if(document.getElementById("moreButton")){
		//删除这个按钮
		var moreButton=document.getElementById("moreButton");
		moreButton.parentNode.removeChild(moreButton);
	}
	//创建一个加载中的p节点,加到动态列表id="dynamic"的div中,设置好id,一会儿便于删除
	var pLoading = document.createElement("p");
	pLoading.id="pLoading";
	pLoading.innerHTML="加载中……";
	document.getElementById("dynamic").appendChild(pLoading);
	//这句话纯属恶搞!
	alert("假设网速很卡");
	//开始对controller.php这个页面进行Ajax
	var XMLHttpRequest1=createXMLHttpRequest();
    var url="controller.php";
	//通过post方法
    XMLHttpRequest1.open("POST",url,true);
	XMLHttpRequest1.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	//给它传递dynamicPage这个参数
    XMLHttpRequest1.send("dynamicPage=" + dynamicPage);
    XMLHttpRequest1.onreadystatechange=function(){
        if(XMLHttpRequest1.readyState==4){
            if(XMLHttpRequest1.status==200){
				var data=eval(XMLHttpRequest1.responseText);//把后台的字符串读成json处理
				if(data==""){//如果这是空串就简单了,直接扔一个“无最新动态”的p节点给dynamic的div
					var p = document.createElement("p");
					p.innerHTML="没有最新动态了!";
					frag.appendChild(p);
				}
				else{
					//因controller.php扔过来的东西比较多,我们把创建的动态先放到一个文件碎片上面
					//不要读一条加一条,是读一条加一条到文件碎片上面,最后把整个文件碎片加到网页上,这样就不卡了
					var frag = document.createDocumentFragment();
					for (var i = 0; i < data.length; i++) {//对于json数组的操作
						//为json数组中的每一个json,创建一个p节点
						var p = document.createElement("p");
						//这个p的内容如下
						p.innerHTML="id为:"+data[i].id+"的"+data[i].username+"在"+data[i].date+"的动态是:"+data[i].number;
						//把这个p放到文件碎片上
						frag.appendChild(p);
						//再补条华丽的分割线
						var hr = document.createElement("hr");
						frag.appendChild(hr);
					}
					//最后我们在于文件碎片中补个查看更多的按钮
					var moreButton = document.createElement("button");
					moreButton.id="moreButton";
					moreButton.innerHTML="查看更多……";
					//注意在javascript设置按钮的事件是怎么设置的!
					moreButton.onclick=function(){getDynamic()};
					frag.appendChild(moreButton);
					//动态的起始位置偏移5个位置
					dynamicPage=dynamicPage+5;
				}
				//最后才把整个文件碎片放到div里面。这样就不会读一条,网页节点被操作一次了。
				document.getElementById("dynamic").appendChild(frag);
				//当然,我们要移除那个“加载中...”的p节点
				pLoading=document.getElementById("pLoading")
				pLoading.parentNode.removeChild(pLoading);
            }
            else{
                alert("网络连接中断!");
            }
        }
    };
}
//一开始,先读5条动态给用户看看吧!
getDynamic();
</script>

Javascript删除节点是有技巧的,先用var xx=document.getElementById("xx")找到自己,然后找自己的家长来删除自己xx.parentNode.removeChild(xx);

在Javascript如果利用var xx=document.createElement("button");创建一个按钮,那么这个按钮的onclick事件必须写成xx.onclick=function(){什么什么函数()},如果只写xx.onclick=什么什么函数()则无法把这个事件绑定在这个按钮的!

时间: 2024-07-30 20:20:50

【php】配合Ajax与Json,根据MVC思想,无插件,完美兼容IE6,编写一个获取动态系统的相关文章

关于web前端的MVC思想(二)——数据分开多次获取|jsonp

有可能会有这种情景,数据量很大,而且都是图片,那么如果一次性加载会导致页面浏览速度非常缓慢,对服务器也会造成流量方面的压力,或许那么多的数据对于用户来说并非都是被需要的,用户只需要其中的一部分. 那么这时候有种解决方案,就是一次只加载一部分数据,等到用户有更多的数据需求时再加载其它的部分,最后的效果的话类似网购搜索产品时,长长的产品清单拉到底部再另外加载一样. 下面用简单的js代码说明. var _chunks=[]; var _chunkNum=0; /* 回调函数 */ function c

Spring MVC Controller与jquery ajax请求处理json

在用 spring mvc 写应用的时候发现jquery传递的[json数组对象]参数后台接收不到,多订单的处理,ajax请求: var cmd = {orders:[{"storeId":"0a1", "address":"西斗门路2号", "goods":[{"goodsId":"1"}, {"goodsId":"2"},

MyEclipse下struts2配置使用和Ajax、json的配合

原创文章,转载请注明:MyEclipse下struts2配置使用和Ajax.json的配合 新手,初学struts2的配置,同时尝试与Ajax通过json交互.首先介绍MyEclipse下struts2的配置. 1.struts2的配置 右键项目,MyEclips->project facets->install apache struts(2.x)facets URL pattern我选择了*.action,libraries只选择了core 1.1撰写action 新建package,名为

Django-choices字段值对应关系(性别)-MTV与MVC科普-Ajax发json格式与文件格式数据-contentType格式-Ajax搭配sweetalert实现删除确认弹窗-自定义分页器-批量插入-07

目录 models 字段补充 choices 参数/字段(用的很多) MTV与MVC模型 科普 Ajax 发送 GET.POST 请求的几种常见方式 用 Ajax 做一个小案例 准备工作 动手用 Ajax 实现效果 contentType 前后端传输数据编码格式 ajax 提交数据 ajax发 json 格式数据 ajax 传文件 序列化组件 利用 sweetalert 搭建页面(弹窗) 弹窗中文支持不太好,手动修改样式 页面数据没刷新的问题 自定义分页器 批量插入测试数据 bulk_creat

spring mvc+ajax 实现json格式数据传递

使用ajax传递JSON对象 下面示例为ajax发送json对象,返回json格式数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 $.ajax({ url: "api/user", type: "POST", timeout: txnTimeOut, async: true, dataType: "json", data: {username : "lucy"}

MVC思想

MVC是一种设计模式(Design pattern),也就是一种解决问题的方法和思路, 是上世纪80年代提出的,到现在已经颇有历史了. MVC的意义在于指导开发者将数据与表现解耦,提高代码,特别是模型部分代码的复用性. MVC不仅仅存在于Web设计中,在桌面程序开发中也是一种常见的方法.MVC的出现已经有一段历史了. 记得我最早了解到MVC的时候,是在Microsoft的Visual C++ 中的MFC中. 当时年少无知,以为是MFC中特有的东西.后来随之不断学习,才发现自己的天真. 所以说,学

【Servlet】根据MVC思想设计用户登陆、用户注册、修改密码系统

MVC不是一种像C.JAVA的编程语言,也不是一种像Ajax,Servlet的技术,只是一种如同面向对象一样编程思想.近年来MVC一直很火,赞者批者有之,然后大篇幅的文章很多,可是简明扼要的简单MVC的例子几乎没有.在JSP领域一直向鼓风机地猛吹SSH如何如何地好,一直怒批JSP,Servlet等如何如何差.其实使用JSP+Servlet同样可以利用MVC思想来完成一个系统.下面用一个烂得不能再烂的例子,你步入网页编程必须学会的东西,登陆.注册.修改密码系统,来说明这种编程思想. 一.基本目标

深入理解Spring MVC 思想

原文:http://www.cnblogs.com/baiduligang/p/4247164.html 深入理解Spring MVC 思想 目录  一.前言二.spring mvc 核心类与接口三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明 六.springMVC-mvc.xml 配置文件片段讲解 七.spring mvc 如何访问到静态的文件,如jpg,js,css 八.spring mvc 

Struts2的MVC思想

 MVC思想概述 MVC思想将一个应用分成三个基本部分:Model(模型).View(视图).Controller(控制器),这三个部分以最少的耦合协同工作,从而提高应用的可扩展性及可维护性. 在经典的MVC模型中,事件由控制器处理,控制器根据事件的类型改变模型或视图,反之亦然.具体地说,每个模型对应一系列的视图列表,这种对应关系通常采用注册来完成,即:把多个视图(View)注册到同一个模型(Model),当模型发生改变时,模型向所有注册过的视图发送通知,接下来,视图从对应的模型中获得信息,