《第二个web项目优化版》在线短信平台,实现接收消息,分页查询,信封根据已读未读动态闭合打开,非法弹框警告等功能

一、简介

本项目用到的技术有:java、html、css、jsp、jstl、servlet、druid、tomcat、filter 使用工具myeclipse2018
已实现的功能有:登陆、注册、页面跳转、弹窗警告、分页查询,查看短信、回复、删除信息、修改资料、已读未读提示等

二、项目大致的功能关系图

新增分页查询功能。并使用jstl替换原有jsp代码

在这里插入图片描述

三、登陆层

1.login.jsp

介绍: 登陆界面,接收用户输入的账号密码

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	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%>">

<title>学士后 短消息平台</title>
<link type="text/css" rel="stylesheet" href="css/sms.css" />

<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">

<c:if test="${not empty msg}">
	<script type="text/javascript">alert("${msg}")</script>
</c:if>
</head>

<body>
	<div id="loginTitle" class="png"></div>
	<div id="loginForm" class="userForm png">
		<form method="post" name="loginform" action="/jsp_day2/check/login">
			<dl>
				<dt>用户名:</dt>
				<dd>
					<input type="text" name="username" />
				</dd>
				<dt>密 码:</dt>
				<dd>
					<input type="password" name="password" />
				</dd>
			</dl>
			<div class="buttons">
				<input class="btn-login png" type="submit" name="submit" value=" " /><input
					class="btn-reg png" type="button"
					onClick="window.location.href='register.jsp'" name="register"
					value=" " />
			</div>
		</form>
	</div>
</body>
</html>

2.LoginAction

介绍: 掉用dao层方法验证账号密码是否输入正确

package servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.UsersDaoImpl;
import entity.Users;

public class LoginAction extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = -947788533926255252L;
	private static final UsersDaoImpl udi = UsersDaoImpl.getInstance();

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		Users us = udi.queryUsersByUserName(username);
		req.setAttribute("login", "yes");
		if (us == null || !password.equals(us.getPassword())) {
			req.setAttribute("login", "no");
			req.setAttribute("msg", "用户名或密码不存在!");
			req.getRequestDispatcher("/login.jsp").forward(req, resp);
			return;
		} else {
			Integer uid = us.getUsersId();
			req.getSession().setAttribute("name", username);
			req.getSession().setAttribute("uid", uid);
			req.getSession().setAttribute("pageSize", 5);
			req.getSession().setAttribute("udi", udi);
			req.getRequestDispatcher("/check/showMsg").forward(req, resp);
			return;
		}
	}
}

四、注册层

1.register.jsp

介绍: 注册界面,接收用户输入的信息和Action中判断的结果,如果不合法,出现弹窗提示

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
	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%>">

<title>学士后 在线短信平台</title>
<link type="text/css" rel="stylesheet" href="css/sms.css" />

<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">

<c:if test="${not empty msg}">
	<script type="text/javascript">alert("${msg}")</script>
</c:if>

</head>

<body>
	<div id="regTitle" class="png"></div>
	<div id="regForm" class="userForm png">
		<form action="/jsp_day2/check/regist" method="post">
			<dl>
				<dt>用 户 名:</dt>
				<dd>
					<input type="text" name="username" />
				</dd>
				<dt>密 码:</dt>
				<dd>
					<input type="password" name="password" />
				</dd>
				<dt>确认密码:</dt>
				<dd>
					<input type="password" name="affirm" />
				</dd>
				<dt>邮 箱:</dt>
				<dd>
					<input type="text" name="email" />
				</dd>
			</dl>
			<div class="buttons">
				<input class="btn-reg png" type="submit" name="register" value=" " />
				<input class="btn-reset png" type="reset" name="reset" value=" " />
			</div>
			<div class="goback">
				<a href="/jsp_day2/login.jsp" class="png">返回登录页</a>
			</div>
		</form>
	</div>
</body>
</html>

2.RegistAction

介绍: 调用dao层方法,判断注册信息是否合法。如果不合法,将错误信息放入request作用域并转发到注册界面

package servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.UsersDaoImpl;
import entity.Users;

public class RegistAction extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = -9165610699384473172L;
	private static final UsersDaoImpl udi = UsersDaoImpl.getInstance();

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		String affirm = req.getParameter("affirm");
		String email = req.getParameter("email");
		req.getSession().setAttribute("regist", "no");
		if (username.equals("")) {
			req.setAttribute("msg", "账号不能为空!");
			req.getRequestDispatcher("/register.jsp").forward(req, resp);
			return;
		} else if (password.equals("")) {
			req.setAttribute("msg", "密码不能为空!");
			req.getRequestDispatcher("/register.jsp").forward(req, resp);
			return;
		} else if (email.equals("")) {
			req.setAttribute("msg", "邮箱号不能为空!");
			req.getRequestDispatcher("/register.jsp").forward(req, resp);
			return;
		} else if (udi.ifExistToUserName(username)) {
			req.setAttribute("msg", "用户名已存在!");
			req.getRequestDispatcher("/register.jsp").forward(req, resp);
			return;
		}else if(!affirm.equals(password)) {
			req.setAttribute("msg", "两次输入的密码不一致!");
			req.getRequestDispatcher("/register.jsp").forward(req, resp);
			return;
		}else {
			udi.insertUsers(new Users(username, password, email));
			req.getSession().setAttribute("regist", "yes");
			resp.sendRedirect("/jsp_day2/private/registsuccess.jsp");
			return;
		}
	}
}

3.registsuccess.jsp

介绍: 注册成功后跳转的界面。负责展示注册成功的信息并自动跳转到登录界面

<%@ 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%>">

<title>注册成功界面</title>
<link type="text/css" rel="stylesheet" href="css/sms.css" />

<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">
<meta http-equiv="refresh" content="3;URL=/jsp_day2/login.jsp">

</head>

<body>
<div id="regSuccess" class="png"></div>
	<div style="margin:100px auto auto auto; width:400px; text-align:center"><font size="5px">注册成功!即将跳转至登录界面~~</font></div>
	<br>
</body>
</html>

五、展示层

1.showMsg.jsp

