java写一个web聊天工具_javaweb写的在线聊天应用

写这个玩意儿就是想练练手, 用户需要登陆才能在线聊天,不要依赖数据库, 不需要数据库的操作, 所有的数据都是保存在内存中, 如果服务器一旦重启,数据就没有了;

登录界面:

5973eb06615beece480626e61812eb0f.png

聊天界面:

38b89c81560e280880b5bd8cf3e1ab87.png

左侧是在线的用户列表, 右侧是聊天的内容, 内容的格式为 “作者 : 内容”;

点击button可以发布聊天信息;

使用的是spring搭建的框架,基于tomcat的服务器;

web.xml的配置如下:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

index.htm

test

org.springframework.web.servlet.DispatcherServlet

1

test

*.htm

org.springframework.web.context.ContextLoaderListener

CharacterEncodingFilter

com.nono.Filter.CharacterEncodingFilter

encoding

UTF-8

SecurityServlet

com.nono.SecurityServlet

SecurityServlet

*.htm

contextConfigLocation

/WEB-INF/test-servlet.xml

View Code

conteConfigLocation的配置为:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

.jsp

View Code

整个项目的结构为一个主路由, 四个po层,  两个过滤器:

d45ae13b298dc6c7f1f62588936f1ef6.png

界面的用户列表和用户内容列表用了ajax刷新, 感觉不错的说:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

String basePath= request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>

login

height:100%;

}

.bg{

background:url(imgs/bg.jpeg);

}

content

enter text

Submit

$.post("chat.htm", "content="+ $("#answer").val(), function(data) {

console.log(data);

});

});functionGet(url , el, fn) {this.post = function() {

$.post(url,function(data) {

data=JSON.parse(data);var html = "";

$.each(data,function(i, e) {

html+=fn(i,e);

});

$(el).html( html );

});

};

};

(function() {var list = new Get("getList.htm", "#list", function(i, e) {return "

" + e.name + "";

});var content = new Get("getContent.htm", "#con", function(i, e) {return "

"+ e.name +" : "+ e.content +"

";

});

setInterval(function() {

list.post();

content.post();

},1000);

})();

View Code

权限控制的话我们可以用到fileter:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.nono;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;importcom.nono.po.User;public class SecurityServlet extends HttpServlet implementsFilter {private static final long serialVersionUID = 1L;public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throwsIOException, ServletException {

HttpServletRequest request=(HttpServletRequest)arg0;

HttpServletResponse response=(HttpServletResponse) arg1;

HttpSession session=request.getSession();

User user= (User) session.getAttribute("user");

String url=request.getRequestURI();//如果用户信息不是空的, 或者要访问的是登陆的界面(get,post的方式包含了login字符串);

if( user!=null || url.indexOf("login")>-1) {

arg2.doFilter(arg0, arg1);return;

}else{//余下的全跳到登陆界面

response.sendRedirect(request.getContextPath() + "/login.htm");return;

}

}public void init(FilterConfig arg0) throwsServletException {

}

}

View Code

路由控制和服务放到了一起, 因为权限控制使用过滤器处理, 所以在路由里面我们就不用关心用户的消息, 只要处理业务逻辑就好了:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.nono.Controller;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Vector;importjavax.jms.Session;importjavax.print.DocFlavor.STRING;importjavax.print.attribute.HashAttributeSet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;importnet.sf.json.JSONArray;importorg.omg.CORBA.PUBLIC_MEMBER;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importorg.springframework.web.bind.annotation.ResponseBody;importcom.nono.po.Content;importcom.nono.po.Contents;importcom.nono.po.User;importcom.nono.po.Users;

