资源描述
JSP在水一方留言簿设计报告
一 需求分析
随着互联网迅猛发展,网站给咱们带来不少便利,于此同步,论坛基本是每个网站必有功能,为顾客之间交流提供较好平台。我通过仔细分析和规划,本论坛有如下功能:顾客注册,登录,顾客信息修改,签写留言,留言查看,回答留言和管理员普通维护功能等。
这些功能详细描述如下:
1)顾客注册模块:顾客可已成为本论坛会员,通过表单把顾客有关信息提交给数据库。
2)登录模块:基本是每个系统必备模块,本论坛登录模块分为两个小模块:普通顾客登录,另一种是管理员登录。
3)签写留言模块:这是论坛重要功能之一,顾客把自己感兴趣话题刊登到论坛上,与网上会员进行探讨。
4)查看留言模块:这也是论坛重要功能之一,把顾客刊登留言逐条,安顺序显示出来。
5)回答留言模块:这也是论坛重要功能之一,顾客对别顾客刊登留言进行回答。
6)普通维护模块:这是给管理员功能,该功能对那些危害社会风气留言删除。
7)顾客信息修改模块:顾客能对自己信息进行修改。
二 分析和设计(页面和数据库)
设计网站论坛时,一方面应当区别是普通顾客登录还是管理员登录。如果是普通顾客登录,那么该顾客只有查看和回答留言权限。如果是管理员登录,则除了具备查看和回答权限外,还用品有管理论坛权限。
在顾客刊登留言后,将显示该顾客顾客名、性别、留言内容和留言时间等内容。如果在某个留言有回答内容,则显示出是谁恢复了该篇留言和回答内容。
此外还能在页面中显示当前系统时间和访问权限。
数据库设计
通过以上分析:数据库应有四个表,tb_user、td_topic、tb_reply、tb_counter。由于是个小型论坛,选取AEESS数据库。详细各表设计如下:
1 分析得知tb_user表功能记录顾客信息,具备如下字段:ID、UserName、PWD、Birthday、Sex、OICQ、
Tel、homepage、address、postcode、Email、status。
2 分析得知tb_topic表功能是存储顾客刊登留言,具备如下字段:ID、anthor、face、content、datetime。
3 分析得知tb_reply表功能是用于存储顾客对每条留言所回答信息,具备如下字段:ID、TpoicID、content、replyuser。
4 通过度析得知:tb_counter是记录网站每天访问次数,有如下两个字段:accessTime、hit。
5.通过度析,在显示留言是时候,要用到tb_user和tb_topic两张表,因此要设计一种具备这两张表一种视图:一方面建立关系如下:
视图如下:
页面设计
1 网站流程体如下:
2 各页面功能实现阐明:
1) 系统提供服务(top.jsp)
程序重要实现依照级别设立顾客权限,是用脚本言语(javascript)来显示系统当前时间,并通过<marquee>来实现滚动显示,重要代码如下:
<%@ page contentType="text/html;charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<%@ include file="connDB.jsp" %>
<jsp:include page="counter.jsp" />
<%
ResultSet rs_user=stmt.executeQuery("select * from tb_user where username='"+session.getAttribute("username")+"'and status='版主'");
boolean eof=rs_user.next();
%>
<script language="javascript">
function clockon(){
var date=new Date();
var YY=date.getYear();
var MM=date.getMonth()+1;
var DD=date.getDate();
var KK=date.getDay();
var HH=date.getHours();
var mm=date.getMinutes();
var SS=date.getSeconds();
if (MM<10) MM="0"+MM;
if (DD<10) DD="0"+DD;
if (HH<10) HH="0"+HH;
if (mm<10) mm="0"+mm;
if (SS<10) SS="0"+SS;
switch (KK){
case 1:
KK="星期一";
break;
case 2:
KK="星期二";
break;
case 3:
KK="星期三";
break;
case 4:
KK="星期四";
break;
case 5:
KK="星期五";
break;
case 6:
KK="星期六";
break;
case 0:
KK="星期日";
break;
}
var str_date=" 系统公示:"+YY+"年"+MM+"月"+DD+"日 "+KK+" "+HH+":"+mm+":"+SS;
if(document.all){
div_date.innerHTML=str_date;
}
var timer=setTimeout("clockon()",200);
}
</script>
<table width="777" height="124" border="0" align="center" cellpadding="0" cellspacing="0" >
<tr>
<td align="center" valign="top" height="5" bgcolor="#FFCCCC"></td>
</tr>
<tr>
<td width="790" align="center" valign="top"> <img src="images/banner.gif" width="500" height="124"></td>
</tr>
<tr>
<td align="center" valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="0" >
<tr>
<td height="5"></td>
</tr>
</table></td>
</tr>
</table>
<table width="777" height="21" border="0" align="center" cellpadding="0" cellspacing="0" background="images/revigate.GIF">
<tr align="center" valign="middle">
<%if(session.getAttribute("username")!=null){%>
<td width="104"><a href="Topic_add.jsp">签写留言</a></td>
<td width="101"><a href="modify.jsp">修改资料</a></td>
<%}else{%>
<td width="104"><a href="reg.jsp">顾客注册</a></td>
<%}%>
<td width="104">
<%if(session.getAttribute("username")!=null){%>
<a href="Logout_User.jsp">注销顾客</a>
<%}else{%>
<a href="#" Login_User.jsp','','width=300,height=200');">顾客登录</a>
<%}%>
</td>
<td width="104"><a href="index1.jsp">查看留言</a></td>
<td width="104"><a href="#" >刷新页面</a></td>
<td width="104">
<%if(eof){%>
<a href="Logout_User.jsp">注销版主登录</a>
<%}else{
%><a href="#" Login_manager.jsp','','width=300,height=200');">版主登录</a><%}%></td>
</tr>
</table>
<table width="777" height="47" border="0" align="center" cellpadding="0" cellspacing="0">
<tr align="center" valign="middle">
<td height="2" colspan="6"></td>
</tr>
<tr align="center" valign="middle">
<td width="18" height="17" align="left"><img src="images/speaker.GIF" width="16" height="16"></td>
<td width="290" align="left"><div >系统公示:</div></td>
<td width="469" align="right" >
<%if(session.getAttribute("username")!=null){
out.println("[ "+session.getAttribute("username")+" ]您好!您不想说点什么吗?如果想请点击“签写留言”!");
}else{
out.println("您好!如果您想说点什么,那么请先注册或登录!");
}%>
</td>
</tr>
<tr align="center" valign="middle">
<td colspan="3"><marquee direction="left" scrollamount="2" scrolldelay="2">
您好! 欢迎访问“在水一方”留言簿!!!已有[ <%=application.getAttribute("count")%> ]人访问过本网站!
</marquee></td>
</tr>
</table>
<%
stmt.close();
con.close();
%>
2) 查看留言(index1.jsp)
将所有;留言记录通过循环显示在客户端,并将某条留言回答记录和回答者姓名也显示出来。如果是登录顾客权限为普通顾客,那么该顾客权限极为回答留言。如果是管理员,那么该顾客权限就是回答和删除留言。由于涉及到多条记录显示,咱们用了分页显示办法出来。定义每个页面显示记录,通过ResultSet对象计算出总记录数,通过这两个数据计算总页数。重要代码如下:
<%@ page contentType="text/html;charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<jsp:include page="counter.jsp" />
<%
Statement stmt2 =con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
Statement stmt3 =con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs=stmt.executeQuery("select * from v_board");
ResultSet rs_reply=null;
ResultSet rs_user=stmt2.executeQuery("select * from tb_user where username='"+session.getAttribute("username")+"'and status='版主'");
System.out.print("查询成功!");
//ResultSet rs_topic=stmt.executeQuery("select * from tb_topic");
%>
------------------------------------------
<%
boolean tj=rs_user.next();
String str=(String)request.getParameter("Page");
if(str==null){
str="0";
}
int pagesize=5; //每页显示数据条数
rs.last();
int RecordCount=rs.getRow(); //获得记录总条数
int maxPage=0;
maxPage=(RecordCount%pagesize==0)?(RecordCount/pagesize):(RecordCount/pagesize+1); //得到是总页数
int Page=Integer.parseInt(str); //当前时第几页
if(Page<1){
Page=1;
}else{
if(((Page-1)*pagesize+1)>RecordCount){
Page=maxPage;
}
}
rs.absolute((Page-1)*pagesize+1);
for(int i=1;i<=pagesize;i++){
int a=rs.getInt("ID");
%>
<table width="100%" height="192" border="0" cellpadding="0" cellspacing="0" >
<tr align="center">
<td width="115" rowspan="3" align="center"><%=rs.getString("UserName")%>(<%=rs.getString("status")%>)
<p>
<%=rs.getString("Sex")%>生
<p>
表情:<%=rs.getString("face")%> </td>
<td width="2" rowspan="3" align="center" valign="bottom"><hr size="100%" width="1px" color="#FFCCCC"></td>
<td width="447" align="left" style="padding-left:10pt" >
<img src="images/email.GIF" alt="Email:<%=rs.getString("Email")%>" width="16" height="16">
<img src="images/home-menu.gif" alt="个人主页:<%=rs.getString("homepage")%>" width="26" height="20">
<img src="images/atusers.gif" alt="OICQ号码:<%=rs.getString("OICQ")%>" width="14" height="16">
<img src="images/datetime.gif" alt="<%=rs.getString("datetime")%>" width="18" height="18"> 留言时间:<%=rs.getString("datetime")%></td>
<td width="195" align="right" style="padding-left:10pt" >
<% out.println("<a href='reply.jsp?TopicID="+a+"'>回答 </a>");
if(tj){out.println("<a href='Del.jsp?TopicID="+a+"'>删除</a>");}%></td>
<td width="14" align="right" style="padding-left:10pt" > </td>
</tr>
<tr>
<td height="20" colspan="3" style="padding-left:10pt"><hr width="98%" color="#FFCCCC" size="1"></td>
</tr>
<tr>
<td height="109" colspan="3" valign="top" style="padding-left:10pt"><pre><%=rs.getString("content")%></pre></td>
</tr>
<tr>
<td height="2" colspan="5" align="center" valign="top" ><hr width="98%" color="#FFCCCC" size="1"></td>
</tr>
<%
rs_reply=stmt3.executeQuery("select * from tb_reply where TopicID="+a);
while(rs_reply.next()){
%>
<tr>
<td height="39" align="center" valign="top" ><%=rs_reply.getString("replyuser")%>回答</td>
<td align="center" valign="top"><hr size="20%" width="1px" color="#FFCCCC"></td>
<td colspan="3" valign="top" style="padding-left:10pt"><%=rs_reply.getString("content")%>
<hr width="98%" color="#FFCCCC" size="1"></td>
</tr>
<tr>
<td height="20" colspan="3" style="padding-left:10pt"> </td>
</tr>
<%}%>
</table>
<br>
<%
try{
if(!rs.next()){break;}
}catch(Exception e){}
}
%>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="right">当前页数:[<%=Page%>/<%=maxPage%>]
<%if(Page>1){%>
<a href="index1.jsp?Page=1">第一页</a> <a href="index1.jsp?Page=<%=Page-1%>">上一页</a>
<%
}
if(Page<maxPage){
%>
<a href="index1.jsp?Page=<%=Page+1%>">下一页</a> <a href="index1.jsp?Page=<%=maxPage%>">最后一页 </a>
<%}%>
3) 顾客登陆(Login_User_deal.jsp)
在top.jsp中设计是当顾客单击登录连接时候,弹出一种小对话框来提供顾客登录功能,因此在在个页面中需要刷新顾客登录后页面,用到了脚本语言(javascript)中一段代码:open.location.reload().管理员登录(login_manager_deal.jsp)与此页面代码相似,下面就不再写了。重要代码如下:
<%@ page contentType="text/html;charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<jsp:include page="counter.jsp" />
<%
request.setCharacterEncoding("GB2312");
String username=request.getParameter("username");
String PWD=request.getParameter("PWD");
if(username!=""){%>
<%
ResultSet rs=stmt.executeQuery("select * from tb_user where UserName='"+username+"' and status='顾客'");
if (rs.next()){
String rsPWD=rs.getString("PWD");
if(PWD.equals(rsPWD)){%>
<script language="javascript">
opener.location.reload();
window.close();
</script>
<%
session.setAttribute("username",username);
}else{%>
<script language="javascript">
alert("您输入密码不对的,请重新输入!");
history.back();
</script>
<%}
}else{ %>
<script language="javascript">
alert("您输入顾客名不对的,请重新输入!");
history.back();
</script>
<%}
}%>
4) 留言回答(reply_deal.jsp)
回答留言核心如何精确地将回答内容和留言关联起来。本例通过获得留言查看(index1.jsp)页面中留言回答连接所传递过来参数TopicTD(留言记录ID),来完毕回答功能。添加留言(Topic_add_deal.jsp)于此相似,在次就不在简介。重要程序代码如下:
<%@ page contentType="text/html;charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<%@ include file="connDB.jsp" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
<title>回答信息</title>
</head>
<body>
<%! //解决字符窜乱码
public String getStr(String str){
try{
String temp_p=str;
String temp=new String(temp_p.getBytes("iso-8859-1"),"gb2312");
return temp;
}
catch(Exception e){}
return "NULL";
}
%>
<%
String content=getStr(request.getParameter("content"));
int TopicID=Integer.parseInt(request.getParameter("TopicID"));
String replyuser=getStr((session.getAttribute("username")).toString());
if(content!=null && content.length()>0){
String sql="Insert into tb_reply(TopicID,content,replyuser) values("+TopicID+",'"+content+"','"+replyuser+"')";
int ret=0;
ret=stmt.executeUpdate(sql);
if(ret!=0){
out.println("<script language='javascript'>alert('回答信息成功!');window.location.href='index1.jsp';</script>");
}else{
out.println("<script language='javascript'>alert('回答信息失败!');window.location.href='index1.jsp';</script>");
}
}else{
response.sendRedirect("index1.jsp");
}
%>
</body>
</html>
5) 修改资料(modify_deal.jsp)
顾客登录后,如果想修改除了顾客名以外资料时,单击相应连接进入修改资料页面进行操作。重要代码如下:
<%@ page contentType="text/html;charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<%@ include file="connDB.jsp" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
<%!
public String getStr(String str){
try{
String temp_p=str;
String temp=new String(temp_p.getBytes("iso-8859-1"),"gb2312");
return temp;
}
catch(Exception e){}
return "NULL";
}
%>
<%
String username=request.getParameter("username");
if (username!=null && username.length()>0 ){
String PWD=getStr(request.getParameter("PWD1"));
String birthday=request.getParameter("birthday");
String sex=getStr(request.getParameter("sex"));
String OICQ=getStr(request.getParameter("OICQ"));
String tel=getStr(request.getParameter("tel"));
String homepage=getStr(request.getParameter("homepage"));
String address=getStr(request.getParameter("address"));
String postcode=request.getParameter("postcode");
String Email=getStr(request.getParameter("Email"));
int ret=0;
String sql="update tb_user set PWD='"+PWD+"',birthday='"+birthday+"',Sex='"+sex+"',OICQ='"+OICQ+"',Tel='"+tel+"',homepage='"+homepage+"',address='"+address+"',postcode='"+postcode+"',Email='"+Email+"' where username='"+username+"'";
ret=stmt.executeUpdate(sql);
if(ret!=0){
out.println("<script language='javascript'>alert('资料修改成功!');window.location.href='index1.jsp';</script>");
}else{
out.println("<script language='javascript'>alert('资料修改失败!');window.location.href='modify.jsp';</script>");
}
}else{
response.sendRedirect("modify.jsp");
}
%>
6) 新顾客注册(reg_ok.jsp)
顾客注册时应先判断顾客数据与否对的。例如:两次输入密码与否一致,对必填字段与否为空等要加以限制。这些可以通过jsp所创立静态页面进行判断。这里重要是判断新顾客注册顾客名与否已经被占用,如果没有就将顾客所填写数据添加到数据库中,如果被占用则提示顾客重新填写。重要代码如下:
<%@ include file="connDB.
展开阅读全文