java web實(shí)現(xiàn)簡單聊天室
目標(biāo)
servlet、jsp實(shí)現(xiàn)簡單聊天室,用戶通過瀏覽器登錄后進(jìn)入聊天室,可發(fā)送消息進(jìn)行群聊,點(diǎn)擊聊天信息框中的用戶名可實(shí)現(xiàn)拍一拍功能。
基礎(chǔ)知識(shí)
- 數(shù)據(jù)的存取 setAttribute / getAttribute
- request請求對象 :有效時(shí)間短
ServletContext上下文對象:一直存在于服務(wù)器,存儲(chǔ)公有、 共享數(shù)據(jù)
Session會(huì)話對象:獨(dú)立
- 網(wǎng)站默認(rèn)頁面一般是index.jsp
實(shí)現(xiàn)思路
1.登錄頁面 login.jsp 輸入昵稱
2.編寫一個(gè)LoginSevlet,處理登錄提交的昵稱,保存登錄昵稱到session(會(huì)話變量)
若昵稱合法 if(nickname.length()!=0),跳轉(zhuǎn)到聊天室,不合法回到登錄頁面
3.編寫聊天室頁面chatroom.jsp ,是一個(gè)框架,把多個(gè)頁面集成到一個(gè)頁面中
<iframe src="message.jsp" width="100%" height="70%"> </iframe> <iframe src="input.jsp" width="100%" height="25%"> </iframe>
4.聊天內(nèi)容顯示message.jsp,不斷自動(dòng)刷新標(biāo)簽內(nèi)設(shè)置響應(yīng)頭,用${上下文變量}顯示聊天內(nèi)容
<meta http-equiv="refresh" content="1">
5.input.jsp(不刷新)輸入聊天內(nèi)容文本框text,點(diǎn)擊發(fā)送聊天內(nèi)容按鈕時(shí),將把文本框的聊天信息提交給ChatServlet處理。下方有超鏈接可退出聊天室。
<a href="login.jsp" target="_top">退出聊天室</a>
6.ChatServlet:檢測聊天信息合法性,把聊天信息加入到ServletContext變量(字符串)中,(每次都將xx:xxxx加入上下文字符串)
判斷是否存在該變量,存在則直接讀取現(xiàn)有聊天內(nèi)容,把數(shù)據(jù)加入進(jìn)去后,重新寫回上下文變量
7.實(shí)現(xiàn)拍一拍功能(目的:學(xué)習(xí)如何進(jìn)行鏈接操作)
每個(gè)人名做成一個(gè)鏈接,訪問某一個(gè)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.多人聊天實(shí)現(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存儲(chǔ)到session變量中
HttpSession session = request.getSession();
session.setAttribute("nickname",nickname);
//對nickname進(jìn)行合法性判斷
if(nickname.length()!=0){
//昵稱合法,則進(jìn)入聊天室頁面
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存儲(chǔ)聊天信息,并進(jìn)行合法性判斷
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存儲(chǔ)當(dāng)前用戶昵稱
String nickname = (String)session.getAttribute("nickname");
//name存儲(chǔ)連接中傳遞的參數(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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot項(xiàng)目打包部署到Tomcat的操作流程
在最近一個(gè)項(xiàng)目中,維護(hù)行里一個(gè)年代較為久遠(yuǎn)的單體項(xiàng)目,需要將項(xiàng)目打包放到的tomcat服務(wù)器下運(yùn)行,所以本文就給大家介紹一下SpringBoot項(xiàng)目打包部署到Tomcat的流程步驟,需要的朋友可以參考下2023-08-08
SpringBoot定時(shí)調(diào)度之Timer與Quartz詳解
Java?中常用的定時(shí)調(diào)度框架有以下幾種:Timer、ScheduledExecutorService、Spring?Task和Quartz,本文主要來和大家講講他們的具體使用,需要的可以參考一下2023-06-06
java反射機(jī)制及beanUtils的實(shí)現(xiàn)原理分析
本文介紹了Java的反射機(jī)制、VO、DTO、PO的概念以及BeanUtils的實(shí)現(xiàn)原理和簡單示例,通過反射可以在運(yùn)行時(shí)動(dòng)態(tài)操作類、方法和字段,BeanUtils用于在不同bean之間進(jìn)行屬性復(fù)制2024-12-12
Spring Boot構(gòu)建優(yōu)雅的RESTful接口過程詳解
這篇文章主要介紹了spring boot構(gòu)建優(yōu)雅的RESTful接口過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
生成PDF全攻略之在已有PDF上添加內(nèi)容的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄蒔DF全攻略之在已有PDF上添加內(nèi)容的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06

