1. 程式人生 > 程式設計 >java web實現簡單聊天室

java web實現簡單聊天室

目標

servlet、jsp實現簡單聊天室,使用者通過瀏覽器登入後進入聊天室,可傳送訊息進行群聊,點選聊天資訊框中的使用者名稱可實現拍一拍功能。

基礎知識

  • 資料的存取 setAttribute / getAttribute
  • request請求物件 :有效時間短

ServletContext上下文物件:一直存在於伺服器,儲存公有、 共享資料
Session會話物件:獨立

  • 網站預設頁面一般是index.jsp

實現思路

1.登入頁面 login.jsp 輸入暱稱

2.編寫一個LoginSevlet,處理登入提交的暱稱,儲存登入暱稱到session(會話變數)
若暱稱合法 if(nickname.length()!=0),跳轉到聊天室,不合法回到登入頁面

3.編寫聊天室頁面chatroom.jsp ,是一個框架,把多個頁面整合到一個頁面中

<iframe src="message.jsp" width="100%" height="70%"> </iframe>
<iframe src="input.jsp" width="100%" height="25%"> </iframe>

4.聊天內容顯示message.jsp,不斷自動重新整理標籤內設定響應頭,用${上下文變數}顯示聊天內容

<meta http-equiv="refresh" content="1">

5.input.jsp(不重新整理)輸入聊天內容文字框text,點擊發送聊天內容按鈕時,將把文字框的聊天資訊提交給ChatServlet處理。下方有超連結可退出聊天室。

<a href="login.jsp" target="_top">退出聊天室</a>

6.ChatServlet:檢測聊天資訊合法性,把聊天資訊加入到ServletContext變數(字串)中,(每次都將xx:xxxx加入上下文字串)
判斷是否存在該變數,存在則直接讀取現有聊天內容,把資料加入進去後,重新寫回上下文變數

7.實現拍一拍功能(目的:學習如何進行連結操作)
每個人名做成一個連結,訪問某一個servlet,該servlet可以在聊天資訊(上下文變數)裡新增一行,xx拍了yyy一下,跳轉回message.jsp
問題:連結裡應該包含yyy引數,servlet?nick=yyy

say = "<a href='NickServlet?nickname="+nickname+"'target='_parent'>"+nickname+"</a>"+":"+text;

8.多人聊天實現:多種型別瀏覽器

關鍵程式碼

login.jsp

暱稱:<input type="text" name="nickname"/><br> <br><br>
<input type="submit" value="登入"/>
<input type="reset" value="取消"/>

input.jsp

<form action="input.do" method="post">
 <input type="text" size="50" name="text"/>
 <input type="submit" value="傳送"><br><br><br><br>
 <a href="login.jsp" rel="external nofollow" rel="external nofollow" target="_top">退出聊天室</a>
</form>

message.jsp

<h3>一起來聊天吧</h3>
${says}

LoginServlet.java

package chatting;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "LoginServlet2",urlPatterns = {"/login.do"})
public class LoginServlet2 extends HttpServlet {
 protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
 //避免亂碼
 response.setContentType("text/html;charset=utf-8");
 request.setCharacterEncoding("utf-8");
 //nickname儲存使用者暱稱
 String nickname = request.getParameter("nickname");
 //nickname儲存到session變數中
 HttpSession session = request.getSession();
 session.setAttribute("nickname",nickname);
 //對nickname進行合法性判斷
 if(nickname.length()!=0){
 //暱稱合法,則進入聊天室頁面
  request.getRequestDispatcher("/chatroom.jsp").forward(request,response);
 }
 else{
 //暱稱不合法,返回登陸頁面
  request.getRequestDispatcher("/login.jsp").forward(request,response);
 }

 }

 protected void doGet(HttpServletRequest request,IOException {
 }
}

ChatServlet.java

package chatting;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Vector;

@WebServlet(name = "ChatServlet",urlPatterns = "/input.do")
public class ChatServlet extends HttpServlet {
 protected void doPost(HttpServletRequest request,IOException {
 //防止亂碼
 request.setCharacterEncoding("utf-8");
 response.setContentType("text/html;charset=utf-8");
 HttpSession session = request.getSession();
 String text = request.getParameter("text");
 //text儲存聊天資訊,並進行合法性判斷
 if (text.length()!=0) {
  String say =new String();
  //獲取session中的暱稱
  String nickname = (String)session.getAttribute("nickname");
  //將暱稱作為連結,並傳參
  say = "<a href='NickServlet?nickname="+nickname+"'target='_parent'>"+nickname+"</a>"+":"+text;
  String says = new String();
  //將暱稱和聊天資訊一起放在上下文變數
  ServletContext context = getServletContext();
  if(context.getAttribute("says")!=null){
  says = context.getAttribute("says") + say + "<br>";
  }
  else{
  says = say + "<br>";
  }
  context.setAttribute("says",says);
  request.setAttribute("says",says);
 }
 //轉發
 RequestDispatcher dispatcher = request.getRequestDispatcher("/input.jsp");
 dispatcher.forward(request,response);
 }

 protected void doGet(HttpServletRequest request,IOException {


 }
}

NickServlet.java

package chatting;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "NickServlet",urlPatterns = "/NickServlet")
public class NickServlet extends HttpServlet {
 protected void doPost(HttpServletRequest request,IOException {

 }

 protected void doGet(HttpServletRequest request,IOException {
 response.setContentType("text/html;charset=UTF-8");
 request.setCharacterEncoding("utf-8");
 //將拍一拍放到上下文變數says中 一起輸出

 HttpSession session = request.getSession();
 //nickname儲存當前使用者暱稱
 String nickname = (String)session.getAttribute("nickname");
 //name儲存連線中傳遞的引數,即被拍的使用者暱稱
 String name = java.net.URLDecoder.decode(request.getParameter("nickname"),"UTF-8");
 String pick = nickname+"拍了拍"+name+"<br>";

 ServletContext context = request.getServletContext();
 String says = context.getAttribute("says")+pick;
 context.setAttribute("says",says);

 RequestDispatcher dispatcher = request.getRequestDispatcher("/chatroom.jsp");
 dispatcher.forward(request,response);
 }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。