zoukankan      html  css  js  c++  java
  • 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中的响应,请求不了解的,本文不再多描述,可以浏览我的其他博客,或者自行百度

    八.参考文章:

  • 相关阅读:
    从零开始编写自己的C#框架(7)——需求分析
    从零开始编写自己的C#框架(6)——SubSonic3.0插件介绍(附源码)
    Vim技能修炼教程(13)
    Linux存储入门:简易数据恢复方案--分区和LVM实战
    物联网如何跳出“看起来很美”?
    农业的未来:物联网农业传感器农业无人机
    综合布线系统技术是建设智慧城市的血脉
    7月13日云栖精选夜读:什么才是这个时代最需要的BI人员? —— 阿里云MVP赵玮主题分享
    阿里巴巴集团技术委员会主席王坚:我曾经被诺贝尔奖得主司马贺忽悠_相信人工智能就是未来!
    如何送货最省钱?菜鸟自研核心引擎架构首次曝光!
  • 原文地址:https://www.cnblogs.com/fonttian/p/9162870.html
Copyright © 2011-2022 走看看