java_OA管理系統(一):Servlet總結案例仿網絡聊天室


因為我們學校的軟件聯盟要為我們校區開發一個OA系統,為此我將其所需要的一些技術進行匯總,以便web組組員開發所用.

第一篇是關於Servlet的一個匯總案例,算是開個簡單的小頭.

一.總述

代碼來源於,我在某著名網校(tzedu)學習時,老師講的匯總案例--仿網絡聊天室,

實現功能

1.登錄
2.發送聊天信息與QQ表情
3.臟話屏蔽

知識要點:

1.jsp工程文件目錄
2.servlet執行
3.web.xml文件基本配置
4.jsp動態創建網頁
5.jsp拼接路徑
6,請求,表單的亂碼處理
7.seesion
8,application


項目文件結構:

項目的文件結構

文件結構解釋:

1.index.jsp登陸界面

2.jframe.jsp網絡聊天室,的框架頁面

3.send.jsp發送消息界面

4.ShowMsg.java,創建消息展示界面


5.OnlineServlet.jsp:創建登陸者頁面

6.InitServlet.jsp.服務器啟動時執行,內存中創建list(本案例中用來存儲登陸人信息與聊天記錄)(<load-on-startup>0</load-on-startup>)

7.SendServlet(發送請求),LoginServlet(登錄)

8.images文件夾:存儲表情圖片.

二.init創建List

web.xml配置如下:

  <servlet>
  	<servlet-name>init</servlet-name>
  	<servlet-class>com.tz.util.InitServlet</servlet-class>
  	<load-on-startup>0</load-on-startup>
  <span style="white-space:pre">	</span><!-- load-on-startup元素標記容器是否在啟動的時候就加載這個servlet(實例化並調用其init()方法)。 -->
  <span style="white-space:pre">	</span><!-- 當值為0或者大於0時,表示容器在應用啟動時就加載並初始化這個servlet -->
  <span style="white-space:pre">	</span><!-- 詳細的可以去看這個網址:http://www.blogjava.net/xzclog/archive/2011/09/29/359789.html -->
  </servlet>

InitServlet.jsp

/**
 * 初始化servlet
 * 設置一個appliction屬性
 * 會隨着Tomcat啟動而加載,無需訪問,但是需要配置才行
 *
 */
@SuppressWarnings("serial")
public class InitServlet extends HttpServlet{
	
	public void init() throws ServletException {
		//獲得上下文
		ServletContext application = this.getServletContext();
		//第一次訪問的時候就創建一個 list存入上下文,用於獲取存儲用戶的多條聊天記錄
		List<String> list = new ArrayList<String>();
		application.setAttribute("msglist", list);
		//用於獲取用戶信息
		List<String> userList = new ArrayList<String>();
		application.setAttribute("userlist", userList);
		
		
	}
}

項目中的存儲:

1.各頁面及各jsp,xml文件以及QQ表情(images)文件夾
2.內存中的:兩個list, msglist and userlist------>存儲在application:在一個應用服務器范圍內有效
3.等等

三.登錄界面

表單代碼如下

<form action="login" method="post" >
    	<input type="text" name = "username">
    	     
    	<input type="submit" value="登陸">
    </form>

web.xml配置文件

  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.tz.util.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>

LoginServlet.jsp

/**
 * 初始化servlet
 * 設置一個appliction屬性
 * 會隨着Tomcat啟動而加載,無需訪問,但是需要配置才行
 *
 */
@SuppressWarnings("serial")
public class InitServlet extends HttpServlet{
	
	public void init() throws ServletException {
		//獲得上下文
		ServletContext application = this.getServletContext();
		//第一次訪問的時候就創建一個 list存入上下文,用於獲取存儲用戶的多條聊天記錄
		List<String> list = new ArrayList<String>();
		application.setAttribute("msglist", list);
		//用於獲取用戶信息
		List<String> userList = new ArrayList<String>();
		application.setAttribute("userlist", userList);
		//對於上下文不熟悉的,請自行百度<span style="font-family: Arial, Helvetica, sans-serif;">ServletContext;</span>

		
	}
}

四.jframe部分


<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
//	jsp設置href 
   
    <title>QQ聊天窗口</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">

  </head>
  
  <frameset cols="*,200" border="1">
  	<frameset rows="*,100" border="1">
  		<frame src="showMsg"/>
  		<!-- 需要動態創建 -->
  		<frame src="send.jsp" scrolling="no" noresize="noresize"/>
  	</frameset>

  	<frame src="online" />
	 <!-- 動態創建 -->
  </frameset>
  
  
</html>

預覽效果:

iframe的預覽效果

五.send部分

web.xml

  <servlet>
  	<servlet-name>SendServlet</servlet-name>
  	<servlet-class>com.tz.util.SendServlet</servlet-class>
  	
  	<init-param>
  	<!-- 臟話屏蔽的配置文件部分,web配置文件的使用 之一-->
  		<param-name>keyword</param-name>	
  		<param-value>fuck,shit,cao</param-value>
  	</init-param>
  	
  </servlet>
  <servlet-mapping>
  	<servlet-name>SendServlet</servlet-name>
  	<url-pattern>/send</url-pattern>
  </servlet-mapping>