介绍: 登陆成功后跳转的界面。负责展示与用户有关的信息,默认展示5条,每条信息最多展示6个字符,其余用…表示,并且是按照发送时间进行降序展示。用户可点击超链接进行分页查询。信息默认是未读状态,信封闭合。当用户查看后,变为已读状态,信封打开。

<%@page import="service.MessageService"%>
<%@ page language="java" import="java.util.*,dao.*,entity.*"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
	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%>">

<title>学士后 在线短信平台</title>
<link type="text/css" rel="stylesheet" href="css/sms.css" />

<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>

<body>
	<div id="main">
		<div class="mainbox">
			<div class="title myMessage png"></div>
			<div class="menu">
				<span>当前用户:<a href="/jsp_day2/private/main.jsp">${name}</a></span> <span><a
					href="/jsp_day2/private/newMsg.jsp">发短消息</a></span> <span><a
					href="/jsp_day2/closesession">退出</a></span>
			</div>
			<div class="content messageList">
				<ul>
					<c:forEach items="${msgList}" var="msg">
						<c:if test="${msg.flag == 0}">
							<li class="unReaded">
						</c:if>
						<c:if test="${msg.flag != 0}">
							<li>
						</c:if>
						<em>${msg.sendDate}</em>
						<em><a
							href="/jsp_day2/private/replyMsg.jsp?msgid=${msg.messageId}&sendname=${msg.senderName}&state=1">回信</a></em>
						<em><a href="/jsp_day2/check/delete?msgid=${msg.messageId}">删除</a></em>
						<p>
							<strong><a
								href="/jsp_day2/check/readMsg?msgid=${msg.messageId}&state=1">${msg.title}</a></strong>

							<c:if test="${msg.contents.length()>6}">
								${msg.contents.substring(0,6)}...
							</c:if>
							<c:if test="${msg.contents.length()<=6}">
								${msg.contents}
							</c:if>
						</p>
					</c:forEach>
				</ul>
				<div style="text-align:center">
					<c:if test="${currentPage>1}">
						<a
							href="/jsp_day2/pageList?currentPage=${currentPage-1}&pageSize=${pageSize}"
							style="text-decoration: none">上一页</a> |
				</c:if>
					<c:forEach begin="1" end="${endPage}" var="p">
						<a href="/jsp_day2/pageList?currentPage=${p}&pageSize=${pageSize}"
							style="text-decoration: none">${p}</a> | 
					</c:forEach>
					<c:if test="${currentPage<endPage}">
						<a
							href="/jsp_day2/pageList?currentPage=${currentPage+1}&pageSize=${pageSize}"
							style="text-decoration: none">下一页</a>
					</c:if>
				</div>
			</div>
		</div>
	</div>
</body>
</html>

2.ShowMsgAction

介绍: 调用service层,默认展示第一页的信息。

package servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import entity.Message;
import service.MessageService;

public class ShowMsgAction extends HttpServlet {
	/**
	 * 
	 */
	private static final long serialVersionUID = -7056400131406244123L;

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		MessageService service = new MessageService();
		Integer uid = (Integer) req.getSession().getAttribute("uid");
		Integer pageSize = (Integer) req.getSession().getAttribute("pageSize");
		List<Message> msgList = service.selectByPage(uid, 1, 5);
		req.setAttribute("currentPage", 1);
		req.setAttribute("msgList", msgList);
		Integer endPage = service.getEndPage(uid, pageSize);
		req.setAttribute("endPage", endPage);
		req.getRequestDispatcher("/private/showMsg.jsp").forward(req, resp);
		return;
	}
}

3.PageListAction

介绍:接收用户点击分页超链接时获取的数据,并调用service层进行分页查询。并将查询到的结果集存入request作用域,然后转发到showMsg.jsp界面

package servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import entity.Message;
import service.MessageService;

public class PageListAction extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = -6217526517023274475L;

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		Integer uid = (Integer) req.getSession().getAttribute("uid");
		String currentPageStr = req.getParameter("currentPage");
		String pageSizeStr = req.getParameter("pageSize");
		Integer currentPage = Integer.parseInt(currentPageStr);
		Integer pageSize = Integer.parseInt(pageSizeStr);
		MessageService service = new MessageService();
		List<Message> msgList = service.selectByPage(uid, currentPage, pageSize);
		req.setAttribute("currentPage", currentPage);
		req.setAttribute("msgList", msgList);
		Integer endPage = service.getEndPage(uid, pageSize);
		req.setAttribute("endPage", endPage);
		req.getRequestDispatcher("/private/showMsg.jsp").forward(req, resp);
		return;
	}
}

4.readMsg.jsp

介绍: 将用户点击的信息详情展示出来,供用户阅读查看

<%@page import="dao.UsersDaoImpl"%>
<%@ page language="java" import="java.util.*,entity.*"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
	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%>">

<title>学士后 在线短信平台</title>
<link type="text/css" rel="stylesheet" href="css/sms.css" />

<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>

<body>
	<div id="main">
		<div class="mainbox">
			<div class="title readMessage png"></div>
			<div class="menu">
				<span>当前用户:<a href="/jsp_day2/private/main.jsp">${name}</a></span> <span><a
					href="/jsp_day2/private/newMsg.jsp">发短消息</a></span><span><a
					href="/jsp_day2/check/showMsg?currentPage=${currentPage}">返回首页</a></span> <span><a
					href="/closesession">退出</a></span>
			</div>
			<div class="content">
				<div class="message">
					<div class="tmenu">
						<ul class="clearfix">
							<li>题目:${msg.title}</li>
							<li>来自:${msg.senderName}</li>
							<li>时间:${msg.sendDate}</li>
						</ul>
					</div>
					<div class="view">
						<p>${msg.contents}</p>
					</div>
				</div>
			</div>
		</div>
	</div>
</body>
</html>

5.ReadMsgAction

介绍: 判断用户编辑信息的合法性,并将信息存入request作用域转发到readMsg.jsp界面

package servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.UsersDaoImpl;
import entity.Message;

