`
SwineX
  • 浏览: 36246 次
  • 性别: Icon_minigender_1
  • 来自: 常德
社区版块
存档分类
最新评论

web版聊天工具开发中的一些体会(1)

    博客分类:
  • web
阅读更多
   这个东西做了也有一点时间了,主要涉及的有dwr,jquery,dhtmltree,以及打了点酱油的dom4j.做到一半才知道ext是干什么的,但是好像这第一个版本已经没有它的施展余地了,留到下一次好了。用到的东西比较散,除了对dwr看的比较多意外,其他的都只是两天左右看了看,只看了需要的部分,所以了解不是很深,所以只能简单的谈一谈感想。

1.数据库
数据库建的很简单,一共7张表,暂时只用到三张




2.关于dwr
dwr最大的好处是让有点繁琐的ajax变成了在javascript里面写java。但是由于页面前端和后台是异步的,当需要执行的函数比较复杂时,就需要同步一下,免得前端反应太“快”而没有取得dwr返回的数据:

dwr.util.setAsync(false);
//dwr语句
dwr.util.setAsync(true);


另外,dwr在执行过程中,如果在web-inf/lib下缺少某些类库的话,eclipse的控制台是不会报错的,页面前端也只是弹出一个error的提示框。今天在使用dom4j编写一个xml文件时就遇到这个问题,这个后面后提到。

3.jquery
jquery是个很强大的框架,也支持ajax,但是dwr在这方面更强大一点,不过,在对于页面的一些操作上,dwr的util工具就逊色很多了。w3school上的教程很详细,不过我也没有仔细看,一直是当成查询手册,想用什么就看什么。
我曾遇到过这个问题:
$(document).ready(function(){
   function f1(){
   }
});

function f2(){
    }

在这里f1和f2中的方法是不能相互调用的,而且在页面的事件中,也就是onclick=""这里是不能调用f1的方法。假如要调用怎么办?jquery实际上对事件的支持很强大,对于事件的定义都可以在jquery中完成,而不需要在html页面里面做过多的编写,所以像f2这样的方法是完全不需要的。如下:
$("#[属性ID]").click(function(){
  //事件方法
});


4.dom4j + dhtmlxtree = 好友列表的动态加载
从昨天晚上到今天早上一直都在做这个事情;
4.1 xml
dhtmlxtree树形组件的内容完全可以有xml文件直接加载得到
xml一般格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<tree id="0">
  <item text="我的好友" id="list1" im0="" im1="" im2="">
    <item text="SwineLP" id="friend10001" im0="" im1="" im2=""/>
  </item>
</tree>


tree标签是必须的,id必须与
tree=new dhtmlXTreeObject("[div id]","200%","200%","treeid");

中的第四个参数treeid一致(我今天在这里就吃了亏,老是说我没有父节点什么的)
im0:若无子节点是的图片
im1:节点未打开时的图片
im2:节点打开时的图片
想关的标签属性还有很多。

4.2 基本流程
登陆成功 -- 数据库搜索好友数据 -- 整理成xml格式字符串 -- 通过dwr发送到页面 -- 通过tree.loadXMLString([xmlstring],[callback])实现列表的加载



这里就直接贴代码了

数据库读取:
/**
 * 获得xxno用户的当前好友列表信息map
 * @param xxno
 * @return
 */
public static HashMap<String,ArrayList<User>> getFriends(String xxno){
	HashMap<String,ArrayList<User>> friendList = new HashMap<String,ArrayList<User>>();
	try{
		Connection conn = ConnFactory.getConn();
		
		//获得列表数据
		String sql = "select seryname from series where userno = ?";
		PreparedStatement pstmt = conn.prepareStatement(sql);
		pstmt.setString(1, xxno);
		ResultSet smrs = pstmt.executeQuery();
		
		while(smrs.next()){
			friendList.put(smrs.getString(1), null);
		}
		
		sql = "select s.seryname,f.xxno,f.remark,u.nickname,u.state from series as s,friends as f,user as u where s.seryid = f.seryid and f.xxno = u.xxno and s.userno = ?";
		pstmt = conn.prepareStatement(sql);
		pstmt.setString(1, xxno);
		ResultSet frs = pstmt.executeQuery();
		while(frs.next()){
			String seryname = frs.getString(1);
			if(  null == friendList.get(seryname)){
				ArrayList<User> flist = new ArrayList<User>();
				friendList.put(seryname, flist);
			}
			//打包好友信息,加入好友队列中
			User user = new User();
			user.setXxno(frs.getString(2));
			user.setRemark(frs.getString(3));
			user.setNickname(frs.getString(4));
			user.setState(frs.getByte(5));
			friendList.get(seryname).add(user);
		}
		return friendList;
	}catch(Exception ef){
		Diary.println(ef, "用户注册时:");
		return null;
	}
}


整理成xml格式字符串
public static String getFriendList(String xxno){
		
		
		Document doc = DocumentHelper.createDocument();
		HashMap<String,ArrayList<User>> friendList = UserDao.getFriends(xxno);	
		
		Set<String> series = friendList.keySet();
		//将好友列表信息打包成xml格式文件
		Element tree = doc.addElement("tree");
		tree.addAttribute("id", "0");
		int col = 0;//好友分类数
		for(String seryname : series){
			ArrayList<User> flist = friendList.get(seryname);
			Element sery = tree.addElement("item");
			sery.addAttribute("text", seryname);
			sery.addAttribute("id", "list" + ++col);
			sery.addAttribute("im0","serypic.jpg");
			sery.addAttribute("im1","serypic.jpg");
			sery.addAttribute("im2","serypic.jpg");
			while(flist.size() > 0){
				User user = flist.remove(0);
				Element f = sery.addElement("item");
				if(null == user.getRemark()){
					f.addAttribute("text", user.getNickname());
				}else{
					f.addAttribute("text", user.getRemark() + "("+ user.getNickname() +")");
				}
				f.addAttribute("id", "friend" + user.getXxno());
				f.addAttribute("im0", "head.jpg");
				f.addAttribute("im1", "head.jpg");
				f.addAttribute("im2", "head.jpg");
			}
		}
		return doc.asXML();
	}

这里本来用拼接字符串就能够得到的,但是还是借用了一下dom4j,哈哈,看起来爽一点。


然后是dwr层
	public String getFriendsXML(String xxno){
		return FriendsList.getFriendList(xxno);
	}


最后就是在页面里面调用了
$(document).ready(function(){
  	//获得好友xml  	
	var xxno = $("#xxno").html();
  	dwr.engine.setAsync(false);
  	var treexml = XXIMPage.getFriendsXML(xxno);
  	dwr.engine.setAsync(true);
  	
  	var tree = new dhtmlXTreeObject("friendtree","100%","100%",0);
  	tree.setImagePath("images/");
  	tree.loadXMLString(treexml, function(){
  		alert("载入成功!");
  	});
  	tree.enableTreeLines(false);
  	tree.setImageArrays("plus","plus_ar.gif","plus_ar.gif","plus_ar.gif","plus_ar.gif");
  	tree.setImageArrays("minus","minus_ar.gif","minus_ar.gif","minus_ar.gif","minus_ar.gif");
  	tree.setStdImages("plus_ar.gif","minus_ar.gif","plus_ar.gif");	
});


tree中的setImageArray()和setStdImages()的方法还有问题,ignore!!关键在于列表xml的载入
  • 大小: 17.3 KB
分享到:
评论

相关推荐

    javaweb课设报告.doc

    - **设计完成后**,学生需要撰写实训报告,总结开发过程中的遇到的问题、解决方法、以及个人对Java Web开发的理解和体会。 6. **设计内容** - **具体步骤**:报告详细阐述了每个设计任务的实施过程,包括Tomcat...

    jQuery权威指南-源代码

    近年来,Web开发领域的新技术和新工具层出不穷,它们的出现极大地推动了Web开发技术的发展,其中jQuery的诞生在Web技术的发展进程中具有划时代的意义。 jQuery发布于2006年,它因为易于使用、功能强大、展现优雅、...

    计算机网络课程设计题目.pdf

    【计算机网络课程设计题目】是针对学生学习计算机网络知识的一项实践环节,旨在加深对网络编程、Web开发等概念的理解和应用。以下是对几个设计题目的详细解析: **第一类:基于套接字的网络编程设计** 1. **局域网...

    大一计算机总结.docx

    总结来说,大一至大二的计算机学习是一个循序渐进的过程,从基础概念到编程语言,再到数据库管理和Web应用开发,每个阶段都有其独特的重要性。实践项目是巩固理论知识、提升技能的关键,而合适的开发工具则能激发...

    计算机创新实践报告.docx

    在本次实践中,我们选择了一个实际的项目——开发一款基于Web的协同办公系统。该项目涵盖了前端界面设计、后端数据处理、数据库管理、用户认证与权限控制等多个方面。我们首先进行了需求分析,明确了系统的功能模块...

    《小型网站建设与管理》课程实习大纲.doc

    2. 掌握ASP动态网站设计与开发,熟练使用ODBC连接到WEB数据库。 3. 理解网站设计的艺术审美,包括色彩和文本布局的基本原则。 4. 了解JavaScript和VBScript的主要特性,特别是它们在网页设计中的交互性和动态性作用...

    宾馆客房管理系统PPT

    - 开发语言:选用Java作为开发语言,Java以其跨平台、安全性以及强大的网络计算能力,成为开发Web应用的理想选择。MyEclipse作为集成开发环境,提供了便利的开发和调试环境。 - 数据库:采用Microsoft Office ...

    C#z做的QQ界面

    例如,当用户成功登录后,登录窗体会关闭,主聊天窗体(ChatForm)会被打开,此时登录信息需要传递到新的窗体以便后续使用。 6. **状态管理** - 为了模拟真实的QQ体验,需要管理用户的登录状态。这可能涉及到使用...

    Myzone1.3视频播客空间程序.rar

    1、支持虚拟形象和无虚拟形象 2、支持家园商品本地图片及远程图片调用 3、支持家园商品定期更新 4、可以将用户设计的家园生成静态图片(需空间安装了asppainter组件),以后自己的家园图片可以到处贴了! 5、...

    Myzone视频播客空间程序

    1、支持虚拟形象和无虚拟形象 &lt;br&gt;2、支持家园商品本地图片及远程图片调用 &lt;br&gt;3、支持家园商品定期更新 &lt;br&gt;4、可以将用户设计的家园生成静态图片(需空间安装了asppainter组件),以后自己的家园图片可以...

    BotJose:向您发送模因的不和谐机器人!

    首先,我们要了解JavaScript,这是一种广泛用于Web开发的高级编程语言,尤其在前端开发中占据核心地位。然而,JavaScript不仅仅局限于浏览器环境,它也可以在Node.js平台上运行,这使得JavaScript成为构建服务器端...

    slackware.im:http

    通过分析这些代码,我们可以深入了解Web开发的早期实践,包括HTML、PHP和Perl等技术的应用,这些都是当时网页设计和服务器端脚本的主流工具。同时,它也展示了如何利用FTP、HTTP等协议来分发软件包,使用户能够方便...

    throw-voice:Discord的简单录音。 https:gitlab.compawabotpawa的镜像

    1. **Kotlin语言**:Kotlin是一种现代、静态类型的编程语言,由JetBrains开发,被广泛用于Android应用开发,Web开发,以及服务器端开发。它的语法简洁明了,支持函数式和面向对象编程,具有空安全特性和类型安全的...

Global site tag (gtag.js) - Google Analytics