ASP.Net AJAX+userControl+js实现仿igoogle效果网站

news/2024/5/9 17:22:50/文章来源:https://dengbin.blog.csdn.net/article/details/3992565

不知道大家有没有用过igoogle这个google的个人门户网站,我弄的这个东西就是模仿igoogle,主要的难点是新闻模块的动态生成和模块的拖放功能和位置保存。基本原理是用userControl去实现新闻的容器--新闻模块,模块的内容由RSS提供,ASP.Net AJAX实现模块的拖放和服务器的数据存储,js负责提供页面的动态信息交给服务器处理。

 

一、userControl编写

userControl负责存放新闻,我们为了可以重复使用给他填上了属性。这样根据不同的属性就可以让

userControl提供不同的新闻。
模块的信息来源是RSS然后通过程序分析XML中的信息放在userControl中。

后台代码如下:

 


 1 using System;
 2 using System.Data;
 3 using System.Configuration;
 4 using System.Collections;
 5 using System.Web;
 6 using System.Web.Security;
 7 using System.Web.UI;
 8 using System.Web.UI.WebControls;
 9 using System.Web.UI.WebControls.WebParts;
10 using System.Web.UI.HtmlControls;
11 using UI_Servers;
12 using DB_Servers;
13 using Castle.ActiveRecord;
14 using Castle.ActiveRecord.Framework;
15 
16 
17     //public delegate void ClickEventHandler(object sender, EventArgs e);
18     public partial class WebUserControl : System.Web.UI.UserControl
19     {
20         private string Cid;//用户控件ID
21         private string Rssid;//获得数据库中Rss链接的编号
22         private RSSChannel channel;//Rss新闻信息
23         private int count;
24         public string CID
25         {
26             get { return Cid; }
27             set { Cid = value; }
28         }
29         public string RSSID
30         {
31             get { return Rssid; }
32             set { Rssid = value; }
33         }
34 
35         public int Count
36         {
37             get { return count; }
38             set { count = value; }
39         }
40         protected void Page_Load(object sender, EventArgs e)
41         {
42             string url;
43             Rss RSS = Rss.Find(Convert.ToInt32(Rssid));//通过Rssid获得Rss实体类(使用了Castle AR技术,数据库层这里不多做介绍了)
44             channel = new RSSChannel(RSS.RssURL);//通过RSS的URL建立新闻列表实体。
45             channel.ReadChannel();//为新闻实体添加数据(从RSS的XML分析而来)
46         }
47         /// <summary>
48         /// 填充页面RSS新闻
49         /// </summary>
50         /// <returns></returns>
51         public string GetContent()
52         {
53             string ret = string.Empty;
54             RSSItem[] items = new RSSItem[channel.Items.Count];
55             int i = 0;
56             for (; i < count && i < channel.Items.Count; i++)
57             {
58                 items[i] = channel.Items[i];
59                 ret += "<li><a href=/"" + items[i].Link + "/" alt=/"" + items[i].Description + "/">" +
60                     items[i].Title +
61                     "</a></li>";
62             }
63             return ret;
64 
65         }
66         /// <summary>
67         /// RSS新闻模块标题填充
68         /// </summary>
69         /// <returns></returns>
70         public string Title()
71         {
72             return "<href=/"" + channel.Link + "/" name=/"check/">" + channel.Title + "</a>";
73         }
74         /// <summary>
75         /// 生成拖动控件ID
76         /// 为以后ASP.Net AJAX的拖放注册准备
77         /// </summary>
78         /// <returns></returns>
79         public string DragID()
80         {
81             return Cid + "Drag";
82         }
83 
84 
85 

前台代码如下:

 


 1 <%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.cs" Inherits="WebUserControl" %>
 2 <div id="<%=CID %>" class="items">
 3         <div id="List_top" class="itemTop">
 4             <div id="<%=DragID() %>" class="itemTitle">
 5                 <%=Title() %>
 6             </div>
 7             <%--<asp:Button runat="server" ID="close_but"  Text="X" CssClass="closing" OnClientClick="elemClose(this);"/>--%>
 8             <input id="close_but" value="X" class="closing" onclick="elemClose(this);"  type="button"/>
 9         </div>
10                     <!-- 内容区域 OnClick="AButton_Click"-->
11         <div class="itemContent">
12             <ul>
13                 <%=GetContent() %>
14             </ul>
15         </div>
16         <div style="height:10px;"></div>
17 </div>
18

 

二、ASP.Net AJAX拖放编写

这里用到的是ASP.Net AJAX的拖放实现是依靠 ASP.Net AJAX CTP实现的,普通的ASP.Net AJAX 1.0是没有这个功能的。

在aspx页面上面加以下代码加载拖放的功能。

 


1     <asp:ScriptManager ID="sm" runat="server" EnablePageMethods="true">
2         <Scripts>
3             <asp:ScriptReference Assembly="Microsoft.Web.Preview" Name="PreviewScript.js" />
4             <asp:ScriptReference Assembly="Microsoft.Web.Preview" Name="PreviewDragDrop.js" />
5         </Scripts>
6     </asp:ScriptManager

现在拖放功能加载了,但是要告诉程序那个控件是可以拖放的,那个地方可以是投放控件的容器。ASP.Net AJAX CTP实现拖放需要用XML来注册控件的信息。下面是容器和容器注册的代码:

 1 <div id="cccc" style="display: block;">
 2         <!-- 左 (容器)-->
 3         <div id="leftArea" class="list1" runat="server">
 4         </div>
 5         <!-- 中 (容器)-->(容器)
 6         <div id="middleArea" class="list2" runat="server">
 7         </div>
 8         <!-- 右 (容器)-->(容器)
 9         <div id="rightArea" class="list3" runat="server">
10         </div>
11         <!-- template elements -->
12         <div style="display: none;">
13             <!-- 内有元素时候显示 -->
14             <div id="dropCueTpl" class="dropCue">
15             </div>
16             <!-- 内没有元素时候显示 -->
17             <div id="emptyTpl" class="emptyList">
18                 Drop content here.
19             </div>
20         </div>
21     </div> 
22 <!--下面是注册代码(XML)-->
23    <script type="text/xml-script">
24   <page>
25     <components>
26 
27       <!-- 左 -->
28       <control id="leftArea">(id为容器控件ID)
29         <behaviors>
30           <dragDropList id="leftDragDropBehavior"  dragDataType="HTML" 
31             acceptedDataTypes="'HTML'" dragMode="Move" direction="Vertical">
32             <dropCueTemplate>(内有元素时候显示)
33               <template layoutElement="dropCueTpl" />
34             </dropCueTemplate>
35             <emptyTemplate>(内没有元素时候显示)
36               <template layoutElement="emptyTpl" />
37             </emptyTemplate>
38           </dragDropList>
39         </behaviors>
40       </control>
41       <!-- 中 -->
42       <control id="middleArea">
43         <behaviors>
44           <dragDropList id="middleDragDropBehavior"  dragDataType="HTML" 
45             acceptedDataTypes="'HTML'" dragMode="Move" direction="Vertical">
46             <dropCueTemplate>
47               <template layoutElement="dropCueTpl" />
48             </dropCueTemplate>
49             <emptyTemplate>
50               <template layoutElement="emptyTpl" />
51             </emptyTemplate>
52           </dragDropList>
53         </behaviors>
54       </control>
55 
56       <!-- 右 -->
57       <control id="rightArea">
58         <behaviors>
59           <dragDropList id="rightDragDropBehavior" dragDataType="HTML" 
60             acceptedDataTypes="'HTML'" dragMode="Move" direction="Vertical">
61             <dropCueTemplate>
62               <template layoutElement="dropCueTpl" />
63             </dropCueTemplate>
64             <emptyTemplate>
65               <template layoutElement="emptyTpl" />
66             </emptyTemplate>
67           </dragDropList>
68         </behaviors>
69       </control>
70 
71       <!-- 可拖放控件的注册代码下面会提到 -->
72     <%=getreg() %>
73 
74     </components>
75   </page>
76     </script>
可拖放控件的注册代码<control id=可拖放的控件的ID><behaviors><draggableListItme handle=可拖放控件的触发控件(即点击此控件拖动就可以拖动可拖动控件)的ID/></behaviors></control>

 下面介绍一下拖放时候的可以用到的两个触发事件:

  1. Sys.Preview.UI.DragDropManager.add_dragStart(function(){})在拖拽开始的时候触发
  2. Sys.Preview.UI.DragDropManager.add_dragStop(function(){})在拖拽结束的时候触发

括号里面是执行的函数。

三、新闻模块的动态生成

新闻模块既然已经被做成userControl,那么只要把userControl当做一个类实例化它,再通过页面初始化时候加载它就可以实现了。但是这个涉及到的问题就是如何在程序中将userControl当做类实例化,如何使其具有拖拽功能,又放在那里。

首先我们来解决userControl的实例化问题,有些朋友可能发现直接写出userControl的名字程序不认识,就算是放在一个解决方案中using这个方案也不行,其实这个是要在.aspx页面下面注册的,注册或就可以在.cs下面访问了,这个和加载其他第三方控件是一样的。需要在aspx的文件开头就注册好程序中才能使用,当然在Web.config文件中也可以注册。一下是两种注册方法:

Title
  1. <% Register Src=userControl文件路径 TagName=元素的标记名称(在程序中的类名) TagPrefit=命名控件别名%>(aspx中注册)
  2. <add Src=  TagName=  TagPrefit= />(在web.config中注册)

这样解决了这个问题就可以动态实例化一个userControl了


1 WebUserControl b = (WebUserControl)LoadControl("WebUserControl.ascx");
2                             b.CID = item.Trim();
3                             b.RSSID = item_data[1].Trim(); ;
4                             b.Count = Convert.ToInt32(item_data[2

设置了这些属性以后在程序调用实例化userControl,其初始化时候新闻信息就会添加在这个userControl中了。

下面是如何实现拖放功能,想让其有拖放功能在前面已经做好了其拖放容器好容器的注册,现在只需要将其加入注册就可以了,因为控件是动态生成的没有办法直接写在aspx代码里面我们用<%=函数名%>实现向aspx中添加注册代码的方式实现注册。把userControl的CID和DragID以上面的可拖放控件的注册方式生成一段注册字符串,再提供给函数就可以了,由于比较简单这里就不增加代码了。

四、JS对userControl的定位和位置存储。

这个是我编这个网站时候遇到的最大的问题,我在这里想了一个方法实现这个问题是一段字符串来记录的,因为每次用户的拖拽时间都要去改变本用户的页面设置,也就是说每次数据库都要有改动,都要和服务器有信息交换,为了不花销过多的服务器资源把大部分的计算工作留给了预览器即JS处理,然后将页面状况描述为一个二维数组,再由有服务器将数组变成字符串存储在个人的设置中。

字符串格式

JS会在每次拖放结束的时候执行,搜索所有的新闻模块,然后根据其位置经过计算处理整理出字符串。

JS处理代码如下:

  1     // JScript 文件
  2     function pageLoad(sender, args) {
  3         //加载拖放结束时间的触发函数
  4         Sys.Preview.UI.DragDropManager.add_dragStop(DragStopped);
  5         //Sys.Preview.UI.DragDropManager.add_dragStart(function(){window.alert("Asdf");});
  6     }
  7     //拖放结束时间的触发函数
  8     function DragStopped(sender, args) {
  9         //模块位置排序
 10         var elems=elemSort();
 11         //userid为当前用户ID因为AJAX在程序中无法访问Session的值所以放在一个input中用AJAX回传
 12         var userid=$get("userIdHidden");
 13         //调用服务器事件保存模块位置
 14         PageMethods.elemOffset(elems,userid.value);
 15     }
 16     //function DragStart(sender, args)
 17     //{
 18     //    window.alert("DragStart Goes");
 19     //}
 20     //模块类
 21     function elem(ID,X,Y)
 22     {
 23         this.ID=ID;
 24         this.X=X;//模块位子X
 25         this.Y=Y;//模块位子Y
 26     }
 27     //获得模块
 28     //findElemsName为可拖放模块的Name熟悉,这里的拖放模块Name值都是一致的。
 29     function elemGet(findElemsName)
 30     {
 31         
 32         //获得可拖放模块集合
 33         var ele=document.getElementsByName(findElemsName);
 34         var elems=new Array;
 35         if(ele.length)
 36         {
 37             var temp_ele;
 38             for(elecount=0;elecount<ele.length;elecount++)
 39             {
 40                 var tempOffset=getoffset(ele[elecount]);
 41                 temp_ele=elemFilter(ele[elecount].parentNode.parentNode.parentNode.id);
 42                 var temp=new elem(temp_ele,tempOffset.x,tempOffset.y);
 43                 elems.push(temp);
 44             }
 45         }
 46         return elems;
 47     }
 48     //获得拖放模块ID
 49     function elemFilter(elemid)
 50     {
 51         //window.alert("elemFilter load");
 52         var temp=new Array();
 53         temp=elemid.split("X");
 54         i=0;
 55         var ret="";
 56         //window.alert(elemid);
 57         while(temp.length&&i<3)
 58         {
 59            if(temp[i])
 60            {
 61                 if(i!=0)
 62                     ret+="X";
 63                 ret+=temp[i];
 64                 i++;
 65            }
 66         }
 67         return ret;
 68     }
 69     //元素位子
 70     function elemOffset(x,y)
 71     {
 72         this.x=x;
 73         this.y=y;
 74         
 75     }
 76     //获得元素位子
 77     function getoffset(e) 
 78     {  
 79         var x=e.offsetLeft;  
 80         var y=e.offsetTop;  
 81         while(e=e.offsetParent) 
 82         {  
 83           x+=e.offsetLeft;  
 84           y+=e.offsetTop;  
 85         }  
 86         var rec = new elemOffset(x,y);
 87         return rec
 88     }  
 89     //
 90     function elemSort()
 91     {
 92         var elems=new Array();
 93         elems=elemGet("check");
 94         elems=sortY(elems);
 95         elems=sortX(elems);
 96         //三个数组分辨对应相应列
 97         var elemSorted=new Array(new Array(),new Array(),new Array());
 98         //获得列的位置
 99         var leftArea=getoffset(document.getElementById("leftArea"));
100         var middleArea=getoffset(document.getElementById("middleArea"));
101         var rightArea=getoffset(document.getElementById("rightArea"));
102        //和列位置比较看当前循环模块属于那个列,并降模块ID压入相应数组
103         for(elemscount=0;elemscount<elems.length;elemscount++)
104         {
105 
106            
107             if(elems[elemscount].X>=leftArea.x&&elems[elemscount].X<middleArea.x)
108             {
109                 elemSorted[0].push(elems[elemscount].ID);
110                 
111                 
112             }
113             else if(elems[elemscount].X>=middleArea.x&&elems[elemscount].X<rightArea.x)
114             {
115                 elemSorted[1].push(elems[elemscount].ID);
116             }
117             else
118             {
119                 elemSorted[2].push(elems[elemscount].ID);
120             }
121         }
122         return elemSorted;
123     }
124 
125     //拖放模块当前列排序
126     function sortY(elems)
127     {
128         var temp=new elem();
129         if(elems.length)
130         {
131             for(sorti=0;i<elems.length-1;sorti++)
132             {
133                 for(sortj=elems.length-1;sortj>sorti+1;sortj--)
134                 {
135                     if(elems[sortj].Y<elems[sortj-1].Y)
136                     {
137                         temp=elems[sortj];
138                         elems[sortj]=elems[sortj-1];
139                         elems[sortj-1]=temp;
140                     }
141                 }
142             }
143         }
144         return elems;
145     }
146 
147     //拖放模块当前行排序
148     function sortX(elems)
149     {
150         var temp=new elem();
151         if(elems.length)
152         {
153             for(Sorti=0;Sorti<elems.length-1;Sorti++)
154             {
155                 for(Sortj=elems.length-1;Sortj>Sorti+1;Sortj--)
156                 {
157                     if(elems[Sortj].X<elems[Sortj-1].X)
158                     {
159                         temp=elems[Sortj];
160                         elems[Sortj]=elems[Sortj-1];
161                         elems[Sortj-1]=temp;
162                     }
163                 }
164             }
165         }
166         return elems;
167     }
168 /*以下是控件关闭按钮客户端事件*/
169 function elemClose(sender)
170 {
171     var closeElemId=sender.parentNode.parentNode.id;
172     
173     var closeElem=document.getElementById(closeElemId);
174     //删除节点
175     closeElem.parentNode.removeChild(closeElem);
176     //模块排序
177     var elemCloseSort=elemSort();
178     var userid=$get("userIdHidden");
179     //保存位置
180     PageMethods.elemOffset(elemCloseSort,userid.value);
181 }

最后是首页的源码可以更好的理解程序但是代码不能运行哦首页代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_782282.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GCOGE技术内幕-Gcoge酷鸽传媒官方网站 Gcoge.com-酷哥一下,问题搞定!

Gcoge酷鸽传媒官方网站 Gcoge.com-酷哥一下,问题搞定!- 酷哥引擎新媒体 酷哥搜索珀利引擎-全球唯一全新概念珀利引擎新媒体--聚合优化创新 新思维 心服务~一个域名&#xff0c;通行天下!全球最大聚合门户!全球卓著搜索专家! 国内外著名搜索引擎聚合门户~我们的宗旨是为人民服务…

LAMP网站架构方案分析

LAMP&#xff08;Linux-Apache-MySQL-PHP&#xff09;网站架构是目前国际流行的Web框架&#xff0c;该框架包括&#xff1a;Linux操作系统&#xff0c;Apache网络服务器&#xff0c;MySQL数据库&#xff0c;Perl、PHP或者Python编程语言&#xff0c;所有组成产品均是开源软件&a…

如何搭建网站

常见的三种主流技术架构为 &#xff08;1&#xff09;LinuxApache/Nginx/LighttpdMysql/MariaDBPerl/PHP/Python 常见网站&#xff1a;新浪&#xff0c;维基百科&#xff0c;youtube&#xff0c;facebook&#xff0c;flickr &#xff08;2&#xff09;J2EE&#xff1a;jsp …

微视频试水社交网站 渐趋移动互联应用

与微视频/微电影的流行同步进行的是社交网络的兴起&#xff0c;微博成为比即时通讯更热门的交流工具&#xff0c;在微博界面能添加视频&#xff0c;这无疑给微电影一个爆发的平台。社交网络里的传播行为毫不保留地在微视频/微电影上体现和延伸。 在视频网站为“烧钱买独播剧”还…

开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo

代码下载热衷于开源框架探索的我发现ASP.NET MVC与jQuery easyUI的组合很给力。由于原先一直受Ext JS框架的licence所苦恼&#xff0c;于是痛下决心寻找一个完全免费的js框架——easyUI。它有完整的demo和强大AIP手册&#xff0c;使我在开发过程中得心应手。以下是这篇博文Demo…

美网站曝光乔布斯近照:面容憔悴令人担忧

北京时间8月27日消息&#xff0c;AOL旗下名人八卦网站TMZ曝光乔布斯近照&#xff0c;据称摄于乔布斯宣布退休后的第二天。图中的乔布斯形销骨立、面容憔悴。这张照片显示&#xff0c;乔布斯穿着一件黑色齐膝长袍&#xff0c;在阳光下站在一辆汽车旁&#xff0c;身边有一名身份未…

网络SEO优化 蜘蛛时代开启

百汇传媒多一度网络营销小贴士&#xff1a;SEO&#xff08;Search Engine Optimization&#xff09;&#xff0c;行业内称为搜索引擎优化&#xff0c;是较为流行的网络营销方式&#xff0c;主要目的是增加特定关键字的曝光率以增加网站的能见度&#xff0c;进而增加销售的机会。…

使用burp进行网站爆破

burp爆破的前提条件是该网站账号密码没有进行加密而是明文&#xff0c;且验证码可以重复使用&#xff0c;如下图数据包中直接显示账号与密码且验证码不需要重复提交&#xff08;此处需要自己使用burp进行测试&#xff09; 1.进入burp&#xff0c;监听浏览器 2.打开网站输入账…

【Java基础】静态网站技术-review

文章目录通信和服务图解工作过程待review问题参考通信和服务 早期的Web服务器&#xff0c;只能响应浏览器发来的HTTP静态资源的请求&#xff0c;并将存储在服务器中的静态资源返回给浏览器&#xff0c;今天我们追溯一下。 协议规范&#xff1a; 万维网(WorldWideWeb&#xff…

家谱社交网站MyHeritage开放家庭图谱API

MyHeritage被认为是以色列最有希望的web2.0公司&#xff0c;保持着高速的成长,让竞争对手Geni和Ancestry.com&#xff08;已经上市&#xff09;望尘莫及。 这家公司已经拥有接近6千万的注册用户&#xff0c;上传了2千万份家谱、8亿份档案和1.25亿张照片。这些储备对完成像MyHer…

本地化社交问答网站Drumo瞄准亚洲和澳洲市场

Drumo是由澳大利亚数字媒体公司Design Royale开发的本地化社交问答网站&#xff0c;目前在悉尼&#xff0c;东京和新加坡已经推出了服务&#xff0c;很快将登陆上海&#xff0c;香港&#xff0c;台北&#xff0c;墨尔本等更多亚洲和澳洲的城市。做问答社区的困难之处在于保持用…

12岁小学生自创5家网站 曾获腾讯300元创业贷款

9月1日&#xff0c;是中小学开学的日子。当天上午11时许&#xff0c;在平顶山市新华区胜利街小学六年级6班的教室里&#xff0c;东方今报记者见到了自创5家网站、组织十多人开发销售电脑软件的田众和。12岁的田众和坐在教室倒数第二排&#xff0c;大大的眼睛&#xff0c;高高的…

推荐一个很棒的免费自助建站工具:Tap

Tap简介Tap&#xff08;www.tap.cn&#xff09;是一个新型的免费自助建站服务平台&#xff0c;易用、专业、高效的Tap能让您轻松摆脱建站过程中技术对创造力的制约。拥有极高自由度的Tap能够快速提升您的建站热情。Tap为不同用户的需求配备了完美的个性化解决方案&#xff0c;T…

004coursera网站中的VTT字幕的使用

coursera网站中的VTT字幕的使用 1、 https://www.coursera.org/learn/os-virtsecurity/lecture/xuWgP/1-3-cao-zuo-xi-tong-an-quan-de-zhong-yao-xing 在coursera网站通过360极速浏览器的插件&#xff09;下载的视频&#xff08;有三个分辨率&#xff1a;1280x720&#xff08…

网站前端性能优化总结

一、服务器侧优化1. 添加 Expires 或 Cache-Control 信息头 某些经常使用到、并且不会经常做改动的图片&#xff08;banner、logo等等&#xff09;、静态文件&#xff08;登录首页、说明文档等&#xff09;可以设置较长的有效期&#xff08;expiration date&#xff09;&#x…

大型网站动态应用系统架构

动态应用&#xff0c;是相对于网站静态内容而言&#xff0c;是指以c/c、php、Java、perl、.net等服务器端语言开发的网络应用软件&#xff0c;比如论坛、网络相册、交友、BLOG等常见应用。动态应用系统通常与数据库系统、缓存系统、分布式存储系统等密不可分。大型动态应用系统…

设计易理解和操作的网站

当将易操作的理念融合到网站设计中时&#xff0c;网站设计的问题就变得更加复杂。当大多数人将使用全屏显示器访问计算机时&#xff0c;这些理念往往容易被大众忽视。除了需要考虑人们的身体条件如视力不好外&#xff0c;你也不得不注意到关于浏览器市场的不断变化。给你的用户…

大型网站后台架构的演变

随着用户访问量的不断增加&#xff0c;网站的后台也会不断变化以应对需求。本文主要从一个小型网站到大型网站的过度与变化来陈述。1.1 网站后台架构主要指由web server 、应用服务器、数据库、存储、监控等组成的网站后台系统。1.2 架构演变个人站点后台架构。如图2-1所示。 图…

一步步构建大型网站架构

之前我简单向大家介绍了各个知名大型网站的架构&#xff0c; MySpace的五个里程碑、 Flickr的架构、 YouTube的架构、 PlentyOfFish的架构、 WikiPedia的架构。这几个都很典型&#xff0c;我们可以从中获取很多有关网站架构方面的知识&#xff0c;看了之后你会发现你原来的想法…

网站架构之缓存应用

这篇来讲如何利用memcached实现一级缓存&#xff0c;以及如何让一级缓存组件支持在企业库&#xff0c;memcached或者其它第三方实施方案之间的切换。memcached本人并没有太多经验&#xff0c;如果文中有说的不对的地方&#xff0c;还希望批评指出&#xff0c;且文中关于memcach…