public class ReadMsgAction extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = -1298671806946960035L;
	private static final UsersDaoImpl udi = UsersDaoImpl.getInstance();

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String msgid = req.getParameter("msgid");
		Integer mid = Integer.parseInt(msgid);
		Message msg = udi.selectMessageByMsgId(mid);
		req.setAttribute("msg", msg);
		req.getRequestDispatcher("/private/readMsg.jsp").forward(req, resp);
		return;
	}
}

六、操作层

1.查看资料或修改

①main.jsp

介绍: 当用户点击用户名时跳转的界面。展示用户的个人资料,可供修改。接收MainAction传递的错误信息并出现弹窗提示

<%@ page language="java" import="java.util.*,dao.*,entity.*"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
	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%>">

<title>学士后 在线短信平台</title>
<link type="text/css" rel="stylesheet" href="css/sms.css" />

<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">

<c:if test="${not empty msg}">
	<script type="text/javascript">alert("${msg}")</script>
</c:if>

</head>

<body>
	<div id="mainTitle" class="png"></div>
	<div id="regForm" class="userForm png">
		<form action="/jsp_day2/check/main" method="post">
			<dl>
				<dt>用 户 名:</dt>
				<dd>
					<input type="text" name="username" value="${name}"
						readonly="readonly" />
				</dd>
				<dt>密 码:</dt>
				<dd>
					<input type="text" value="${us.password}" name="password" />
				</dd>
				<dt>邮 箱:</dt>
				<dd>
					<input type="text" value="${us.email}" name="email" />
				</dd>
			</dl>
			<div class="buttons">
				<input class="main-update png" type="submit" name="update" value=" " />
				<input class="main-reset png" type="reset" name="reset" value=" " />
			</div>
			<div class="goback">
				<a href="/jsp_day2/check/showMsg" class="png">返回首页</a>
			</div>
		</form>
	</div>
</body>
</html>

②MainAction

介绍: 当用户点击修改按钮时跳转的界面。用于判断用户修改的资料合法性,如果不合法,将错误信息放入request作用域并转发到main.jsp界面,如果合法,跳转至mainsuccess.jsp

package servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import dao.UsersDaoImpl;
import entity.Users;

public class MainAction extends HttpServlet {
	/**
	 * 
	 */
	private static final long serialVersionUID = 3796831561391949937L;
	private static final UsersDaoImpl udi = UsersDaoImpl.getInstance();
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String password = req.getParameter("password");
		String email = req.getParameter("email");
		HttpSession session = req.getSession();
		session.setAttribute("main", "no");
		if (!email.contains("@") || !email.contains(".") || email.lastIndexOf("@") > email.indexOf(".")
				|| email.lastIndexOf("@") > email.lastIndexOf(".")) {
			req.setAttribute("msg", "邮箱不合法!");
			req.getRequestDispatcher("/private/main.jsp").forward(req, resp);
			return;
		} else {
			udi.updateUsers(new Users((String)session.getAttribute("name"),password,email));
			req.getSession().setAttribute("main", "yes");
			resp.sendRedirect("/jsp_day2/private/mainsuccess.jsp");
			return;
		}
	}
}

③mainsuccess.jsp

介绍: 当修改成功后,跳转的界面。负责展示修改成功的信息并自动跳转至首页(showMsg.jsp)

<%@ 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%>">

<title>修改成功界面</title>
<link type="text/css" rel="stylesheet" href="css/sms.css" />

<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">
<meta http-equiv="refresh" content="3;URL=/jsp_day2/check/showMsg">

</head>

<body>
<div id="regSuccess" class="png"></div>
	<div style="margin:100px auto auto auto; width:400px; text-align:center"><font size="5px">修改成功!即将跳转至首页~~</font></div>
	<br>
</body>
</html>

2.发送或回复消息

①replyMsg.jsp

介绍: 当用户点击回复超链接后跳转的界面,并接受超链接传递过来的msgid。默认接收方为该信息发送者

<%@ page language="java" import="java.util.*,dao.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
	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%>">

<title>学士后 在线短信平台</title>
<link type="text/css" rel="stylesheet" href="css/sms.css" />

<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">

<c:if test="${not empty msg}">
	<script type="text/javascript">alert("${msg}")</script>
</c:if>

</head>

<body>
	<form action="/jsp_day2/check/send" method="post">
		<div id="main">
			<div class="mainbox">
				<div class="menu">
					<span>当前用户:<a href="/jsp_day2/private/main.jsp">${name}</a></span>
					<span><a href="/jsp_day2/private/newMsg.jsp">发短消息</a></span><span><a
						href="/jsp_day2/check/showMsg">返回首页</a></span> <span><a
						href="/jsp_day2/closesession">退出</a></span>
				</div>
				<div class="content">
					<div class="message">
						<form method="post">
							<div class="tmenu">
								<ul class="clearfix">
									<li>发送给:  <select name="recname">
											<c:forEach items="${selectList}"
												var="name">
												<c:if test="${name eq sendname}">
													<option selected="selected" value="${name}">${name}</option>
												</c:if>
												<c:if test="${name ne sendname}">
													<option value="${name}">${name}</option>
												</c:if>
											</c:forEach>
									</select>
									</li> 标题:
									<input type="text" name="title" />
								</ul>
							</div>
							<div class="view">
								<textarea name="contents"></textarea>
								<div class="send">
									<input type="submit" name="submit" value=" " />
								</div>
							</div>
						</form>
					</div>
				</div>
			</div>
		</div>
	</form>
</body>
</html>

②newMsg.jsp

介绍: 和replyMsg差不多,只是默认接收方不同

<%@ page language="java" import="java.util.*,dao.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
	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%>">

<title>学士后 在线短信平台</title>
<link type="text/css" rel="stylesheet" href="css/sms.css" />

<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">

<c:if test="${not empty msg}">
	<script type="text/javascript">alert("${msg}")</script>
</c:if>
</head>

