因为参加比赛,需要在网页系统中集成一个网页聊天室的功能,想着自己完整地开发一个。想起最开始学习java基础的时候,最后的作业就是利用java开发一个类似qq的在线聊天软件,但是,当时虽然有老师带着一步一步地做,但是最后因为socket通信的一个核心问题,没有解决,最后也不了了之了。这次利用web程序开发方法,做一个聊天软件,想着思想和架构还是挺简单的,但是开发过程中还是遇到了很多很多各种各样的问题,其中也有一些学习过程中一直遗留和忽视的问题,现在将这些问题集中贴上来,以备留存:
1.在web程序中,引用资源文件properties的问题,如果将资源文件放在src目录下,将程序运行为application是没有问题的,但是将程序放在tomcat容器中运行的时候,就会出现找不到指定文件的错误,究其原因,是因为在运行web程序的时候,eclipse会将相关的java文件进行编译成class文件,而jsp文件会编译成相应的servlet文件,并且将整个工程放在tomcat指定的路径webapps下面,这样就造成了properties的相对路径的改变,查找webapps相应的目录线面的properties路径,发现经过编译后,资源文件存放在了WEBINF/classes文件夹下,这样的话,就可以用如下的方法解决:
public String getPath(){
String path = this.getClass().getResource("/").getPath();//得到classes的文件夹路径
path = path.replaceAll("%20"," ");//空格转换
path = path +"db.properties";
return path;
}
</pre><span style="white-space:pre"></span><p></p><div style="text-align:left">.<img src="https://img-blog.csdn.net/20141118165902609?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzU5MTg3MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" /></div><div style="text-align:left"></div><div style="text-align:left">2.系统基于struts进行开发,而struts的action的execute方法又必须要有一个返回值,也就是说action接收到一个请求后,就必须跳转到一个action或者是jsp页面中,当我们不希望其进行跳转,而只是进行接收请求和返回请求的ajax操作的时候,我们可以将返回值设为“return null”:</div><div style="text-align:left"></div><div style="text-align:left"><pre name="code" class="java"> public String execute() throws Exception {
HttpServletResponse response = ServletActionContext.getResponse();//在action中得到request和response的方法,在ServletActionContext中得到
HttpServletRequest request = ServletActionContext.getRequest();
response.setCharacterEncoding("UTF-8");
HttpSession session = request.getSession();
response.setContentType("text");
// 获得已登录用户
User user = (User) session.getAttribute("user");
//System.out.println("用户" + user.getName() + "正在请求最新消息");
ArrayList<Message> list = new ChatImpl().accMsg(user.getId(), toUserId);
PrintWriter writer = response.getWriter();
if (list.size() == 0) {
// 没有新消息,写入""
writer.write("");
writer.flush();
writer.close();
} else {
// 以gson的数据方式响应请求数据
Gson gson = new Gson();
String s = gson.toJson(list);//向response中写入json字符串,ajax端的data值设为json,就可以将接受到的data作为json对象进行处理了
writer.write(s);
writer.flush();
writer.close();//每次使用完毕writer以后,都需要关闭一下,不然下一次再接受请求的时候,writer里面会残存上一次的数据,造成数据的不一致性
}
return null;
}
3.jquery的ajax异步通信方式,代码如下:
//ajax与服务器进行通信,异步是否有新消息
setInterval(function() {
jQuery.ajax({
url : "isNewMsg",
type : "post",
dataType : "json"//接受到的响应类型为json
data : {
"userId":${user.id}//js代码中是可以使用java脚本的
},
success : function(data) {
for(var i=0;i<data.length;i++){//接收的对象为json字符串儿,处理方式
shake(data[i]);
}
}
});
// 每隔1s刷新一次
}, 1000);
//在提交前进行检查
function check() {
if ($("#name").val() == "") {
<!-- 在每一个输入框的后面的一个id为lname的lable标签,作为验证信息的显示处 -->
$("#lname").text("用户名不能为空");
return false;
}
if ($("#pwd").val() == "") {
$("#lpwd").text("密码不能为空");
return false;
}
if ($("#repwd").val() == "") {
$("#lrepwd").text("请再次输入密码");
return false;
} else if ($("#pwd").val() != $("#repwd").val()) {
$("#lrepwd").text("两次输入的密码不一致");
return false;
}
if ($("#nickname").val() == "") {
$("#lnickname").text("昵称不能为空");
return false;
}
if ($("#sex").val() == "") {
$("#lsex").text("请选择性别");
return false;
}
return true;
}
5.struts2中,action的默认跳转方式为请求转发方式,但是为了防止表单的重复提交,需要将其设置为重定向类型:
<action name="register" class="com.chat.action.Register">
<result type="redirect" name="success">/index.jsp</result>
<result type="redirect" name="input">/register.jsp</result>
</action>
6.将html转换为jsp文档的时候,最主要的是将其jsp的相关头屑规范和标准,不然会出现一些莫名的错误,如jquery不能使用的问题,这个问题困扰了好久,最终是重写页面代码才解决的
7.在进行数据库的事务操作的时候,首先,conn.setautocommit(false)一定要在所有的数据库和connection操作都做完以后,才进行事物提交,不然会出现代码执行没有任何错误,但是数据库相关数据却没有得到更新的错误:
<span style="white-space:pre"> </span>conn.setAutoCommit(false);
ps = conn.prepareStatement(sql);
ps.setInt(1, msg.getFrom().getId());
int count = ps.executeUpdate();
conn.commit();