java web實現(xiàn)簡單聊天室
目標
servlet、jsp實現(xiàn)簡單聊天室,用戶通過瀏覽器登錄后進入聊天室,可發(fā)送消息進行群聊,點擊聊天信息框中的用戶名可實現(xiàn)拍一拍功能。
基礎(chǔ)知識
- 數(shù)據(jù)的存取 setAttribute / getAttribute
- request請求對象 :有效時間短
ServletContext上下文對象:一直存在于服務(wù)器,存儲公有、 共享數(shù)據(jù)
Session會話對象:獨立
- 網(wǎng)站默認頁面一般是index.jsp
實現(xiàn)思路
1.登錄頁面 login.jsp 輸入昵稱
2.編寫一個LoginSevlet,處理登錄提交的昵稱,保存登錄昵稱到session(會話變量)
若昵稱合法 if(nickname.length()!=0),跳轉(zhuǎn)到聊天室,不合法回到登錄頁面
3.編寫聊天室頁面chatroom.jsp ,是一個框架,把多個頁面集成到一個頁面中
<iframe src="message.jsp" width="100%" height="70%"> </iframe> <iframe src="input.jsp" width="100%" height="25%"> </iframe>
4.聊天內(nèi)容顯示message.jsp,不斷自動刷新標簽內(nèi)設(shè)置響應(yīng)頭,用${上下文變量}顯示聊天內(nèi)容
<meta http-equiv="refresh" content="1">
5.input.jsp(不刷新)輸入聊天內(nèi)容文本框text,點擊發(fā)送聊天內(nèi)容按鈕時,將把文本框的聊天信息提交給ChatServlet處理。下方有超鏈接可退出聊天室。
<a href="login.jsp" target="_top">退出聊天室</a>
6.ChatServlet:檢測聊天信息合法性,把聊天信息加入到ServletContext變量(字符串)中,(每次都將xx:xxxx加入上下文字符串)
判斷是否存在該變量,存在則直接讀取現(xiàn)有聊天內(nèi)容,把數(shù)據(jù)加入進去后,重新寫回上下文變量
7.實現(xiàn)拍一拍功能(目的:學習如何進行鏈接操作)
每個人名做成一個鏈接,訪問某一個servlet,該servlet可以在聊天信息(上下文變量)里添加一行,xx拍了yyy一下,跳轉(zhuǎn)回message.jsp
問題:鏈接里應(yīng)該包含yyy參數(shù),servlet?nick=yyy
say = "<a href='NickServlet?nickname="+nickname+"'target='_parent'>"+nickname+"</a>"+":"+text;
8.多人聊天實現(xiàn):多種類型瀏覽器
關(guān)鍵代碼
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="發(fā)送"><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, HttpServletResponse response) throws ServletException, 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, HttpServletResponse response) throws ServletException, 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); } //轉(zhuǎn)發(fā) RequestDispatcher dispatcher = request.getRequestDispatcher("/input.jsp"); dispatcher.forward(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, 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, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, 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存儲連接中傳遞的參數(shù),即被拍的用戶昵稱 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); } }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java實戰(zhàn)之在線寄查快遞系統(tǒng)的實現(xiàn)
這篇文章主要介紹了如何利用Java制作一個在線寄查快遞系統(tǒng),文中采用的技術(shù)有java、SpringBoot、FreeMarker、Mysql,需要的可以參考一下2022-02-02Spring循環(huán)依賴正確性及Bean注入的順序關(guān)系詳解
這篇文章主要給大家介紹了關(guān)于Spring循環(huán)依賴的正確性,以及Bean注入的順序關(guān)系的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-01-01解析spring-boot-starter-parent簡介
本文通過代碼的形式給大家介紹了spring-boot-starter-parent的基礎(chǔ)知識,需要的朋友可以參考下2018-09-09java數(shù)據(jù)結(jié)構(gòu)之希爾排序
這篇文章主要為大家詳細介紹了java數(shù)據(jù)結(jié)構(gòu)之希爾排序的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11java連接HBase,連接不上報錯can not resolve問題及解決
這篇文章主要介紹了java連接HBase,連接不上報錯can not resolve問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06