<body>
	<form action="/jsp_day2/check/send" method="post">
		<div id="main">
			<div class="mainbox">
				<div class="menu">
					<span>当前用户:<a href="main.jsp">${name}</a></span> <span><a
						href="/jsp_day2/private/newMsg.jsp">发短消息</a></span><span><a
						href="/jsp_day2/check/showMsg">返回首页</a></span> <span><a
						href="/jsp_day2/closesession">退出</a></span>
				</div>
				<div class="content">
					<div class="message">
						<form method="post">
							<div class="tmenu">
								<ul class="clearfix">
									<li>发送给: <select name="recname">
											<c:forEach items="${selectList}"
												var="name" varStatus="vs">
												<c:if test="${vs.count==1}">
													<option selected="selected" value="${name}">${name}</option>
												</c:if>
												<c:if test="${vs.count!=1}">
													<option value="${name}">${name}</option>
												</c:if>
											</c:forEach>
									</select>
									</li> 标题:
									<input type="text" name="title" />
								</ul>
							</div>
							<div class="view">
								<textarea name="contents"></textarea>
								<div class="send">
									<input type="submit" name="submit" value=" " />
								</div>
							</div>
						</form>
					</div>
				</div>
			</div>
		</div>
	</form>
</body>
</html>

③SendMsgAction

介绍: 负责接收replyMsg.jsp或newMsg.jsp传递过来的数据。判断是否合法,如果不合法,将结果放入request作用域并转发回去。如果合法,跳转至sendsuccess.jsp界面

package servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.UsersDaoImpl;
import entity.Message;
import entity.Users;

public class SendMsgAction extends HttpServlet {
	/**
	 * 
	 */
	private static final long serialVersionUID = -5920117313720382072L;
	private static final UsersDaoImpl udi = UsersDaoImpl.getInstance();

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String title = req.getParameter("title");
		String contents = req.getParameter("contents");
		Integer sendid = (Integer) req.getSession().getAttribute("uid");
		String recname = req.getParameter("recname");
		String msg;
		req.getSession().setAttribute("send", "no");
		if (title.equals("")) {
			msg = "标题不能为空!";
			req.setAttribute("msg", msg);
			List<String> selectList = udi.selectAll((String)req.getSession().getAttribute("name"));
			req.setAttribute("selectList", selectList);
			req.getRequestDispatcher("/private/newMsg.jsp").forward(req, resp);
			return;
		} else if (contents.equals("")) {
			msg = "内容不能为空!";
			req.setAttribute("msg", msg);
			List<String> selectList = udi.selectAll((String)req.getSession().getAttribute("name"));
			req.setAttribute("selectList", selectList);
			req.getRequestDispatcher("/private/newMsg.jsp").forward(req, resp);
		} else {
			req.getSession().setAttribute("send", "yes");
			Users us = udi.queryUsersByUserName(recname);
			udi.insertMessage(new Message(title, contents, sendid, us.getUsersId()));
			resp.sendRedirect("/jsp_day2/private/sendsuccess.jsp");
			return;
		}
	}
}

④sendsuccess.jsp

介绍: 当发送成功后跳转的界面。负责向用户展示发送成功的提示,当用户点击继续发送,则跳转至newMsg.jsp界面,当用户点击返回首页,跳转到showMsg.jsp

<%@ 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%>">

<title>发送状态</title>
<link type="text/css" rel="stylesheet" href="css/sms.css" />

<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>

<body>
	<div id="sendSuccess" class="png"
		style="display:flex;
flex-direction: row;
justify-content: space-around;
align-items: center;">
		<font size="5px" style="color:#F9F900">发送成功!</font>
	</div>
	<div
		style="margin:100px auto auto auto; width:400px; text-align:center">
		<div class="goback">
			<a href="/jsp_day2/private/newMsg.jsp"><font size="5px" style="color:#FF0080">继续发送</font></a>&nbsp;&nbsp;&nbsp;&nbsp;
			<a href="/jsp_day2/check/showMsg" class="png"><font size="5px" style="color:#0000C6">返回首页</font></a>
		</div>
	</div>
</body>
</html>

3. 删除信息

介绍: 当用户点击删除的超链接后,接收删除的msgid并调用dao层方法将其从数据库表中删除

package servlet;

import java.io.IOException;
import java.util.LinkedHashSet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import dao.UsersDaoImpl;

public class DeleteMsgAction extends HttpServlet {
	/**
	 * 
	 */
	private static final long serialVersionUID = -1566135640888064603L;
	private static final UsersDaoImpl udi = UsersDaoImpl.getInstance();

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String[] msgid = req.getParameterValues("msgid");
		if (msgid.length > 0) {
			LinkedHashSet<Integer> msgIdSet = new LinkedHashSet<>();
			for (String msgId : msgid) {
				msgIdSet.add(Integer.parseInt(msgId));
			}
			udi.deleteAll(msgIdSet);
		}
		resp.sendRedirect("/jsp_day2/check/showMsg");
		return;
	}
}

4.CloseSessionAction

介绍: 当用户点击退出超链接跳转的界面。主要是删除session信息,实现安全退出的功能

package servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CloseSessionAction extends HttpServlet {
	/**
	 * 
	 */
	private static final long serialVersionUID = -4639818064873612493L;

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.getSession().invalidate();
		resp.sendRedirect("/jsp_day2/login.jsp");
		return;
	}
}

七、过滤层

1.CharacterEncodingFilter

介绍: 指定编码格式的过滤器

package filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharacterEncodingFilter implements Filter {
	private String encoding;

	@Override
	public void destroy() {

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		request.setCharacterEncoding(encoding);
		response.setCharacterEncoding(encoding);
		chain.doFilter(request, response);
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		encoding = filterConfig.getInitParameter("encoding");
	}

}

2.CheckNomalCommingFilter

介绍: 检查是否为正常请求,并通过不同的非法请求将其重定向到对应的界面

package filter;

import java.io.IOException;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import dao.UsersDaoImpl;
import entity.Users;

public class CheckNomalCommingFilter implements Filter {
	private static final UsersDaoImpl udi = UsersDaoImpl.getInstance();