@Controllerpublic classMainController {//用户和用户组;

@Autowired

Users users;

@Autowired

Contents contents;

@RequestMapping(value="login", method=RequestMethod.GET)publicString login (HttpServletRequest request) {return "login";

}

@RequestMapping(value="login", method=RequestMethod.POST)publicString loginPOST ( HttpServletRequest request, HttpServletResponse response ) {

String string= "login";

String name= (String) request.getParameter("name");

Boolean flag= true;//如果名字不是空的话;

if( !name.equals("") ) {

Vector vector=users.getList();for(int i=0; i< vector.size(); i++) {

User user=(User) vector.elementAt(i);if( user.getName().equals( name ) ) {

flag= false;

};

};

};//用户名不存在

if( flag ) {

User user= newUser();

user.setName( name );

HttpSession session= request.getSession(true);//设置Session的过期时间为10分钟

session.setMaxInactiveInterval(600);//设置seesion中的用户信息;

session.setAttribute("user", user);//添加用户;

users.addUser( user );//加入的提示;

Content content = newContent();

content.setName( name );

content.setContent("enter the chat room!");

contents.addContent( content );

string= "chat";returnstring;

}else{//用户名已经存在

request.setAttribute("info", "用户名已经存在1");

string= "login";returnstring;

}

}

@RequestMapping(value="chat", method=RequestMethod.GET)publicString main (HttpServletRequest request) {

String string= "chat";returnstring;

}

@RequestMapping(value="chat", method=RequestMethod.POST)

@ResponseBodypublicString chat(HttpServletRequest request) {

String string= (String) request.getParameter("content");

HttpSession session=request.getSession();//设置seesion中的用户信息;

User user = (User) session.getAttribute("user");

String name=user.getName();

Content content= newContent();

content.setName( name );

content.setContent( string );

contents.addContent( content );return "true";

}

@RequestMapping(value="getList", method=RequestMethod.POST, produces = "text/html;charset=UTF-8")

@ResponseBodypublicString getList( HttpServletRequest request) {returnJSONArray.fromObject( users.getList() ).toString();

}

@RequestMapping(value="getContent", method=RequestMethod.POST, produces = "text/html;charset=UTF-8")

@ResponseBodypublicString getArrayList() {

ArrayList list=(ArrayList) contents.getContents();

ArrayList result= newArrayList();for( int i= 0; i< list.size(); i++) {

HashMap hashMap = newHashMap();

hashMap.put("name", ((Content)list.get(i)).getName());

hashMap.put("content", ((Content)list.get(i)).getContent());

result.add( hashMap );

};returnJSONArray.fromObject( result ).toString();

}

}

View Code

有哪位大神告诉我为什么中文各种乱码, 在界面中的utf-8也设置, @ResponseBody的也设置了, 还是乱码, encodeURIComponent过的也是乱码, 坑爹啊;

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

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

相关文章

python dataframe删除重复行_详解pandas使用drop_duplicates去除DataFrame重复项参数

Pandas之drop_duplicates&#xff1a;去除重复项方法DataFrame.drop_duplicates(subsetNone, keepfirst, inplaceFalse)参数这个drop_duplicate方法是对DataFrame格式的数据&#xff0c;去除特定列下面的重复行。返回DataFrame格式的数据。subset : column label or sequence o…

O-C相关-08-动态类型与静态类型

08-动态类型与静态类型 1, 什么是动态类型和静态类型 1) 动态语言 又叫动态编程语言&#xff0c;是指程序在运行时可以改变其结构&#xff1a;新的函数可以被引进&#xff0c;已有的函数可以被删除等在结构上的变化。比如众所周知的ECMAScript(JavaScript)便是一个动态语言。除…

python中numpy是什么_什么是NumPy?

本文是对官方文档的翻译&#xff0c;原文在此What is NumPy? - NumPy v1.14 Manual​docs.scipy.org以下开始正文。NumPy是Python的一个用于科学计算的基础包。它提供了多维数组对象&#xff0c;多种衍生的对象(例如隐藏数组和矩阵)和一个用于数组快速运算的混合的程序&#x…

java for循环 等待_java – 主题:忙等待 – 空循环

参见英文答案 > Is this starvation? 2个在我们的大学课程中,我们学习了Threads并使用“Busy Waiting”方法作为在TrafficLight等待的汽车的示例.为此,我们构建了三个类&#xff1a;> TrafficLight(实现Runnable)>汽车(实现Runna…

人物角色群体攻击判定(一)

我们制作3D动作游戏的时候,常常主人公是一对多人进行攻击,或者敌人在角色前方一定范围内进行攻击. 我们怎么实现这种效果呢&#xff1f; 1. 使用触发器(多体攻击)方便调试,可视化(推荐)2. 运用点乘和叉乘,判断敌人的角度和位置(单,多)一般3. 使用Physics的Physics.OverlapSpher…

mfc cimage加载显示图片_在微信小程序里实现图片预加载组件

网页中的图片预加载我们知道在 Web 页面中实现图片的预加载其实很简单&#xff0c;通常的做法是在 JS 中使用 Image 对象即可&#xff0c;代码大致如下var image new Image() image.onload function() {console.log(图片加载完成) } image.src"//misc.360buyimg.com/lib…

java mongodb 删除字段类型_Mongodb基本数据类型、常用命令之增加、更新、删除

1.null---表示空值或者该字段不存在&#xff0c;如{"name"&#xff1a;null}2.布尔 --- 和java中的布尔一样&#xff0c;有两种&#xff1a;true,false,如{"sex":true}3.浮点数---shell中所有的数字都是浮点数&#xff0c;如{"age":12},{"m…

HDU 2242 双连通分量 考研路茫茫——空调教室

思路就是求边双连通分量&#xff0c;然后缩点&#xff0c;再用树形DP搞一下。 代码和求强连通很类似&#xff0c;有点神奇&#xff0c;_&#xff0c;慢慢消化吧 1 #include <cstdio>2 #include <cstring>3 #include <algorithm>4 #include <vector>5 #…

wxpython菜单栏嵌套窗口_如何在wxpython中使嵌套的Panel和Sizer工作

