Web聊天室(基于Servlet)
主要实现思路:使用Servlet作用域的概念,通过使用session、ServletContext进行传值。
注意事项:这里使用了request.setCharacterEncoding("UTF-8");的转码方式,所以在提交表单时需要将方法设置为post方法
1、用户登陆
1)显示登陆界面
2)接收登陆的用户名(用户名需要传递给后面的代码)
ServletContext(Set<String>)其中为何使用Set来存用户列表而不是List,因为Set不可允许重复,可以少一层判断
Session保存自己用户名
用于和集合中比对,找出自己的,改颜色
3)转向到聊天室界面
2、显示聊天室界面
1)界面:frameset+frame
2)实时显示在线用户
显示
1)获取在线用户(ServletContext)
从Session中获取当前用户,控制自己显示的颜色
2)生成html元素显示
实时
3)实时显示聊天信息
4)发送聊天信息
接收:将信息保存在上下文
List<String[]>
登陆界面代码(LoginServlet)
···
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
res.setContentType("text/html;charset=UTF-8");
PrintWriter out = res.getWriter();
boolean msg=false;
//获取用户名
String userName = req.getParameter("userName");
//判断是否有值
ServletContext ctx = this.getServletContext();
Set<String> userNameSet = (Set<String>)ctx.getAttribute("USER_SET");
if(userName != null&&!"".equals(userName))
{
if(!(userNameSet != null&&userNameSet.contains(userName)))
{
//若没有登陆过,则写入Session、写入上下文
req.getSession().setAttribute("LOGIN_USER", userName);
if(userNameSet == null)
{
//若用户集合不存在则创建
userNameSet = new HashSet<String>();
ctx.setAttribute("USER_SET", userNameSet);
}
userNameSet.add(userName);
req.getRequestDispatcher("mainServlet").forward(req, res);
return;
}else{
msg = true;
}
}
out.println("<form action='loginServlet' method='post'>");
out.println("请输入用户名:");
out.println("<input type ='text' name='userName'/>");
out.println("<input type = 'submit' value='登陆'/>");
out.println("</form>");
if(msg)
{
out.println("<script type='text/javascript'>");
out.println("alert('"+userName+"已经登陆,请输入另一个用户名');");
out.println("</script>");
System.out.println("已经登陆");
}
}
}
···
主显示区域代码
public class MainServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
req.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<frameset rows='70%,*'>");
out.println("<frameset cols='70%,*'>");
out.println("<frame src='viewMsgServlet' name='viewMsgServlet'/>");
out.println("<frame src='userMsgServlet'/>");
out.println("</frameset>");
out.println("<frame src='sendMsgServlet'/>");
out.println("</frameset>");
out.println("</html>");
}
}
显示当前登陆用户代码
public class UserMsgServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
resp.addHeader("Refresh", "2");//两秒后发一下当前的请求
PrintWriter out = resp.getWriter();
//获取上下文中的用户集合
//获取当前用户名
Set<String> userSet = (Set<String>)req.getSession().getServletContext().getAttribute("USER_SET");
String userName = (String)req.getSession().getAttribute("LOGIN_USER");
out.println("<HTML>");
out.println("<body>");
if(userSet != null)
{
for(String user:userSet)
{
if(userName != null&& userName.equals(user))
{
out.println("<font color='red'>"+user+"</font><br>");
}else
out.println(user+"<br>");
}
}
out.println("</body>");
out.println("</HTML>");
}
}
发送消息界面代码
public class SendMsgServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
//获取消息
String msg = req.getParameter("msg");
System.out.println(msg);
if(msg != null&&!"".equals(msg))
{
HttpSession session = req.getSession();
//获取当前用户名
String userName = (String)session.getAttribute("LOGIN_USER");
ServletContext stx = session.getServletContext();
String[] msgs = {userName,msg};
List<String[]> msgList = (List<String[]>)stx.getAttribute("MSGS_LIST");
if(msgList==null)
{
msgList = new ArrayList<String[]>();
stx.setAttribute("MSGS_LIST", msgList);
}
msgList.add(msgs);
}
out.println("<html>");
out.println("<body>");
out.println("<form action='sendMsgServlet' method='post'>");
out.println("请输入信息:");
out.println("<input type='text' name='msg'/>");
out.println("<input type='submit' value='提交'/>");
out.println("</form>");
out.println("</body>");
out.println("</html>");
}
}
显示消息区域代码
public class ViewMsgServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
resp.setHeader("Refresh", "2");
PrintWriter out = resp.getWriter();
//获取得到的信息
HttpSession session = req.getSession();
ServletContext ctx = session.getServletContext();
List<String[]> msgsList = (List<String[]>)ctx.getAttribute("MSGS_LIST");
//获取当前用户名
String userName = (String)session.getAttribute("LOGIN_USER");
out.println("<HTML>");
out.println("<body>");
if(msgsList!=null)
{
for(String[] msgs:msgsList)
{
out.println(msgs[0]+"说:"+msgs[1]);
out.println("<br>");
}
}
out.println("</body>");
out.println("</HTML>");
}
}
网友评论