	@Override
	public void destroy() {

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpSession session = req.getSession();
		HttpServletResponse resp = (HttpServletResponse) response;
		String un = (String) session.getAttribute("name");
		String rgstSuccess = (String) session.getAttribute("regist");
		String path = req.getServletPath();
		String unRegist = req.getParameter("username");
		String recName = req.getParameter("recname");
		String unLogin = unRegist;
		String replyId = req.getParameter("msgid");
		String mainEmail = req.getParameter("email");
		String mainSuccess = (String) session.getAttribute("main");
		String sendSuccess = (String) session.getAttribute("send");
		/*
		 * 判断是不是注册请求 如果是 1.判断是不是注册界面发出的并且注册信息是否为空,为空则送回注册界面
		 * 2.判断是不是注册成功界面发出的并且判断是否有注册标记,如果没有,送回注册界面 判断是否注册成功,如果没有注册成功,送回注册界面 3.如果都不是,直接放行
		 */
		if (path.contains("/regist")) {
			if ((path.equals("/check/regist") && unRegist == null)
					|| (path.contains("/registsuccess.jsp") && (rgstSuccess == null || rgstSuccess.equals("no")))) {
				resp.sendRedirect("/jsp_day2/register.jsp");
				return;
			} else {
				session.removeAttribute("regist");
				chain.doFilter(request, response);
			}
			/*
			 * 如果不是注册请求 1.判断是否已登录,如果没有登录,送回登陆界面
			 * 2.判断是否从SendMsgAction传出的请求,并且判断发送的信息是否为空,如果为空,送回newMsg界面
			 * 3.判断是否从回复消息界面(replyMsg)发出的请求,并且判断是否有输入信息,如果没有,送回首页(showMsg)
			 * 4.判断是否从查看(修改)资料发出的请求(main),如果是,判断信息是否为空,如果是,送回首页
			 * 或者判断是否从修改成功界面发出的请求(mainsuccess),如果是,判断是否有修改成功的标记,如果没有,送回首页 5.如果都不是,则通过
			 */
		} else if (un == null && unLogin == null) {
			resp.sendRedirect("/jsp_day2/login.jsp");
		} else if (path.contains("/send")) {
			if ((path.equals("/check/send") && recName == null)
					|| (path.contains("/sendsuccess.jsp") && (sendSuccess == null || sendSuccess.equals("no")))) {
				resp.sendRedirect("/jsp_day2/private/newMsg.jsp");
				return;
			} else {
				session.removeAttribute("send");
				chain.doFilter(request, response);
			}
		} else if (path.contains("replyMsg")) {
			if ((replyId == null || replyId.equals(""))) {
				resp.sendRedirect("/jsp_day2/check/showMsg");
				return;
			} else {
				// 1.更新已读标记
				String state = request.getParameter("state");
				String msgId = request.getParameter("msgid");
				if (state != null && msgId != null) {
					Integer intState = Integer.parseInt(state);
					Integer mid = Integer.parseInt(msgId);
					udi.updateFlag(intState, mid);
				}
				String sendname = req.getParameter("sendname");
				List<String> selectList = udi.selectAll(un);
				// 2.将除自己外所有用户姓名集放入request作用域中
				req.setAttribute("selectList", selectList);
				// 3.将该条信息的发送者姓名存入request作用域中
				req.setAttribute("sendname", sendname);
				chain.doFilter(request, response);
			}
		} else if (path.contains("main")) {
			if (path.contains("main.jsp")) {
				Users us = udi.queryUsersByUserName(un);
				req.setAttribute("us", us);
				chain.doFilter(request, response);
			} else if ((path.contains("/check/main") && mainEmail == null)
					|| (path.contains("/mainsuccess") && (mainSuccess == null || mainSuccess.equals("no")))) {
				resp.sendRedirect("/jsp_day2/check/showMsg");
				return;
			} else {
				session.removeAttribute("main");
				chain.doFilter(request, response);
			}
		} else {
			// 如果是阅读信息 更新已读标记
			if (path.contains("read")) {
				String state = request.getParameter("state");
				String msgId = request.getParameter("msgid");
				if (state != null && msgId != null) {
					Integer intState = Integer.parseInt(state);
					Integer mid = Integer.parseInt(msgId);
					udi.updateFlag(intState, mid);
				}
			}

			// 如果是发送新消息 将除自己外所有用户姓名集放入request作用域中
			if (path.contains("newMsg")) {
				List<String> selectList = udi.selectAll(un);
				req.setAttribute("selectList", selectList);
			}
			// 通过
			chain.doFilter(request, response);
		}
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
	}

}

八、dao层

1.UsersDao接口

介绍: 声明了一下需要用到的方法

package dao;

import java.util.LinkedHashSet;
import java.util.List;

import entity.Message;
import entity.Users;

public interface UsersDao {
	
	// 根据用户名查询该用户的全部信息
	public Users queryUsersByUserName(String username);
	
	// 判断用户名是否存在
	public boolean ifExistToUserName(String username);

	// 修改用户信息
	public void updateUsers(Users u);
	
	// 往users表中添加一条用户信息
	public boolean insertUsers(Users u);
	
	// 往message表中添加一条信息
	public boolean insertMessage(Message m);

	// 通过起始id进行分页查询
	public List<Message> selectByPage(Integer receiverId,Integer begin,Integer end);
	
	// 返回除自身外的所有用户姓名
	public List<String> selectAll(String username);
	
	// 通过id查询用户姓名
	public String selectOne(Integer usersid);
	
	// 获取下一个用户表的序列值
	public int getUsersSeq();
	
	// 获取下一个信息表的序列值
	public int getMessageSeq();
	
	// 通过id批量删除短信
	public void deleteAll(LinkedHashSet<Integer> messageIdSet);
	
	// 修改阅读标记
	public void updateFlag(Integer flag,Integer msgid);
	
	// 根据msgid查看具体内容
	public Message selectMessageByMsgId(Integer msgid);
	
	// 查询与收件人编号相关的信息总条数
	public int selectPageNum(Integer receiverId);
	
	// 获取当前时间
	public String getTime();

}

2.UsersDaoImpl实现类

介绍: 实现了UsersDao接口中的方法,供业务层调用

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;

import entity.Message;
import entity.Users;
import utils.JdbcUtils;

public class UsersDaoImpl implements UsersDao {
	private UsersDaoImpl() {
	}