send.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

  </head>
  
  <body>
    <form action="send" method="post">
    	<input type="text" name="msg">
    	     
    	<select name="face">
    		<option value="1">smile</option>
    		<option value="2">cry</option>
    		<option value="3">flower</option>
    	</select>
    	     
    	<input type="submit" value="send">
    	<!-- 這里是從iframe退出到index.jsp的方法,不然只會在iframe的send部分的頁面,跳轉到index.jsp -->    
    	<a href="index.jsp" target="asd">exit</a>
    	<!-- target="asd"(隨便取非保留字)或者"_parent" iframe跳轉到index.html -->
    	
    </form>
  </body>
</html>


SendServlet.jsp

/**
 * 用於處理發送的消息
 * @author Administrator
 */
@SuppressWarnings("serial")
public class SendServlet extends HttpServlet{
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
	}
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//設置編碼格式,不然會亂碼.
		req.setCharacterEncoding("utf-8");
		//獲取文本消息
		String msg = req.getParameter("msg");
		//獲取圖片消息
		String face = req.getParameter("face");
		
		ServletConfig config = this.getServletConfig();
		//讀取配置文件
		String value = config.getInitParameter("keyword");
		//拆分
		String[] values = value.split(",");
		//替換過程--->臟話屏蔽
		for (String str : values) {
			if(msg.contains(str)){
				msg = msg.replaceAll(str, "****");
			}
		}
		
		//path的拼接
		String username = (String) req.getSession().getAttribute("name");
		
		//StringBuffer、StringBuilder都可以,我們這里需要的是一個可變的string而已.
		StringBuilder str = new StringBuilder(username);
		str.append(":");
		str.append(msg);
		str.append("<img src ='images/");
		str.append(face);
		str.append(".gif");
		str.append("'>");
		
//		System.out.println(str);
//		將聊天記錄存儲在上下文中
		ServletContext application = this.getServletContext();
		
		//獲取上下文,追加聊天記錄
		@SuppressWarnings("unchecked")
		List<String> msgList = (List<String>) application.getAttribute("msglist");
		
		//向msList中添加str
		msgList.add(str.toString());
		
//		resp.getWriter().println(<>);
		//重定向
		resp.sendRedirect("send.jsp");
//		轉發和重定向的區別
//		1.轉發可以攜帶數據,重定向不行
//		2.重定向時,客服端發送了兩個請求,而轉發只發送了一個請求(本質區別)
//		3.重定向時,客服端瀏覽器的地址欄有變化,而轉發沒有
//  	4.重定向發生在客服端!轉發發生在服務端,客服端是不知道
	}
}


五.ShowMsg

ShowMsg的web.xml配置

  <servlet>
  	<servlet-name>ShowMsg</servlet-name>
  	<servlet-class>com.tz.util.ShowMsg</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>ShowMsg</servlet-name>
  	<url-pattern>/showMsg</url-pattern>
  </servlet-mapping>

 

ShowMsg.jsp

/**
 * 用來顯示聊天記錄
 */
public class ShowMsg extends HttpServlet{
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
	}
	
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		//獲取上下文
		ServletContext application = this.getServletContext();
//		List<String> msgList = (List<String>) application.getAttribute("msglist");
		@SuppressWarnings("unchecked")
		List<String> msgList = (List<String>) application.getAttribute("msglist");
//		設置頁面編碼
		resp.setCharacterEncoding("utf-8");
		PrintWriter out = resp.getWriter();
		out.println("<html>");
		out.println("<head>");
		out.println("<meta http-equiv='refresh' content='1'/>");
		out.println("</head>");
		out.println("<body>");
//		out.println("</head>");
		for (String str : msgList) {
			out.println(str);
			out.println("<br/>");
		}
		out.println("</body>");
		out.println("</html>");
		
		
	}
}

六.OnlineServlet

OnlineServlet的web.xml

  <servlet>
  	<servlet-name>OnlineServlet</servlet-name>
  	<servlet-class>com.tz.util.OnlineServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>OnlineServlet</servlet-name>
  	<url-pattern>/online</url-pattern>
  </servlet-mapping>


OnlineServlet.jsp

public class OnlineServlet extends HttpServlet{
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		doPost(req, resp);
	}
	
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		ServletContext application = this.getServletContext();
		List<String> userList = (List<String>) application.getAttribute("userlist");
		
		resp.setCharacterEncoding("utf-8");
		PrintWriter out = resp.getWriter();
		out.println("<html>");
		out.println("<head>");
		out.println("<meta http-equiv='refresh' content='1'/>");
		out.println("</head>");
		out.println("<body>");
//		out.println("</head>");
		out.println("<ul>");
		for (String str : userList) {
			out.println("<li>");
			out.println(str);
			out.println("</li>");
		}
		out.println("</ul>");
		out.println("</body>");
		out.println("</html>");
	}
}


七.補充.

1.為了簡化步驟,本項目中的doget方法都直接寫成了dopost,
2.對jsp中的響應,請求不了解的,本文不再多描述,可以瀏覽我的其他博客,或者自行百度

八.參考文章:


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com