10.最新通知
七天内要参加的会议,或者被取消的会议的通知
难点:对时间的处理
1.修改MeetingParticipantsDAO.java
/**
* 查询某员工最近七天参加的所有会议
*
* @param participantsid
* @return
*/
public List<Meeting> selectAllNewMeetings(int participantsid) {
conn = ConnectionFactory.getConnection();
List<Meeting> meetingslist = new ArrayList<Meeting>();
Meeting meeting = null;
try {
PreparedStatement st = null;
//获取现在的时间
Timestamp now = new Timestamp(System.currentTimeMillis());
//获取七天后的时间
Timestamp sevenDays = new Timestamp(System.currentTimeMillis() + 7 * 24 * 3600 * 1000);
//把两个时间转换为字符串
String nowTime = now.toString();
String sevenDaysTime = sevenDays.toString();
//会议表meeting+参会人员信息表meetingparticipants
//meeting.starttime<'" + sevenDaysTime起始时间小于七天后的时间,且没有被取消(状态是0)
String sql = "select * from meeting,meetingparticipants where meeting.meetingid=meetingparticipants.meetingid and"
+ " meetingparticipants.employeeid=" + participantsid + " and meeting.starttime>'" + nowTime
+ "'and meeting.starttime<'" + sevenDaysTime + "' and status='0'";
st = conn.prepareStatement(sql);
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
meeting = new Meeting();
meeting.setMeetingid(rs.getInt("meetingid"));
meeting.setMeetingname(rs.getString("meetingname"));
meeting.setRoomid(rs.getInt("roomid"));
meeting.setReservationistid(rs.getInt("reservationistid"));
meeting.setNumberofparticipants(rs.getInt("numberofparticipants"));
meeting.setStarttime(rs.getTimestamp("starttime"));
meeting.setEndtime(rs.getTimestamp("endtime"));
meeting.setReservationtime(rs.getTimestamp("reservationtime"));
meeting.setCanceledtime(rs.getTimestamp("canceledtime"));
meeting.setDescription(rs.getString("description"));
meeting.setStatus(rs.getString("status"));
meetingslist.add(meeting);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
ConnectionFactory.closeConnection();
}
return meetingslist;
}
/**
* 查询某员工被要求参加,但是又取消的会议
* @param participantsid
* @return
*/
public List<Meeting> selectAllCanceledMeetings(int participantsid) {
conn = ConnectionFactory.getConnection();
List<Meeting> meetingslist = new ArrayList<Meeting>();
Meeting meeting = null;
try {
PreparedStatement st = null;
Timestamp now = new Timestamp(System.currentTimeMillis());
String nowTime = now.toString();
//跟上面的不同是状态是1被取消的
String sql = "select * from meeting,meetingparticipants where meeting.meetingid=meetingparticipants.meetingid and"
+ " meetingparticipants.employeeid=" + participantsid + " and meeting.starttime>'" + nowTime
+ "'and status='1'";
st = conn.prepareStatement(sql);
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
meeting = new Meeting();
meeting.setMeetingid(rs.getInt("meetingid"));
meeting.setMeetingname(rs.getString("meetingname"));
meeting.setRoomid(rs.getInt("roomid"));
meeting.setReservationistid(rs.getInt("reservationistid"));
meeting.setNumberofparticipants(rs.getInt("numberofparticipants"));
meeting.setStarttime(rs.getTimestamp("starttime"));
meeting.setEndtime(rs.getTimestamp("endtime"));
meeting.setReservationtime(rs.getTimestamp("reservationtime"));
meeting.setCanceledtime(rs.getTimestamp("canceledtime"));
meeting.setDescription(rs.getString("description"));
meeting.setStatus(rs.getString("status"));
meetingslist.add(meeting);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
ConnectionFactory.closeConnection();
}
return meetingslist;
}
2.新增MyNotificationServlet
package com.meeting.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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 com.meeting.dao.MeetingDAO;
import com.meeting.dao.MeetingParticipantsDAO;
import com.meeting.service.MeetingRoomService;
import com.meeting.service.MeetingService;
import com.meeting.vo.Meeting;
/**
* 我的通知
* @author Administrator
*
*/
public class MyNotificationServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//取出当前登录者的id,作为参会者id保存
HttpSession session=request.getSession();
int participantsid=(Integer) session.getAttribute("employeeid");
//取出参会者七天内的参加的会议,以及 被取消的会议的列表
MeetingParticipantsDAO dao=new MeetingParticipantsDAO();
List<Meeting> meetingsList=dao.selectAllNewMeetings(participantsid);
List<Meeting> canceledMeetings=dao.selectAllCanceledMeetings(participantsid);
//查询会议室的名字的列表
MeetingRoomService roomService=new MeetingRoomService();
List<String> roomsNameList=new ArrayList<String>();
//利用循环把会议室的名字和会议室的id组合起来
for(Meeting m:meetingsList){
roomsNameList.add(roomService.viewOneMeetingRoom(m.getRoomid()).getRoomname());
}
//利用循环把会议室的名字和会议放在map里
Map<Meeting,String> meetingsMap=new HashMap<Meeting,String>();
for(int i=0;i<meetingsList.size();i++){
meetingsMap.put(meetingsList.get(i), roomsNameList.get(i));
}
request.setAttribute("meetingsMap", meetingsMap);
//把取消的会议室的名字和会议的id组合起来
List<String> cancelRoomNameList=new ArrayList<String>();
for(Meeting m:canceledMeetings){
cancelRoomNameList.add(roomService.viewOneMeetingRoom(m.getRoomid()).getRoomname());
}
//利用循环把取消的会议室的名字和会议放在map里
Map<Meeting,String> cancelMeetingsMap=new HashMap<Meeting,String>();
for(int i=0;i<canceledMeetings.size();i++){
cancelMeetingsMap.put(canceledMeetings.get(i),cancelRoomNameList.get(i));
}
request.setAttribute("cancelMeetingsMap", cancelMeetingsMap);
request.getRequestDispatcher("mynotification.jsp").forward(request, response);
}
}
3.配置web.xml
4.新增最新通知的页面mynotification.jsp
<%@ page language="java"
import="java.util.*,com.meeting.vo.*" pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>CoolMeeting会议管理系统</title>
<link rel="stylesheet" href="styles/common03.css"/>
</head>
<body>
<div class="page-content">
<div class="content-nav">
个人中心 > <a href="notifications">最新通知</a>
</div>
<table class="listtable">
<caption>
未来7天我要参加的会议:
</caption>
<tr class="listheader">
<th style="width:300px">会议名称</th>
<th>会议室</th>
<th>起始时间</th>
<th>结束时间</th>
<th style="width:100px">操作</th>
</tr>
<c:forEach var="item" items="${requestScope.meetingsMap}">
<tr>
<td>${item.key.meetingname}</td>
<td>${item.value }</td>
<td>${item.key.starttime }</td>
<td>${item.key.endtime }</td>
<td>
<a class="clickbutton" href="ViewMyMeetingDetailServlet?meetingid=${item.key.meetingid}">查看详情</a>
</td>
</tr>
</c:forEach>
</table>
<table class="listtable">
<caption>
已取消的会议:
</caption>
<tr class="listheader">
<th style="width:300px">会议名称</th>
<th>会议室</th>
<th>起始时间</th>
<th>结束时间</th>
<th style="width:100px">操作</th>
</tr>
<c:forEach var="item" items="${requestScope.cancelMeetingsMap}">
<tr>
<td>${item.key.meetingname}</td>
<td>${item.value }</td>
<td>${item.key.starttime }</td>
<td>${item.key.endtime }</td>
<td>
<a class="clickbutton" href="ViewMyMeetingDetailServlet?meetingid=${item.key.meetingid}">查看详情</a>
</td>
</tr>
</c:forEach>
</table>
</div>
<div class="page-footer">
<hr/>
更多问题,欢迎联系<a href="mailto:webmaster@eeg.com">管理员</a>
<img src="images/footer.png" alt="CoolMeeting"/>
</div>
</body>
</html>
5.修改adminleft.jsp
6.测试
11.显示可用会议室
根据时间只显示可用的会议室
1.修改MeetingRoomDAO 新增方法
/**
* 查询所有可用的会议室
* @param starttime
* @param endtime
* @return
*/
public List<MeetingRoom> selectMeetingRoomsByTime(Timestamp starttime,Timestamp endtime){
conn=ConnectionFactory.getConnection();
List<MeetingRoom> list=new ArrayList<MeetingRoom>();
String start=starttime.toString();
String end=endtime.toString();
MeetingRoom meetingroom=null;
try {
PreparedStatement st=null;
//三种情况
String sql="select * from meetingroom " +
"where meetingroom.roomid not in" +
" (select roomid from meeting " +
"where (starttime<'"+start+"' and endtime >'"+end+"')" +
" or (starttime>'"+start+"' and starttime <'"+end+"')"+
"or(endtime>'"+start+"' and endtime <'"+end+"') and status='0')";
st = conn.prepareStatement(sql);
ResultSet rs =st.executeQuery(sql);
while(rs.next()){
meetingroom=new MeetingRoom();
meetingroom.setRoomid(Integer.parseInt(rs.getString("roomid")));
meetingroom.setRoomnum(Integer.parseInt(rs.getString("roomnum")));
meetingroom.setCapacity(Integer.parseInt(rs.getString("capacity")));
meetingroom.setRoomname(rs.getString("roomname"));
meetingroom.setStatus(rs.getString("status"));
meetingroom.setDescription(rs.getString("description"));
list.add(meetingroom);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
ConnectionFactory.closeConnection();
}
System.out.println("MeetingROOM "+list.size());
return list;
}
2.创建RefreshRoomsServlet 查询可用会议室,使用XML返回
package com.meeting.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Timestamp;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.meeting.dao.MeetingDAO;
import com.meeting.dao.MeetingRoomDAO;
import com.meeting.vo.Employee;
import com.meeting.vo.MeetingRoom;
public class RefreshRoomsServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//得到起始时间和结束时间
Timestamp starttime=Timestamp.valueOf(request.getParameter("starttime"));
Timestamp endtime=Timestamp.valueOf(request.getParameter("endtime"));
//查询出所有可用的会议室
MeetingRoomDAO dao=new MeetingRoomDAO();
List<MeetingRoom> roomList=dao.selectMeetingRoomsByTime(starttime, endtime);
//将查询得到的部门信息,以XML文档的格式返回到浏览器
response.setContentType("text/xml;charset=utf-8");
PrintWriter out = response.getWriter();
response.setHeader("Cache-Control", "no-cache");
out.println("<?xml version='1.0' encoding='" + "utf-8" + "' ?>");
//符合XML规范,有根节点,否则解析有问题
out.println("<rooms>");
for (MeetingRoom m : roomList) {
out.println("<option>");
out.println("<value>" + m.getRoomid()+ "</value>");
out.println("<text>" + m.getRoomname() + "</text>");
out.println("</option>");
}
out.println("</rooms>");
out.close();
}
}
3.修改bookmeeting.jsp 使用AJAX局部去刷新页面
<%@ page language="java"
import="java.util.*,com.meeting.vo.*" pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>CoolMeeting会议管理系统</title>
<link rel="stylesheet" href="styles/common03.css" />
<style type="text/css">
#divfrom {
float: left;
width: 150px;
}
#divto {
float: left;
width: 150px;
}
#divoperator {
float: left;
width: 50px;
padding: 60px 5px;
}
#divoperator input[type="button"] {
margin: 10px 0;
}
#selDepartments {
display: block;
width: 100%;
}
#selEmployees {
display: block;
width: 100%;
height: 200px;
}
#selSelectedEmployees {
display: block;
width: 100%;
height: 225px;
}
</style>
<script language="javascript" type="text/javascript"
src="My97DatePicker/WdatePicker.js"></script>
<script type="text/javascript">
var xmlHttp;
function createXMLHttpRequest() {
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
}
}
function showEmployees() {
createXMLHttpRequest();
var deptid=document.getElementById("selDepartments").value;
var url = "SelectEmployeesOfDeptServlet?departmentid=" + escape(deptid);
xmlHttp.open("GET", url, true);
xmlHttp.onreadystatechange = callback;
xmlHttp.send(null);
}
function callback() {
clearEmployees();
var selEmployees=document.getElementById("selEmployees");
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
var elements = xmlHttp.responseXML.getElementsByTagName("option");
for (var i = 0; i < elements.length; i++) {
var value = elements[i].getElementsByTagName("value")[0].firstChild.nodeValue;
var text = elements[i].getElementsByTagName("text")[0].firstChild.nodeValue;
selEmployees.options.add(new Option(text,value));
}
}
}
}
function clearEmployees(){
document.getElementById("selEmployees").options.length=0;
}
function selectEmployees(){
var selEmployees=document.getElementById("selEmployees");
var selSelectedEmployees=document.getElementById("selSelectedEmployees");
for(var i=0;i<selEmployees.options.length;i++){
if (selEmployees.options[i].selected){
var opt=new Option(selEmployees.options[i].text,selEmployees.options[i].value);
opt.selected=true;
selSelectedEmployees.options.add(opt);
selEmployees.options.remove(i);
}
}
}
function deSelectEmployees(){
var selEmployees=document.getElementById("selEmployees");
var selSelectedEmployees=document.getElementById("selSelectedEmployees");
for(var i=0;i<selSelectedEmployees.options.length;i++){
if (selSelectedEmployees.options[i].selected){
selEmployees.options.add(new Option(selSelectedEmployees.options[i].text,selSelectedEmployees.options[i].value));
selSelectedEmployees.options.remove(i);
}
}
setSelected();
}
function setSelected(){
var selSelectedEmployees=document.getElementById("selSelectedEmployees");
for(var i=0;i<selSelectedEmployees.options.length;i++){
selSelectedEmployees.options[i].selected=true;
}
}
function refreshRooms(){
createXMLHttpRequest();
/* 获得时间 */
var starttime=document.getElementById("starttime").value;
var endtime=document.getElementById("endtime").value;
var url = "RefreshRoomsServlet?starttime=" + escape(starttime)+"&endtime="+escape(endtime);
xmlHttp.open("GET", url, true);
xmlHttp.onreadystatechange = refresh;
xmlHttp.send(null);
}
function refresh() {
clearMeetingRooms();
var roomid=document.getElementById("roomid");
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
var elements = xmlHttp.responseXML.getElementsByTagName("option");
for (var i = 0; i < elements.length; i++) {
var value = elements[i].getElementsByTagName("value")[0].firstChild.nodeValue;
var text = elements[i].getElementsByTagName("text")[0].firstChild.nodeValue;
/* 加载到roomid这个下拉列表里 */
roomid.options.add(new Option(text,value),i+1);
}
}
}
}
function clearMeetingRooms(){
document.getElementById("roomid").options.length=1;
}
</script>
</head>
<body >
<div class="page-content">
<div class="content-nav">会议预定 > 预定会议</div>
<form method="post" action="BookMeetingServlet">
<fieldset>
<legend>会议信息</legend>
<table class="formtable">
<tr>
<td>会议名称:</td>
<td><input type="text" id="meetingname" name="meetingname" maxlength="20" /></td>
</tr>
<tr>
<td>预计参加人数:</td>
<td><input type="text" id="numofattendents" name="numofparticipants"/></td>
</tr>
<tr>
<td>预计开始时间:</td>
<td><input class="Wdate" type="text" id="starttime" name="starttime"
onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})"></td>
</tr>
<tr>
<td>预计结束时间:</td>
<td><input class="Wdate" type="text" id="endtime" name="endtime"
onClick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" >
</td>
</tr>
<tr>
<td>选择会议室:</td>
<!--onfocus聚焦就会调用refreshRooms()方法 -->
<td><select id="roomid" name="roomid" onfocus="refreshRooms()">
<option>请选择会议室</option>
<c:forEach var="room" items="${requestScope.roomsList}">
<option value="${room.roomid}">${room.roomname}</option>
</c:forEach>
</select></td>
</tr>
<tr>
<td>会议说明:</td>
<td><textarea id="description" name="description" rows="5"></textarea></td>
</tr>
<tr>
<td>选择参会人员:</td>
<td>
<div id="divfrom">
<select id="selDepartments" onchange="showEmployees()">
<option>请选择部门</option>
<c:forEach var="dept" items="${requestScope.deptsList}">
<option value="${dept.departmentid}">${dept.departmentname}</option>
</c:forEach>
</select> <select id="selEmployees" multiple="multiple">
</select>
</div>
<div id="divoperator">
<input type="button" class="clickbutton" value=">" onclick="selectEmployees()" />
<input type="button"
class="clickbutton" value="<" onclick="deSelectEmployees()" />
</div>
<div id="divto">
<select id="selSelectedEmployees" name="selSelectedEmployees" multiple="multiple" >
</select>
</div></td>
</tr>
<tr>
<td class="command" colspan="2">
<input type="hidden" name="code" value="book">
<input type="submit" class="clickbutton" value="预定会议" />
<input type="reset" class="clickbutton" value="重置" /></td>
</tr>
</table>
</fieldset>
</form>
</div>
<div class="page-footer">
<hr />
更多问题,欢迎联系<a href="mailto:webmaster@eeg.com">管理员</a> <img
src="images/footer.png" alt="CoolMeeting" />
</div>
</body>
</html>
4.配置servlet
5.测试
假如不选时间先,会报空指针异常
我们可以提醒自己人,
try{
Timestamp starttime=Timestamp.valueOf(request.getParameter("starttime"));
Timestamp endtime=Timestamp.valueOf(request.getParameter("endtime"));
//查询出所有可用的会议室
MeetingRoomDAO dao=new MeetingRoomDAO();
List<MeetingRoom> roomList=dao.selectMeetingRoomsByTime(starttime, endtime);
//将查询得到的部门信息,以XML文档的格式返回到浏览器
response.setContentType("text/xml;charset=utf-8");
PrintWriter out = response.getWriter();
response.setHeader("Cache-Control", "no-cache");
out.println("<?xml version='1.0' encoding='" + "utf-8" + "' ?>");
//符合XML规范,有根节点,否则解析有问题
out.println("<rooms>");
for (MeetingRoom m : roomList) {
out.println("<option>");
out.println("<value>" + m.getRoomid()+ "</value>");
out.println("<text>" + m.getRoomname() + "</text>");
out.println("</option>");
}
out.println("</rooms>");
out.close();
}catch(IllegalArgumentException e){
System.out.println("请先选起始和结束日期再选择会议室");
e.printStackTrace();
}
把他捕获异常捕获起来.