	static class Inner {
		static final UsersDaoImpl udi = new UsersDaoImpl();
	}

	public static UsersDaoImpl getInstance() {
		return Inner.udi;
	}

	/**
	 * 根据用户名查询用户全部信息
	 */
	@Override
	public Users queryUsersByUserName(String username) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils.getConnection();
			ps = conn.prepareStatement("select USERSID,PASSWORD,EMAIL from users where username = ?");
			ps.setString(1, username);
			rs = ps.executeQuery();
			if (rs.next()) {
				return new Users(rs.getInt(1), username, rs.getString(2), rs.getString(3));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.closeAll(closeConn ? conn : null, ps, rs);
		}
		return null;
	}

	/**
	 * 判断用户名是否存在 存在-true 不存在-false
	 */
	@Override
	public boolean ifExistToUserName(String username) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils.getConnection();
			ps = conn.prepareStatement("select password from users where username = ?");
			ps.setString(1, username);
			rs = ps.executeQuery();
			return rs.next();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.closeAll(closeConn ? conn : null, ps, rs);
		}
		return false;
	}

	/**
	 * 往users表中添加一条用户信息 添加成功-true 添加失败-false
	 */
	@Override
	public boolean insertUsers(Users p) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils.getConnection();
			ps = conn.prepareStatement("insert into users values(users_seq.nextVal,?,?,?)");
			ps.setString(1, p.getUsername());
			ps.setString(2, p.getPassword());
			ps.setString(3, p.getEmail());
			ps.executeUpdate();
			return true;
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.closeAll(closeConn ? conn : null, ps, rs);
		}
		return false;
	}

	/**
	 * 往users表中添加一条用户信息 添加成功-true 添加失败-false
	 */
	@Override
	public boolean insertMessage(Message m) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils.getConnection();
			ps = conn.prepareStatement("insert into message values(users_seq.nextVal,?,?,?,?,?,0)");
			ps.setString(1, m.getTitle());
			ps.setString(2, m.getContents());
			ps.setInt(3, m.getSenderId());
			ps.setInt(4, m.getReceiverId());
			ps.setString(5, getTime());
			ps.executeUpdate();
			return true;
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.closeAll(closeConn ? conn : null, ps, rs);
		}
		return false;
	}

	/**
	 * 修改阅读标记flag
	 */
	@Override
	public void updateFlag(Integer flag, Integer msgid) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils.getConnection();
			ps = conn.prepareStatement("update message set flag=? where messageid = ?");
			ps.setInt(1, flag);
			ps.setInt(2, msgid);
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.closeAll(closeConn ? conn : null, ps, rs);
		}
	}

	/**
	 * 修改用户的资料 参数为:修改后的资料信息
	 */
	@Override
	public void updateUsers(Users u) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils.getConnection();
			ps = conn.prepareStatement("update users set PASSWORD=?,EMAIL=? where USERNAME = ?");
			ps.setString(1, u.getPassword());
			ps.setString(2, u.getEmail());
			ps.setString(3, u.getUsername());
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.closeAll(closeConn ? conn : null, ps, rs);
		}
	}

	/**
	 * 根据msgid查看具体内容 返回一个Message对象(title,contents,senderid,senddate)
	 */

	@Override
	public Message selectMessageByMsgId(Integer msgid) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		Message msg = null;
		try {
			conn = JdbcUtils.getConnection();
			ps = conn.prepareStatement("SELECT TITLE,CONTENTS,SENDERID,SENDDATE FROM MESSAGE WHERE MESSAGEID = ?");
			ps.setInt(1, msgid);
			rs = ps.executeQuery();
			if (rs.next()) {
				msg = new Message(rs.getString(1), rs.getString(2), rs.getInt(3), rs.getString(4));
				msg.setSenderName(selectOne(msg.getSenderId()));
			}
			return msg;
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.closeAll(closeConn ? conn : null, ps, rs);
		}
		return null;
	}

	private static boolean closeConn = true;

	/**
	 * 返回除自身外的所有用户的姓名
	 */
	@Override
	public List<String> selectAll(String username) {
		List<String> list = new ArrayList<String>();
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils.getConnection();
			ps = conn.prepareStatement("select USERNAME from USERS order by USERNAME DESC");
			rs = ps.executeQuery();
			while (rs.next()) {
				String name = rs.getString(1);
				if (!name.equals(username))
					list.add(name);
			}
			return list;
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.closeAll(closeConn ? conn : null, ps, rs);
		}
		return null;
	}

	/**
	 * 根据id查询用户姓名
	 */
	@Override
	public String selectOne(Integer id) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils.getConnection();
			ps = conn.prepareStatement("SELECT USERNAME FROM USERS WHERE USERSID = ?");
			ps.setInt(1, id);
			rs = ps.executeQuery();
			if (rs.next())
				return rs.getString(1);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.closeAll(closeConn ? conn : null, ps, rs);
		}
		return null;
	}

	/**
	 * 获取下一个用户表的序列值
	 */
	@Override
	public int getUsersSeq() {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils.getConnection();
			ps = conn.prepareStatement("select users_seq.nextVal from dual");
			rs = ps.executeQuery();
			if (rs.next())
				return rs.getInt(1);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.closeAll(closeConn ? conn : null, ps, rs);
		}
		return 0;
	}

	/**
	 * 获取下一个信息表的序列值
	 */
	@Override
	public int getMessageSeq() {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils.getConnection();
			ps = conn.prepareStatement("select message_seq.nextVal from dual");
			rs = ps.executeQuery();
			if (rs.next())
				return rs.getInt(1);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.closeAll(closeConn ? conn : null, ps, rs);
		}
		return 0;
	}

	/**
	 * 根据用户选中短信的id,进行批量删除
	 */
	@Override
	public void deleteAll(LinkedHashSet<Integer> messageIdSet) {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = JdbcUtils.getConnection();
			for (Integer id : messageIdSet) {
				ps = conn.prepareStatement("delete MESSAGE where MESSAGEID = ?");
				ps.setInt(1, id);
				ps.executeUpdate();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.closeAll(closeConn ? conn : null, ps, null);
		}
	}

	/**
	 * 获取当前时间并返回
	 */
	@Override
	public String getTime() {
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return sdf.format(date);
	}

	/**
	 * 根据起始id进行分页查询 begin:第一条数据的下标 end:最后一条数据的下标
	 */
	@Override
	public List<Message> selectByPage(Integer receiverId, Integer begin, Integer end) {
		List<Message> list = new ArrayList<Message>();
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils.getConnection();
			ps = conn.prepareStatement(
					"SELECT MESSAGEID,SENDERID,TITLE,CONTENTS,RECEIVERID,SENDDATE,FLAG FROM (SELECT m.MESSAGEID,m.SENDERID,m.TITLE,m.CONTENTS,m.RECEIVERID,m.SENDDATE,m.FLAG,ROWNUM R FROM(SELECT MESSAGEID,SENDERID,TITLE,CONTENTS,RECEIVERID,SENDDATE,FLAG FROM (SELECT MESSAGEID,SENDERID,TITLE,CONTENTS,RECEIVERID,SENDDATE,FLAG FROM MESSAGE WHERE RECEIVERID=?)ORDER BY SENDDATE DESC) m) WHERE R>=? AND R <=?");
			ps.setInt(1, receiverId);
			ps.setInt(2, begin);
			ps.setInt(3, end);
			rs = ps.executeQuery();
			while (rs.next()) {
				closeConn = false;
				Integer msgid = rs.getInt(1);
				Integer senderid = rs.getInt(2);
				String title = rs.getString(3);
				String contents = rs.getString(4);
				String sendDate = rs.getString(6);
				Integer flag = rs.getInt(7);
				Message msg = new Message(msgid, senderid, title, contents, sendDate, flag);
				msg.setReceiverName(selectOne(receiverId));
				msg.setSenderName(selectOne(senderid));
				list.add(msg);
			}
			return list;
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException("分页查询失败!");
		} finally {
			closeConn = true;
			JdbcUtils.closeAll(closeConn ? conn : null, ps, rs);
		}
	}

	@Override
	public int selectPageNum(Integer receiverId) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			int num = 0;
			conn = JdbcUtils.getConnection();
			ps = conn.prepareStatement("SELECT ROWNUM FROM MESSAGE WHERE RECEIVERID = ?");
			ps.setInt(1, receiverId);
			rs = ps.executeQuery();
			while (rs.next()) {
				closeConn = false;
				num = rs.getInt(1);
			}
			return num;
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException("查询失败!");
		} finally {
			closeConn = true;
			JdbcUtils.closeAll(closeConn ? conn : null, ps, rs);
		}
	}
}

