因为我们学校的软件联盟要为我们校区开发一个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>
预览效果:
五.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中的响应,请求不了解的,本文不再多描述,可以浏览我的其他博客,或者自行百度
八.参考文章:
6.JSP生命周期