JavaEE簡易聊天室(Netbeans:Servlet+Cookie+Session)

Web聊天室源文件
在這裏插入圖片描述

一、題目

利用Java EE相關技術實現一個簡單的Web聊天室系統,具體要求如下:

  1. 編寫一個登錄頁面,登錄信息中有用戶名和密碼,分別用兩個按鈕來提交和重置登錄信息。
  2. 通過請求指派來處理用戶提交的登錄信息,如果用戶名爲本小組成員的名字且密碼爲對應的學號時,跳轉到LoginSuccess顯示聊天界面(類似於QQ羣聊天界面,可使用HTML中的frameset標籤生成兩個窗口,一個用來實現用戶信息輸入,另一個顯示所有用戶聊天記錄的);否則跳轉到LoginFail頁面,提示用戶重新登錄(注:此頁面要包含前面的登錄界面)。
  3. 在聊天室界面顯示“信息輸入”窗口和“聊天記錄顯示”窗口的內容;用戶在“信息輸入”窗口中鍵入聊天內容,點擊“發送”按鈕後,在“聊天記錄顯示”窗口中顯示發送消息的用戶名稱和聊天內容(提示:可以利用Servlet 上下文保存聊天記錄並將其顯示在textarea中。)
  4. 在登錄界面上實現記住用戶名和密碼的功能,使得當用戶選擇了此功能併成功登錄後,在其下次登錄時可以不用再輸入用戶名和密碼即可登錄(提示:此功能可通過Cookie來實現。)

以下功能選做:

  1. 編寫一個Listener程序來監聽會話的創建和銷燬事件,以此統計當前在線(登錄)人數,並將其顯示在聊天界面上。
  2. 添加一個Filter對本系統所有的Servlet程序進行過濾,該Filter實現對請求和響應對象的編碼格式的設置(實現此功能後,Servlet可以直接從請求對象中獲取參數信息而無需實現對請求進行格式的編碼)。在【GlassFish Server】視圖中輸出程序在Filter和其它資源之間的執行順序。

二、實驗環境

  1. JDK 1.8 提取碼:gehi
  2. NetBeans IDE 8.1 提取碼:4oe2

三、實現

1、流程圖

在這裏插入圖片描述

2、界面效果

(1)登錄界面效果

在這裏插入圖片描述

(2)聊天界面效果

在這裏插入圖片描述
因爲寫的簡單,所以如果需要登錄兩個用戶,需要在兩個瀏覽器上登錄。

3、具體界面

(1)登錄界面(login.jsp)

1.1 jsp

  • 獲取所有的Cookie信息,當cookies不爲空時,遍歷獲取用戶名和密碼,爲了防止出現亂碼,需要將用戶名用 URLDecoder.decode(cookies[i].getValue(), “UTF-8”)方法解碼。

1.2 表單

  1. 用戶名框:
    將input的placeholder屬性設置爲“請輸入用戶名”可將提示內容顯示在輸入框中;value設爲<%=username%>可以在記住用戶名後,刷新頁面後能夠自動填入用戶名信息;name屬性設爲“username”方便後面取出用戶名框中的值。
  2. 密碼框:密碼框與用戶名框一致,將placeholder、value、type、name的值改爲對應的值即可;
  3. 記住密碼:input的type設爲“checkbox”,即爲複選框;value設爲“yes”,用來標識是否勾選記住密碼複選框;name設爲“remember_pwd”;
  4. 重置按鈕:在表單中將button的type屬性設爲“reset”,即可重置輸入的內容;
  5. 登錄按鈕:在表單中將button的type屬性設置爲“submit”,在頁面點擊登錄按鈕時,會以post方法將表單內容提交到GetPostData。
(2)接收登錄界面數據(GetPostData.java)
  1. 編碼格式使用Filter過濾,所以不再重新設置編碼格式;
  2. 利用request.getParameter方法從表單中獲取用戶名、密碼和checkbox的值;創建usernameCookie和passwordCookie,因爲用戶名可能爲中文,所以在創建usernameCookie時,我們需要用URLEncoder.encode()方法進行編碼;
  3. 將小組成員的信息存入name和pwd數組中,遍歷數組與獲取的用戶信息進行比較,如果在數組中找到對應的用戶名密碼則將用戶名則用request.getSession().setAttribute()方法將用戶名存入session中,將juge設爲true,跳出循環;
  4. 如果用戶名密碼對應(即juge值爲true),再判斷用戶是否在登錄界面上勾選記住密碼複選框,即通過request.getParameter(“remember_pwd”)獲取的值與“yes比較”,如果爲“yes”則設置MaxAge爲一個月,否則設爲0,然後將usernameCookie和pwdCookie添加到cookie信息中,最後通過sendRedirect方法跳轉至登錄成功界面;若juge值爲false則跳到登錄失敗頁面,並提示登錄失敗,然後跳轉至登錄界面重新登錄。
(3)輸入聊天內容(Input.java)
  1. 與其他頁面一樣,編碼格式使用Filter過濾,所以不再重新設置編碼格式;
  2. 用Date獲取當前系統時間,將獲取的時間轉化爲SimpleDateFormat設置的時間格式“MM-dd HH:mm”;
  3. 獲取表單中name屬性爲input的值作爲內容,並判斷內容是否爲空;若爲空則彈出提示框提示內容不能爲空,若不爲空則通過request.getSession().getAttribute()方法獲取當前用戶的名字,並判斷值是否爲空;若爲空則則提示重新登錄,若不爲空則將用戶名字、時間和輸入的內容組合作爲聊天的內容儲存;
  4. 將聊天內容通過getServletContext().setAttribute(“record”,chat_record)方法放入上下文中。
(4)輸出聊天記錄(output,jsp)
  1. 用request.getServletContext().getAttribute(“record”)方法獲取聊天記錄,判斷內容是否爲空;若爲空則將record的值賦爲” ”,避免在沒有聊天記錄時在聊天界面輸出null;
  2. 同獲取聊天記錄一樣獲取在線人數,如果獲取的聊天人數值爲null,則將在線人數online賦值爲0;
  3. 利用輸出表達式<%=online%>和<%=record%>,將在線人數和聊天內容輸在在輸出聊天記錄界面。
(5)攔截非法登錄(LoginFilter.java)
  • 在loginSuccess.html設置過濾器,用req.getSession().getAttribute(“nameSession”)方法獲取在登錄界面存的用戶名session,判斷session中是否爲空,如果爲空則提示未登錄然後返回登錄界面;如果不爲空則執行chain.doFilter(request,response)語句,繼續向下執行。
(6)監聽在線人數(SessionListener.java)
  1. 用戶登錄,用戶名密碼正確提交後在接收登錄界面數據的GetPostData.java中創建session。用戶登錄時,創建session調用sessionCreated,用evt.getSession().getServletContext().
    getAttribute(“online”)方法獲取當前人數current,如果爲null則修改current爲“0”,轉化爲整型,然後將人數加1,轉化爲字符串後再用evt.getSession().getServletContext().setAttribute
    (“online”,current);將當前人數current寫入。
  2. 用戶登錄後,點擊聊天成員後面的註銷按鈕時,跳轉至logout.jsp頁面,調用request.getSession().invalidate();方法銷燬會話,再通過sendRedirect方法跳轉回聊天成員界面;調用sessionDestroyed,先獲取當前在線人數current,轉化爲整型,人數減1,轉化爲字符串後再將會當前人數current人數寫入。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章