九、service层

MessageService

介绍: 定义了两个方法,一个方法通过接收发送者id,当前页和每页的条数用于计算起始信息的id,并调用dao层中的方法,实现分页查询的效果。还有一个方法通过信息总条数和每页条数来计算总页数

package service;

import java.util.List;

import dao.UsersDaoImpl;
import entity.Message;

public class MessageService {
	private static final UsersDaoImpl udi = UsersDaoImpl.getInstance();

	public List<Message> selectByPage(Integer receiverId, Integer currentPage, Integer pageSize) {
		Integer begin = (currentPage - 1) * pageSize + 1;
		Integer end = currentPage * pageSize;
		List<Message> msg = udi.selectByPage(receiverId, begin, end);
		return msg;
	}

	public Integer getEndPage(Integer receiverId, Integer pageSize) {
		int num = udi.selectPageNum(receiverId);
		int endNum = num / pageSize;
		return num % pageSize == 0 ? endNum : endNum + 1;
	}
}

十、其它类和xml配置文件

1.JdbcUtils工具类

介绍: 利用druid连接池技术,获取Connection对象和关闭资源的方法

package utils;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSourceFactory;

public class JdbcUtils {
	// 封装一个数据库连接池对象
	private static DataSource ds;
	// 加载驱动
	static {
		try {
			Properties pro = new Properties();
			// 创建一个输入流对象读取数据
			InputStream path = JdbcUtils.class.getResourceAsStream("/druid.properties");
			pro.load(path);
			ds = DruidDataSourceFactory.createDataSource(pro);
		} catch (Exception e1) {
			e1.printStackTrace();
		}
	}

	// 创建一个ThreadLocal对象
	private static final ThreadLocal<Connection> local1 = new ThreadLocal<>();