此处的逻辑是创建一个Panel,在其中添加控件,然后创建一个BoxSizer,在其中声明您在Panel中添加的每个控件在调整大小时的行为,并最终在Panel上设置应用BoxSizer的对象.您有2期.>首先,您缺少posPnlobject的上述语句的最后一部分.添加&#xff1a;posPnl.SetSizer(posPnlSzr)将…

Java多态与反射

多态通过分离做什么和怎么做&#xff0c;从另一个角度将接口与实现分离开来&#xff1b;通过多态来消除类型之间的耦合关系&#xff0c;在Java中&#xff0c;多态也叫动态绑定&#xff0c;后期绑定或运行时绑定&#xff0c;那么什么是方法绑定&#xff1f; 方法调用绑定&#x…

java webservice用户验证_使用java webservice的.net4.0 web app需要Usernametoken身份验证

我是使用.net 4.0 VS2010的新手。我需要使用java web服务并发送usernametoken自定义身份验证来访问服务&#xff0c;这是我很容易在VS2005中使用WSE2.0&#xff0c;那么在net 4.0中替换它是什么&#xff1f;我的客户端是.net 4.0 Asp.net Web应用程序(网站)&#xff0c;服务是j…

python随机数模块_python 随机数模块 -- random

一、概述这个模块实现的伪随机数生成器。对于整数&#xff0c;从区间选取。对于序列&#xff0c;随机元素。在实线的&#xff0c;有功能来计算均匀分布&#xff0c;正态分布(高斯) &#xff0c;对数正态分布&#xff0c;负指数&#xff0c;γ和β分布。对于生成的角度分布&…

织梦dedecms5.7二级域名文章图片不显示修改方法.相对路径改为绝对路径的方法...

dedecms升级到5.7SP1后&#xff0c;开启二级域名&#xff0c;你会发现&#xff0c;在二级域名下的文章&#xff0c;上传的图片地址都是&#xff1a;二级域名图片地址&#xff0c;这是相对路径。但是你的图片是默认上传在uploads里面的。应该使用绝对路径。这就出现图片路径错误…

java注册中心nacos_spring-cloud整合nacos做注册中心

前面讲了spring-cloud整合nacos做配置中心&#xff0c;这节讲一下nacos做注册中心至于注册中心是什么&#xff0c;我就不讲了&#xff0c;不了解的可以去问度娘下面我就直接开始了&#xff0c;也是比较简单的&#xff1a;1.引入依赖1.8Greenwich.SR12.1.0.RELEASEorg.springfra…

python批量转换图片格式_python批量将图片转换为JPEG格式

标签&#xff1a;# -*- coding:utf-8 -*-import osfrom PIL import Imagedef resize(path):filelist os.listdir(path)for i in filelist:img Image.open(path i)outfile os.path.splitext(i)[0] .jpegif img ! outfile:img.save("C:/Users/Administrator/Desktop/最…

判断 JS 中对象的类型

1.typeof 形如 var x "xx"; typeof x string typeof(x) 返回类型有&#xff1a;undefined “string” number boolean function object 缺点&#xff1a;对于object类型不能细分是什么类型 优点&#xff1a;对空null的判断 undefined的应用 2.instanceof 形如 var …

java中接口回调_Java中的接口回调实例

定义&#xff1a;/*** author Administrator* project&#xff1a; TestOne* package&#xff1a; PACKAGE_NAME* date&#xff1a; 2018/11/30 0030 15:42* brief: 郭宝**/public class Person {/*** 自定义一个接口**/public interface OnNameChangeListener{//接口中的抽象函…

python经纬度转换xy坐标公式_python 经纬度和平面坐标相互转换利用米勒坐标系

xy_coordinate [] # 转换后的XY坐标集def millerToXY (lon, lat):"""经纬度转换为平面坐标系中的x,y 利用米勒坐标系:param lon: 经度:param lat: 维度:return:"""L 6381372*math.pi*2W LH L/2mill 2.3x lon*math.pi/180y lat*math.pi/1…

Android基于mAppWidget实现手绘地图(二)--概要

离线地图是一张被切成类似瓷砖般格子图像组成&#xff0c;这些被切开的格子组织成多个缩放级别。缩放级别是从0开始。0这个缩放级别&#xff0c;地图图像的尺寸为1*1像素。在每下一个缩放级别&#xff0c;图像尺寸则会两倍递增。 每个地图都是有层和地图对象的。 层是一个抽象的…

java实体字节属性定义_Java字节码方法表与属性表详解

而这些字节其实对应的信息是它&#xff1a;所以问题就来了&#xff0c;aload_0不是助记符信息么&#xff0c;怎么就能够跟字节码文件中的字节对应上呢&#xff1f;所谓助记符其实也就是帮忙我们去记忆的符合&#xff0c;在底层其实也是对应的一个个十六进制的数字的&#xff0c…