	// 根据帐号密码获取Connetion对象
	public static Connection getConnection(String userName, String password) {
		try {
			if (local1.get() == null) {
				local1.set(ds.getConnection());
			}
			return local1.get();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	// 创建一个ThreadLocal对象
	private static final ThreadLocal<Connection> local2 = new ThreadLocal<>();

	// 获取默认帐号密码的Connection对象
	public static Connection getConnection() {
		try {
			if (local2.get() == null) {
				local2.set(ds.getConnection());
			}
			return local2.get();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	// 关闭所有资源
	public static void closeAll(Connection conn, PreparedStatement ps, ResultSet rs) {
		if (conn != null) {
			try {
				if (local1.get() != null) {
					local1.remove();
				} else if (local2.get() != null) {
					local2.remove();
				}
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (ps != null) {
			try {
				ps.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	// 关闭Connection
	public static void closeOne(Connection conn) {
		if (conn != null) {
			try {
				if (local1.get() != null) {
					local1.remove();
				} else if (local2.get() != null) {
					local2.remove();
				}
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

2.Users类

介绍: 实体类,将数据库中users表的一些字段封装成了一个类

package entity;

import java.io.Serializable;

public class Users implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 5066504410672831873L;
	private Integer usersId;
	private String username;
	private String password;
	private String email;

	public Users() {
	}

	public Users(Integer usersId,String username, String password, String email) {
		super();
		this.usersId = usersId;
		this.username = username;
		this.password = password;
		this.email = email;
	}
	
	public Users(String username, String password, String email) {
		super();
		this.username = username;
		this.password = password;
		this.email = email;
	}

	public Integer getUsersId() {
		return usersId;
	}

	public void setUsersId(Integer usersId) {
		this.usersId = usersId;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

}

3.Message类

介绍: 将数据库中message表的字段封装成了一个类

package entity;

import java.io.Serializable;

public class Message implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 5030350304739834635L;
	private Integer messageId;
	private String title;
	private String contents;
	private String senderName;
	private String receiverName;
	private Integer senderId;
	private Integer receiverId;
	private String sendDate;
	private Integer flag;

	public Message() {
	}

	public Message(Integer messageId,String title, String contents, String senderName, String receiverName, Integer senderId,
			Integer receiverId,String sendDate, Integer flag) {
		super();
		this.messageId = messageId;
		this.title = title;
		this.contents = contents;
		this.senderName = senderName;
		this.receiverName = receiverName;
		this.senderId = senderId;
		this.receiverId = receiverId;
		this.sendDate = sendDate;
		this.flag = flag;
	}

	public Message(String title, String contents, Integer senderId,Integer receiverId) {
		super();
		this.title = title;
		this.contents = contents;
		this.senderId = senderId;
		this.receiverId = receiverId;
	}

	public Message(Integer messageId,Integer senderId,String title, String contents, String sendDate,Integer flag) {
		super();
		this.messageId = messageId;
		this.senderId = senderId;
		this.title = title;
		this.contents = contents;
		this.sendDate = sendDate;
		this.flag = flag;
	}
	
	public Message(String title, String contents, String senderName, String sendDate) {
		super();
		this.title = title;
		this.contents = contents;
		this.senderName = senderName;
		this.sendDate = sendDate;
	}
	public Message(String title, String contents, Integer senderId, String sendDate) {
		super();
		this.title = title;
		this.contents = contents;
		this.senderId = senderId;
		this.sendDate = sendDate;
	}

	public String getSendDate() {
		return sendDate;
	}

	public void setSendDate(String sendDate) {
		this.sendDate = sendDate;
	}

	public Integer getMessageId() {
		return messageId;
	}

	public void setMessageId(Integer messageId) {
		this.messageId = messageId;
	}

	public String getSenderName() {
		return senderName;
	}

	public void setSenderName(String senderName) {
		this.senderName = senderName;
	}

	public String getReceiverName() {
		return receiverName;
	}

	public void setReceiverName(String receiverName) {
		this.receiverName = receiverName;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getContents() {
		return contents;
	}

	public void setContents(String contents) {
		this.contents = contents;
	}

	public Integer getSenderId() {
		return senderId;
	}

	public void setSenderId(Integer senderId) {
		this.senderId = senderId;
	}

	public Integer getReceiverId() {
		return receiverId;
	}

	public void setReceiverId(Integer receiverId) {
		this.receiverId = receiverId;
	}

	public Integer getFlag() {
		return flag;
	}

	public void setFlag(Integer flag) {
		this.flag = flag;
	}

}

4.web.xml

介绍: 存放配置信息

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	id="WebApp_ID" version="3.1">
	<!-- 字符编码集过滤器 -->
	<filter>
		<filter-name>CharacterEncodingFilter</filter-name>
		<filter-class>filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<!-- 检查是否正常访问的过滤器 -->
	<filter>
		<filter-name>CheckNomalCommingFilter</filter-name>
		<filter-class>filter.CheckNomalCommingFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>CheckNomalCommingFilter</filter-name>
		<url-pattern>/check/*</url-pattern>
		<url-pattern>/private/*</url-pattern>
	</filter-mapping>

	<!-- 判断登陆的Action -->
	<servlet>
		<servlet-name>LoginAction</servlet-name>
		<servlet-class>servlet.LoginAction</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>LoginAction</servlet-name>
		<url-pattern>/check/login</url-pattern>
	</servlet-mapping>

	<!-- 判断注册的Action -->
	<servlet>
		<servlet-name>RegistAction</servlet-name>
		<servlet-class>servlet.RegistAction</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>RegistAction</servlet-name>
		<url-pattern>/check/regist</url-pattern>
	</servlet-mapping>

	<!-- 批量删除短信的Action -->
	<servlet>
		<servlet-name>DeleteAction</servlet-name>
		<servlet-class>servlet.DeleteMsgAction</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>DeleteAction</servlet-name>
		<url-pattern>/check/delete</url-pattern>
	</servlet-mapping>

	<!-- 清理session的Action -->
	<servlet>
		<servlet-name>CloseSessionAction</servlet-name>
		<servlet-class>servlet.CloseSessionAction</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>CloseSessionAction</servlet-name>
		<url-pattern>/closesession</url-pattern>
	</servlet-mapping>

	<!-- 发送消息的Action -->
	<servlet>
		<servlet-name>SendMsgAction</servlet-name>
		<servlet-class>servlet.SendMsgAction</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>SendMsgAction</servlet-name>
		<url-pattern>/check/send</url-pattern>
	</servlet-mapping>
	
	<!-- 查看和修改资料的Action -->
	<servlet>
		<servlet-name>MainAction</servlet-name>
		<servlet-class>servlet.MainAction</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>MainAction</servlet-name>
		<url-pattern>/check/main</url-pattern>
	</servlet-mapping>
	
	<!-- 分页查询的Action -->
	<servlet>
		<servlet-name>PageListAction</servlet-name>
		<servlet-class>servlet.PageListAction</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>PageListAction</servlet-name>
		<url-pattern>/pageList</url-pattern>
	</servlet-mapping>
	
	<!-- 阅读信息的Action -->
	<servlet>
		<servlet-name>ReadMsgAction</servlet-name>
		<servlet-class>servlet.ReadMsgAction</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>ReadMsgAction</servlet-name>
		<url-pattern>/check/readMsg</url-pattern>
	</servlet-mapping>
	
	<!-- 展示信息的Action -->
	<servlet>
		<servlet-name>ShowMsgAction</servlet-name>
		<servlet-class>servlet.ShowMsgAction</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>ShowMsgAction</servlet-name>
		<url-pattern>/check/showMsg</url-pattern>
	</servlet-mapping>
</web-app>

十一、页面效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对于这里我说一下啊, 不知道为啥我导入进去的图片它不显示,然后就看不到那个确定和重置按钮了。。。 我还特地去阿里图库去下载的,汗!~~

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值