《JSP基础教程》课程设计——BBS论坛设计
- 格式:doc
- 大小:883.00 KB
- 文档页数:11
《JSP基础教程》课程设计BBS论坛系统目录1.功能需求 (3)2.框架规划 (3)2.1划分模块 (3)1)用户注册模块 (3)2)用户登录模块 (3)3)信息显示模块 (4)4)信息操作模块 (4)5)用户管理模块 (4)6)数据库模块 (4)2.2模块之间的关系 (4)2.3制定页面流程 (5)3.数据库设计 (6)3.1设计数据表的结构 (6)4.各单位模块设计 (7)4.1用户注册登陆功能 (7)4.2 用户发贴与回复功能 (7)4.3 管理员管理帖子与用户管理功能 (9)5.个人心得 (10)BBS论坛系统的设计与实现1.功能需求本系统根据论坛系统的需要,以实现交流信息的一个平台。
在这个BBS论坛系统中友三类用户,普通用户、版主和管理员。
普通用户具有的功能如下:✓用户注册✓分页查看所有主题文章列表✓发表主题文章✓回复文章✓查看主题文章和回复文章的详细内容✓对自己发表或回复的文章进行修改或者删除版主具有的功能如下:✓具有普通用户的所有功能✓对本讨论区的所有文章可以修改或删除管理员具有的功能如下:✓具有普通用户的所有功能✓对所有版面的所有文章可以修改和删除✓用户管理功能,包括修改用户的个人信息或删除用户2.框架规划2.1划分模块这个BBS论坛系统设计由6个基本模块所组成:1)用户注册模块这个模块完成新用户的注册功能,并能对新用户的注册信息进行差错检验。
包含的文件有:新用户注册表单页面:register.jsp验证注册信息并将注册信息存入数据库的页面:chkregister.jsp2)用户登录模块这个模块提供用户的登录界面,并验证用户名和密码,以确认用户身份。
包含的文件有:用户登录页面(论坛的主页面):index.html验证登录信息的页面:chklogin.jsp3)信息显示模块这个模块显示论坛的所有讨论区、各讨论区中所有主题文章、主题文章和回复文章的详细内容。
包含的文件有:显示所有讨论区列表的页面:listboard.jsp各讨论区中所有主题文章的分显示页面:listarticle.jsp显示主题文章和回复文章详细内容的页面:logout.jsp4)信息操作模块这个模块提供发表主题文章、回复文章、修改文章以及修改删除文章的功能,并且对不同身份的用户给予不同的操作权限。
BBS论坛系统的设计与实现摘要BBS的英文名称是Bulletin Board System,翻译为中文就是“电子公告板”。
BBS 在上世纪九十年代进入中国,并迅速普及。
本设计的目的是用JSP和SQL Server 2000开发一个简易的BBS系统,并实现账户安全保护。
此外,BBS系统有操作简单、界面友好的特点,并具有广泛的应用前景。
BBS系统开发主要讲述了系统设计的基本功能和方法。
接着以BBS系统为例,逐一介绍开发的步骤:系统分析、系统设计、系统实现。
在系统分析中先后用数据流程图、系统的功能结构图分析了BBS系统所需的各种数据。
在BBS系统的设计中,详细的展现了系统的各个功能模块,所需的数据库表及表字段,菜单的设计等,并通过运用MD5函数,实现用户账户的安全保护。
在BBS系统的实现中,取得了系统预期的成果,基本使各个模块的功能得以实现,并给出了模块实现的核心代码和主要的界面设计。
关键词:BBS系统,JSP,SQL Server 2000,Account security目录第1章绪论......................................................... .. 错误!未定义书签。
1.1 研究背景.......................................... 错误!未定义书签。
1.2 研究现状.......................................... 错误!未定义书签。
1.3 研究内容和目标.................................... 错误!未定义书签。
1.4 本文的结构安排.................................... 错误!未定义书签。
第2章开发工具与关键技术介绍..................... 错误!未定义书签。
2.1 CSS技术.......................................... 错误!未定义书签。
JSP课程设计报告BBS论坛设计一、BBS论坛BBS的英文全称是Bulletin Board System,译为“电子公告板”。
BBS最早是用来公布股市价格等类信息的,一直到互联网与个人计算机普及后广泛流行于网络。
目前,通过BBS 系统开发出各种论坛、网上社区、交友中心等信息平台。
二、BBS系统角色本系统实现BBS论坛的浏览、发贴、注册等功能。
系统的角色分为:1、普通用户(游客)浏览信息(主贴及加回帖)、用户注册2、注册用户用户登录、发表主贴、对相关的主贴发表回帖、个人信息维护3、版主对所属版块信息的维护,对不合适的主贴及回帖维护4、系统管理员对版块进行管理,对用户进行管理三、设计基本思路(修改相应的名称与本人项目对应,也可自己设计类似的图)四、BBS详细设计分析(给出各页面的运行效果截图、相关的Servlet代码,Servlet关键加注释)1:背景加的是浮动框架代码:<html><head><title>未标题-2</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head><body bgcolor="#FFFFFF" leftmargin="0" topmargin="0" marginwidth="0"marginheight="0"><!-- Save for Web Slices (未标题-2) --><table id="__01" width="1247" height="567" border="0" cellpadding="0"cellspacing="0"><tr><td colspan="3"><img src="images/jing_01.jpg" width="1247" height="50" alt=""></td> </tr><tr><td width="90"><img src="images/jing_02.jpg" width="63" height="465" alt=""></td> <td width="1091"><iframe name="left" width="100%" height="80%" scrolling="yes" src="login.jsp"frameborder="0"></iframe> </td><td width="66"><img src="images/jing_04.jpg" width="63" height="465"alt=""></td></tr><tr><td colspan="3"><img src="images/jing_05.jpg" width="1247" height="52" alt=""></td> </tr></table><!-- End Save for Web Slices --></body></html>1、系统主页面BBS.jsp运行截图:()相关代码:导入标签:<%@taglib uri="/jsp/jstl/core"prefix="c"%><body><p><br><img src="images/logo.jpg"width="290"height="70"><%String uname=(String)session.getAttribute("uname");%><%if(uname==null){ %><div>你尚未登录 || <a href="login.jsp">登录</a> || 注册</div><%} else{ %><div>当前用户:<%=uname %></div><p><% } %><p><a href="GetTopicServlet?currentpage=1&boardid=${boardid}}">首页</a></p><table width="928"height="83"border="1"align="left" cellpadding="0"cellspacing="0"><%ArrayList<Board> bdata=BoardDao.getAllBoard();for(int i=0;i<bdata.size();i++){Board tem=bdata.get(i);%><tr><th width="134"bgcolor="#00BC9A"scope="col"><divalign="center"><img src="images/icon3.gif"width="18" height="16"></div></th><th width="632"bgcolor="#00BC9A"scope="col"><div align="center"><ahref="GetTopicServlet?boardid=<%=tem.getBid() %>"><%=tem.getBname () %></a></div></th><th width="105"bgcolor="#00BC9A"scope="col"><div align="center">主贴数:<%=tem.getTopicnum() %></div></th><th width="47"bgcolor="#00BC9A"scope="col"><div align="center"></div></th></tr><tr><td bgcolor="#00BC9A"><div align="center"></div></td><td><div align="center">版主:<%ArrayList<User> udata=tem.getBuserdata();for(int j=0;j<udata.size();j++)out.print(udata.get(j).getUname()+" ");%></div></td><td><div align="center"></div></td><td><div align="center"></div></td></tr><% } %></table></p></html>GetTopicServlet://1 获取版块的idString boardid=request.getParameter("boardid");System.out.print("bid="+boardid);String curnum=request.getParameter("currentpage");if(curnum==null)curnum="1";//2 调用相关的类查询相关的信息GetPage mypage=new GetPage();DBConnect mydb=new DBConnect();String sql="select * from topic where boardid="+boardid;mypage.setDb(mydb);mypage.setKeyFielsName("topicid");mypage.setP_curpage(Integer.parseInt(curnum));mypage.setPageSize(3);mypage.setSql(sql);ArrayList<Topic> tdata=new ArrayList<Topic>();ResultSet re=null;try {re=mypage.getPage();while(re.next()){Topic tem=new Topic();tem.setTopicid(re.getString(1));tem.setTitle(re.getString(2));tem.setTdata(re.getString(4));tem.setReplynum(ReplayDao.getReplayByTopicId(tem.getTopicid()) +"");String userid=re.getString(5);tem.setTopicuser(UserDao.getUserInfoByUserId(userid));tdata.add(tem);}}catch (Exception e) {e.printStackTrace();}//判断是否为版主HttpSession session=request.getSession();String u=(String)session.getAttribute("uid");System.out.print("u="+u+"aa");boolean flag=false;if(u!=null){//u不为空说明登陆用户,判断是否为版主flag=MasterDao.checkMaster(u, boardid);}//3 将查询结果送到信息显示request.setAttribute("flag", flag);System.out.print("dd="+tdata.size());request.setAttribute("ttdata", tdata);request.setAttribute("boardid", boardid);request.setAttribute("curpage", mypage.getP_curpage());request.setAttribute("totalpage", mypage.getTotalPage());request.getRequestDispatcher("topiclist.jsp").forward(request, response);………2、主题帖显示及发帖页面topiclist.jsp相关代码:导入标签:<%@taglib uri="/jsp/jstl/core"prefix="c"%> <body><img src="images/logo.jpg"width="290"height="70"><%String uname=(String)session.getAttribute("uname");%><%if(uname==null){ %><div>你尚未登录 || <a href="login.jsp">登录</a> || 注册</div><%} else{ %><div>当前用户:<%=uname %></div><p><% } %><p>首页</p><table width="1018"height="133"border="1"cellpadding="0" cellspacing="0"><tr><th width="92"bgcolor="#00BC9A"scope="col"><div align="center">*</div></th><th width="521"bgcolor="#00BC9A"scope="col"><div align="center">主帖标题</div></th><th width="124"bgcolor="#00BC9A"scope="col"><div align="center">发帖人</div></th><th width="67"bgcolor="#00BC9A"scope="col"><div align="center">回帖数</div></th><th width="202"bgcolor="#00BC9A"scope="col"><divalign="center">发帖时间</div></th></tr><c:forEach items="${requestScope.ttdata}" var="tem"><tr><td align="center"><c:if test="${flag=='true'}"><ahref="delTopicservlet?topicid=${tem.topicid}&&boardid=${param.boa rdid }">删除</a></c:if><c:if test="${flag!='true'}"><img src="images/headimage4.JPG"width="17"height="17"></c:if></td><td><a href="NeiRong?topicid=${tem.topicid}">${tem.title }</a></td> <td align="center">${tem.topicuser.uname}</td><td align="center">${tem.replynum }</td><td align="center">${tem.tdata }</td></tr></c:forEach></table><p align="center">共${totalpage }页当前第${curpage }页<a href="GetTopicServlet?currentpage=1&boardid=${boardid}">首页</a><ahref="GetTopicServlet?currentpage=${requestScope.curpage-1}&board id=${boardid}">上一页</a><ahref="GetTopicServlet?currentpage=${requestScope.curpage+1}&board id=${boardid}">下一页</a><ahref="GetTopicServlet?currentpage=${totalpage}&boardid=${boardid} ">尾页</a></p></body></html>delTopicservlet:String topicid=request.getParameter("topicid");String boardid=request.getParameter("boardid");System.out.print(topicid+boardid);int n=TopicDao.delTopicByTopicId(topicid);if(n>0){request.getRequestDispatcher("GetTopicServlet?boardid="+boardid).forward(request, response);}else{System.out.print("删除失败");}3、回帖查看及发回帖页面replylist.jsp相关代码:导入标签:<%@taglib uri="/jsp/jstl/core"prefix="c"%></head><script language="javascript">function check(){var a=document.form1.flag.value;if(a==""){alert("要发贴,请先登录");return false;}var b=document.form1.contentinfo.value;if(content==""){alert("请输入主帖的标题");return false;}return true;}</script><body><table width="1039"height="167"border="1"cellpadding="0" cellspacing="0"><tr><th width="257"bgcolor="#00bc9a"scope="col"><div align="center">发帖人:${topicInfo.topicuser} </div></th> <th width="501"bgcolor="#00BC9A"scope="col">主帖标题:${topicinfo.title }</th><th width="148"bgcolor="#00BC9A"scope="col">发帖时间:${topicinfo.tdata }</th><th width="123"bgcolor="#00BC9A"scope="col"> </th></tr><tr><td height="48"><p align="center"class="STYLE1 STYLE1"><img src="images/16.gif"width="14"height="14"></p><p align="center"class="STYLE1 STYLE1">${topicinfo.topicuser.uname }</p></td><td colspan="3"align="left"valign="top"><p class="STYLE1 STYLE1">内容:</p><p class="STYLE1 STYLE1">${topicinfo.tcontent }</p></td></tr><c:forEach items="${rdata}" var="tem"varStatus="i"><tr><td height="28"bgcolor="#00BC9A"class="a"><div align="center" class="STYLE1">回帖人</div></td><td bgcolor="#00BC9A"class="a">回帖时间:${tem.creatdate }</td> <td bgcolor="#00BC9A"class="a">楼层:<c:if test="${i.count==1 }">沙发</c:if><c:if test="${i.count!=1 }">${i.count }</c:if></td><td bgcolor="#00BC9A"class="a"><a href="delReplyservlet?replyid=${tem.replyid}&&topicid=${tem.topic id}">删除</a></td></tr><tr><td height="48"><div align="center"class="STYLE1"><p><img src="images/6.gif"width="14"height="14"></p><p>${tem.replyuser.uname}</p></div></td><td colspan="3"align="left"valign="top"><span class="STYLE1"> <c:if test="${tem.rstatus==0}">该帖子已被删除</c:if><c:if test="${tem.rstatus==1}"> ${tem.contentinfo} </c:if></span></td></tr></c:forEach></table><form name="form1"method="post"action="addreplyservlet"><table width="315"height="125"border="1"align="center" cellpadding="0"cellspacing="0"><tr><th colspan="2"bgcolor="#00BC9A"scope="col">跟帖(提示:请登录)</th></tr><tr><td bgcolor="#00BC9A">内容</td><td><label><textarea name="contentinfo"cols="30"rows="8"></textarea><input type="hidden"name="flag" value="${erinfo}"><input type="hidden"name="topicid" value="${param.topicid}"></label></td></tr><tr><td height="23"colspan="2"align="center" bgcolor="#00BC9A"><label><input type="submit"name="Submit"value="提交"><input type="reset"name="Submit2"value="重置"></label></td></tr></table></form></body>addreplyservlet:request.setCharacterEncoding("gb2312");String content=request.getParameter("contentinfo");String topicid=request.getParameter("topicid");System.out.print(content+"||"+topicid+"||");HttpSession session=request.getSession();String userid=(String)session.getAttribute("uid");int n=ReplayDao.addReply(content, topicid, userid);//3转向if(n>0){//合法用户response.sendRedirect("NeiRong?topicid="+topicid);}else{//非法用户response.sendRedirect("添加失败!");}回帖:<%@taglib uri="/jsp/jstl/core"prefix="c"%></head><script language="javascript">function check(){var a=document.form1.flag.value;if(a==""){alert("要发贴,请先登录");return false;}var b=document.form1.contentinfo.value;if(content==""){alert("请输入主帖的标题");return false;}return true;}</script><body><table width="1039"height="167"border="1"cellpadding="0" cellspacing="0"><tr><th width="257"bgcolor="#00bc9a"scope="col"><div align="center">发帖人:${topicInfo.topicuser} </div></th> <th width="501"bgcolor="#00BC9A"scope="col">主帖标题:${topicinfo.title }</th><th width="148"bgcolor="#00BC9A"scope="col">发帖时间:${topicinfo.tdata }</th><th width="123"bgcolor="#00BC9A"scope="col"> </th></tr><tr><td height="48"><p align="center"class="STYLE1 STYLE1"><imgsrc="images/16.gif"width="14"height="14"></p><p align="center"class="STYLE1 STYLE1">${topicinfo.topicuser.uname }</p></td><td colspan="3"align="left"valign="top"><p class="STYLE1 STYLE1">内容:</p><p class="STYLE1 STYLE1">${topicinfo.tcontent }</p></td></tr><c:forEach items="${rdata}" var="tem"varStatus="i"><tr><td height="28"bgcolor="#00BC9A"class="a"><div align="center" class="STYLE1">回帖人</div></td><td bgcolor="#00BC9A"class="a">回帖时间:${tem.creatdate }</td> <td bgcolor="#00BC9A"class="a">楼层:<c:if test="${i.count==1 }">沙发</c:if><c:if test="${i.count!=1 }">${i.count }</c:if></td><td bgcolor="#00BC9A"class="a"><a href="delReplyservlet?replyid=${tem.replyid}&&topicid=${tem.topic id}">删除</a></td></tr><tr><td height="48"><div align="center"class="STYLE1"><p><img src="images/6.gif"width="14"height="14"></p><p>${tem.replyuser.uname}</p></div></td><td colspan="3"align="left"valign="top"><span class="STYLE1"> <c:if test="${tem.rstatus==0}">该帖子已被删除</c:if><c:if test="${tem.rstatus==1}"> ${tem.contentinfo} </c:if></span></td></tr></c:forEach></table><form name="form1"method="post"action="addreplyservlet"><table width="315"height="125"border="1"align="center" cellpadding="0"cellspacing="0"><tr><th colspan="2"bgcolor="#00BC9A"scope="col">跟帖(提示:请登录)</th></tr><tr><td bgcolor="#00BC9A">内容</td><td><label><textarea name="contentinfo"cols="30"rows="8"></textarea><input type="hidden"name="flag"value="${erinfo}"><input type="hidden"name="topicid" value="${param.topicid}"></label></td></tr><tr><td height="23"colspan="2"align="center" bgcolor="#00BC9A"><label><input type="submit"name="Submit"value="提交"><input type="reset"name="Submit2"value="重置"></label></td></tr></table></form></body>addreplyservletrequest.setCharacterEncoding("gb2312");String content=request.getParameter("contentinfo");String topicid=request.getParameter("topicid");System.out.print(content+"||"+topicid+"||");HttpSession session=request.getSession();String userid=(String)session.getAttribute("uid");int n=ReplayDao.addReply(content, topicid, userid);//3转向if(n>0){//合法用户response.sendRedirect("NeiRong?topicid="+topicid);}else{//非法用户response.sendRedirect("添加失败!");}4、用户登录5、<body><div align="center"><img src="images/logo.jpg"width="290" height="70"><br><%String uname=(String)session.getAttribute("uname");%><%if(uname==null){ %></div><div><div align="center">你尚未登录 || <a href="login.jsp">登录</a>|| 注册</div></div><div align="center"><%} else{ %></div><div><div align="center">当前用户:<%=uname %></div></div><p align="center"><% } %><form name="form1"method="post"action="logincheck"><table width="334"height="143"border="1"align="center"><tr><td width="108"bgcolor="#00bc9a"><div align="center">用户名</div></td><td width="210"><div align="center"><label><input type="text"name="username"></label></div></td></tr><tr><td bgcolor="#00BC9A"><div align="center">密码</div></td><td><div align="center"><label><input type="password"name="userpass"></label></div></td></tr><tr><td colspan="2"bgcolor="#00BC9A"><div align="center"><label><input type="submit"name="Submit"value="提交"></label><label><input type="reset"name="Submit2"value="重置"></label></div><div align="center"></div></td></tr></table></form></body></html>Logincheck://1获取request.setCharacterEncoding("gb2312");String uname=request.getParameter("username");String upass=request.getParameter("userpass");//2判断String userid=UserDao.checkUser(uname, upass);System.out.print("check="+userid+uname+upass);//3转向if(userid!=null){//合法用户HttpSession session=request.getSession();session.setAttribute("uid", userid);session.setAttribute("uname", uname);response.sendRedirect("BBS.jsp");}else{//非法用户response.sendRedirect("login.jsp");}6、7、用户注册<%@taglib uri="/jsp/jstl/core"prefix="c"%><body><p align="center"><img src="images/logo.jpg"width="290" height="70"></p><p><br></p><form name="form1"method="post"action="adduser"><table width="338"height="209"border="1"align="center" cellpadding="1"cellspacing="1"><tr><td width="92"align="center"bgcolor="#00bc9a">用户名</td><td width="291"align="center"><label for="textfield"></label><input type="text"name="username"id="textfield"></td></tr><tr><td align="center"bgcolor="#00BC9A">密码</td><td align="center"><label for="textfield2"></label><input type="password"name="password"id="textfield2"></td></tr><tr><td align="center"bgcolor="#00BC9A">确认密码</td><td align="center"><label for="textfield3"></label><input type="password"name="password"id="textfield3"></td> </tr><tr><td align="center"bgcolor="#00BC9A">性别</td><td align="center"><p><label><input name="sex"type="radio"value="男"checked>男</label><label><input type="radio"name="sex"value="女">女</label></td></tr><tr><td height="85"align="center"bgcolor="#00BC9A">头像</td><td><img src="images/headimage2.jpg"width="70"height="70" name="hcit"><script language="javascript">function aaa(){document.hcit.src=document.form1.select.value;}</script><label for="select"></label><select name="select"id="select"onChange="aaa()"><option value="1.gif">头像1</option><option value="images/headimage2.jpg">头像2</option><option value="images/headimage3.JPG">头像3</option><option value="images/headimage4.JPG">头像4</option><option value="images/headimage5.JPG">头像5</option> </select></td></tr><tr><td colspan="2"align="center"bgcolor="#00BC9A"><input type="submit"name="button"id="button"value="确认"><input type="reset"name="button2"id="button2"value="取消"></td></tr></table></form><p> </p><p><br></p></body><body>"</body></html>adduser(servlet)://1获取request.setCharacterEncoding("gb2312");String username=request.getParameter("username");String userpass=request.getParameter("password");String sex=request.getParameter("sex");String image=request.getParameter("select");System.out.print(username+userpass+sex+image);HttpSession session=request.getSession();String userid=(String)session.getAttribute("uid");int n=UserDao.addUser(username, userpass, sex, image);//3转向if(n>0){//合法用户response.sendRedirect("login.jsp?mes=2");}else{//非法用户response.sendRedirect("regist.jsp");}。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——BBS分类信息管理的DAO组件的实现及单元测试(第1/2部分)1.1.1BBS分类信息管理的DAO组件的实现——应用Spring中的编程式事务实现1、在项目中添加一个BBSTitleInfoManageDAOInterface接口的一个实现类(1)类名称为BBSTitleInfoManageDAOSpringHibernateImple,包名称为com.px1987.webbbs.springhibernatedao、并且继承于HibernateDaoSupport类注意:此时的DAO组件继续继承于Observable类。
(2)编程该实现类需要将sessionFactory对象注入到DAO组件中,也就是要在该DAO中声明一个org.hibernate.SessionFactory类的成员属性sessionFactory。
private SessionFactory sessionFactory;public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory;}本DAO组件采用基于Hibernate的原生API进行功能实现,并借助于HibernateTemplate 类简化编程实现。
但不应用回调方式实现DAO的功能方法,该方式由于没有继承于HibernateDaoSupport类,因此有一定的灵活性。
注意:由于本DAO组件没有应用HibernateCallback回调方式实现DAO的功能方法,因此在功能实现方面会受到一定的限制(如查询缓存的具体应用方面等)。
因此,如果需要应用这些特殊的功能要求,应该采用HibernateCallback回调接口的方式实现DAO的功能方法。
请见下面的功能实现代码:String HQLQueryInClass=null;public int getBBSTitleInfoTotalCounter(String HQLQuery) throws WebBBSException{ HQLQueryInClass=HQLQuery;Long returnObjectCounter=null;try {oneHibernateTemplate = new HibernateTemplate(this.sessionFactory);DefaultTransactionDefinition def = new DefaultTransactionDefinition();status = transactionManager.getTransaction(def);returnObjectCounter=(Long)oneHibernateTemplate.execute(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException {Query query = session.createQuery(HQLQueryInClass);Long objectCounter=(Long)query.uniqueResult();mit(status);return objectCounter;}});}catch (DataAccessException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("BBSTitleInfoManageDAOSpringHibernateImple类中的updateOneAdminUserPassWord方法出现了DataAccessException异常");}return returnObjectCounter.intValue();}(3)BBSTitleInfoManageDAOSpringHibernateImple类的程序代码示例package com.px1987.webbbs.springhibernatedao;import java.util.ArrayList;import java.util.Date;import java.util.Iterator;import java.util.List;import java.util.Observable;import org.hibernate.HibernateException;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.springframework.dao.DataAccessException;import org.springframework.orm.hibernate3.HibernateCallback;import org.springframework.orm.hibernate3.HibernateTemplate;import org.springframework.transaction.PlatformTransactionManager;import org.springframework.transaction.TransactionDefinition;import org.springframework.transaction.TransactionStatus;import org.springframework.transaction.support.DefaultTransactionDefinition;import org.springframework.transaction.support.TransactionCallbackWithoutResult;import org.springframework.transaction.support.TransactionTemplate;import com.px1987.webbbs.config.ClassNameConfig;import com.px1987.webbbs.dao.BBSTitleInfoManageDAOInterface;import com.px1987.webbbs.dao.BBSTitleInfoPO;import com.px1987.webbbs.exception.WebBBSException;import com.px1987.webbbs.util.LogInfoFactory;/*public class BBSTitleInfoManageDAOSpringHibernateImple extendsHibernateDaoSupport implements BBSTitleInfoManageDAOInterface*/public class BBSTitleInfoManageDAOSpringHibernateImple extendsObservable implements BBSTitleInfoManageDAOInterface {TransactionStatus status =null;private PlatformTransactionManager transactionManager;public void setTransactionManager(PlatformTransactionManager transactionManager) { this.transactionManager = transactionManager;}private SessionFactory sessionFactory;public void setSessionFactory(SessionFactory sessionFactory) {this.sessionFactory = sessionFactory;}/*private LocalSessionFactoryBean sessionFactory=null;public void setSessionFactory(LocalSessionFactoryBean sessionFactory){ this.sessionFactory = sessionFactory;}*/HibernateTemplate oneHibernateTemplate=null;public BBSTitleInfoManageDAOSpringHibernateImple() {}public boolean deleteOneBBSTitleInfo(int bbsTitleID) throws WebBBSException{ boolean OKOrNot=false;oneHibernateTemplate = new HibernateTemplate(this.sessionFactory);DefaultTransactionDefinition def = new DefaultTransactionDefinition();def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);status = transactionManager.getTransaction(def);try{BBSTitleInfoPOoneBBSTitlePOTODeleted=(BBSTitleInfoPO)oneHibernateTemplate.get(BBSTitleInfoPO.class,new Integer(bbsTitleID));if(oneBBSTitlePOTODeleted==null){WebBBSException oneWebBBSException=new WebBBSException("在数据库表中不存在指定bbsTitleID="+bbsTitleID+"的数据顶目!");int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(oneWebBBSException); //当出现异常时将通知各个观察者throw oneWebBBSException;}oneHibernateTemplate.delete(oneBBSTitlePOTODeleted);mit(status);OKOrNot=true;}catch (HibernateException e){transactionManager.rollback(status); // 也可以执行status.setRollbackOnly();int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在BBSTitleInfoManageDAOSpringHibernateImple 类中的deleteOneBBSTitleInfo方法出现了HibernateException异常");}return OKOrNot;}/** 下面的方法实现是直接使用TransactionTemplate 编程实现事务的控制**//*public boolean insertBBSTitleInfo(final BBSTitleInfoPO oneBBSTitleInfo) throws WebBBSException {oneBBSTitleInfoInClass=oneBBSTitleInfo;oneHibernateTemplate = new HibernateTemplate(this.sessionFactory);TransactionTemplate transactionTemplate =new TransactionTemplate(this.transactionManager);transactionTemplate.execute( new TransactionCallbackWithoutResult() {public void doInTransactionWithoutResult(TransactionStatus status) {oneHibernateTemplate.save(oneBBSTitleInfo);}});return true;}*//** 下面的方法实现是直接使用PlatformTransactionManager 编程实现事务的控制**/public boolean insertBBSTitleInfo(BBSTitleInfoPO oneBBSTitleInfo) throwsWebBBSException {boolean OKOrNot=false;oneHibernateTemplate = new HibernateTemplate(this.sessionFactory);DefaultTransactionDefinition def = new DefaultTransactionDefinition();def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);status = transactionManager.getTransaction(def);try {oneHibernateTemplate.save(oneBBSTitleInfo);mit(status);OKOrNot=true;}catch (HibernateException e){transactionManager.rollback(status); // 也可以执行status.setRollbackOnly();int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在BBSTitleInfoManageDAOSpringHibernateImple 类中的insertBBSTitleInfo方法出现了HibernateException异常");}return OKOrNot;}ArrayList allBBSInfoSByOneBBSTitle=null;public ArrayList getAllBBSInfoSByOneBBSTitle() {return allBBSInfoSByOneBBSTitle;}public BBSTitleInfoPO selectBBSTitleByBBSTitleID(int bbsTitleID) t hrows WebBBSException {BBSTitleInfoPO oneBBSTitleInfoPO=null;oneHibernateTemplate = new HibernateTemplate(this.sessionFactory);DefaultTransactionDefinition def = new DefaultTransactionDefinition();def.setPropagationBehavior(TransactionDefinition.PROPAGATION_SUPPORTS);status = transactionManager.getTransaction(def);oneBBSTitleInfoPO = (BBSTitleInfoPO) oneHibernateTemplate.get(BBSTitleInfoPO.class, new Integer(bbsTitleID));if(oneBBSTitleInfoPO==null){throw new WebBBSException("在数据库表中不存在指定bbsTitleID="+bbsTitleID+"的数据顶目!");}allBBSInfoSByOneBBSTitle=oneBBSTitleInfoPO.getBBSInfoSByBBSTitle(); //只能在同一Session中获得对应的O/R Mapping对象mit(status);}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在BBSTitleInfoManageDAOSpringHibernateImple 类中的selectBBSTitleByBBSTitleID方法出现了HibernateException异常");}return oneBBSTitleInfoPO;}public ArrayList<BBSTitleInfoPO> selectSomeBBSInfoTitle(String HQLSelect) throws WebBBSException {List selectResult = null;ArrayList allBBSTitleInfoPOs = new ArrayList();oneHibernateTemplate = new HibernateTemplate(this.sessionFactory);DefaultTransactionDefinition def = new DefaultTransactionDefinition();def.setPropagationBehavior(TransactionDefinition.PROPAGATION_SUPPORTS);status = transactionManager.getTransaction(def);/**原来的怎么办?query.setCacheable(true); //激活查询缓存(应该应用回调形式的DAO功能实现)*/selectResult=oneHibernateTemplate.find(HQLSelect);Iterator allBBSTitleInfoPOItem=selectResult.iterator();while(allBBSTitleInfoPOItem.hasNext()){BBSTitleInfoPO oneBBSTitleInfoPO=(BBSTitleInfoPO)allBBSTitleInfoPOItem.next();allBBSTitleInfoPOs.add(oneBBSTitleInfoPO);}mit(status);}catch (HibernateException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("在BBSTitleInfoManageDAOSpringHibernateImple 类中的selectSomeBBSInfoTitle方法出现了HibernateException异常");}return allBBSTitleInfoPOs;}public ArrayList<BBSTitleInfoPO> getAllBbsTitleInfos() throws WebBBSException{String HQLQuery="from com.px1987.webbbs.dao.BBSTitleInfoPO as oneBBSTitleInfoPO order by oneBBSTitleInfoPO.id desc";return selectSomeBBSInfoTitle(HQLQuery);}public int getBBSTitleInfoTotalCounter() throws WebBBSException {String HQLQuery="select count(*) from com.px1987.webbbs.dao.BBSTitleInfoPO";return getBBSTitleInfoTotalCounter(HQLQuery);}public int getBBSTitleInfoTotalCounter(final String HQLQuery) throws WebBBSException{ Long returnObjectCounter=null;try {oneHibernateTemplate = new HibernateTemplate(this.sessionFactory);DefaultTransactionDefinition def = new DefaultTransactionDefinition();def.setPropagationBehavior(TransactionDefinition.PROPAGATION_SUPPORTS);status = transactionManager.getTransaction(def);returnObjectCounter=(Long)oneHibernateTemplate.execute(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException {Query query = session.createQuery(HQLQuery);Long objectCounter=(Long)query.uniqueResult();mit(status);return objectCounter;}});}catch (DataAccessException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("BBSTitleInfoManageDAOSpringHibernateImple类中的updateOneAdminUserPassWord方法出现了DataAccessException异常");}return returnObjectCounter.intValue();}public boolean updateBBTitleCounterByBbsTitleID(int bbsTitleID,String bbsAuthorID,String bbsAuthorName) throws WebBBSException {Date nowDate=new Date();String todayDateString=(nowDate.getYear()+1900)+"-"+(nowDate.getMonth()+1)+"-"+nowDate.getDate();final String HQLQueryInClass="update com.px1987.webbbs.dao.BBSTitleInfoPO asoneBBSTitleInfoPO set oneBBSTitleInfoPO.totalTopicNumber=oneBBSTitleInfoPO.totalTopicNumber+1"+",oneBBSTitleInfoPO.todayTopicNumber=oneBBSTitleInfoPO.todayTopicNumber+1,"+"stSendTime='"+todayDateString+"',"+"stTopicAuthor='"+bbsAuthorName+"'"+" where oneBBSTitleInfoPO.id="+bbsTitleID+" anderID='"+bbsAuthorID+"'";Boolean OKOrNotBoolean=new Boolean(false);oneHibernateTemplate = new HibernateTemplate(this.sessionFactory);DefaultTransactionDefinition def = new DefaultTransactionDefinition();def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);status = transactionManager.getTransaction(def);try{OKOrNotBoolean=(Boolean)oneHibernateTemplate.execute(new HibernateCallback(){public Object doInHibernate(Session session) throws HibernateException {Query query = session.createQuery(HQLQueryInClass);query.executeUpdate();mit(status);return new Boolean(true);}});}catch (DataAccessException e){int logImpleKind=Integer.parseInt(ClassNameConfig.getProperty("logImpleKind"));this.addObserver(LogInfoFactory.newLogInstance(logImpleKind));this.setChanged(); //注意要设置变化点notifyObservers(e); //当出现异常时将通知各个观察者throw new WebBBSException("BBSTitleInfoManageDAOSpringHibernateImple类中的updateOneAdminUserPassWord方法出现了DataAccessException异常");}return OKOrNotBoolean.booleanValue();}}3、关于事务的应用问题在开发以数据库为平台的系统中,单用户操作的系统越来越少了,基本上都是多用户操作,并发访问数据库。
BBS 论坛开发详细设计[前言:]在2011年10月28日, 16:24:15 我开始开发BBS论坛。
开始时准备了很多所需的图片素材。
项目是2012-02-13完成的。
记下这个开发中学到的东西。
[正文:]系统分为前台功能和后台管理。
[代码分析:]首页index.jsp 。
下图是首页的组成图:页面头上的欢迎信息和页面底部的开发商信息在前台每个网页上都是一样的。
所以后面不再介绍了。
后面基本页面发生改都是在中间部分发生变化。
首页欢迎,使用JavaScript获取当前的时间,且每200ms更新一次。
JavaScript代码如下:在网页加载时就执行该JavaScript函数用户登入是典型的Sturct2 的应用。
用户登入信息请求通过<s:from>表单发送的dologin.action。
dologin.action。
根据struts.xml 配置文件跳转页面。
<s:from>请求如下:dologin.action。
如下:struts.xml配置如下:这是使用struts2最基本也是最经典的方式。
后面的差不多是这种。
在写Index.jsp页面的时候还学到2点,1 学会了使用<s;if>标签。
2 学会了如何从Struct栈中取值。
怎么取的session中的值:代码如下:3:自定义标签发现了自定义标签的好处,使用自定义标签,可以很多需要在JSP 页面写的代码都在标签文件中写好,这样就很好的把代码和标签分离。
我想这也是struts2定义那么多标签的原因吧。
自定义标签的方法如下:DisplayTag.java标签文件app.tld 标签配置文件在web.xml文件中配置用户注册register.jsp模式和index.jsp类似不过在这里使用了<s:radio> 和<s:select>标签发帖:newtopic.jsp使用的还是Sturct2的经典模式,不再重复。
科 技 天 地86INTELLIGENCE························维护机制,最终实现证券公司监管中的信息系统应用价值。
其次要从具体业务入手的小型监管软件应用,与证券公司的应用系统衔接建设监管信息系统。
建设监管信息系统,从具体证券业务入手,注意建立证券信息平台, 以客户为中心的新一代信息系统,整合公司的资源,提高公司的核心竞争力。
证券公司集中交易系统其组成主要是由数据库服务器、应用服务器、通讯平台和集中经纪业务系统客户端等四部分组成,有利于降低证券公司交易代理成本和总部加强监管,防范风险,更有利于创建信息化的基础平台,就与证券公司的应用系统衔接建设监管信息系统来说,要注意证券公司的信息系统研究者和证券公司结合,使信息系统在证券公司监管中应用价值提高,实现数据采集的自动化,避免干扰。
再次是建立证券信息维护机制。
证券信息系统的开发设计固然重要,但如果没有完善的维护机制,我想这个信息系统的作用肯定要降低不少。
一套完整的证券信息维护机制与信息系统本身一样重要。
监管信息系统开发应用的关键是深入实际总结经验,同时也结合证券公司监管人员和证券公司信息系统应用的实际需要。
证券信息的维护机制建立首先是信息提供方通过校验保证信息数据的真实,实现证券信息资源完整和共享,另外证券信息监管部人员要保障证券信息系统的运行,各项功能正常发挥作用,还要做到监管工作人员正确使用证券信息系统,同时要认真的做好信息维护。
最后是充分实现信息资源共享。
信息资源实现充分共享,这样既可以提高工作人员的工作效率,也可以避免浪费时间,又能保护证券投资者的切身利益。
但是,目前由于证券信息监管部门要求不一致,往往导致不能资源共享,出现不同的结果只能说明资源调取有问题,另外我们也要多从机制上也应该加以认真分析。
jsp论坛系统课程设计一、教学目标本课程旨在让学生掌握JSP论坛系统的基本原理、开发方法和实际应用。
通过本课程的学习,学生应能理解并运用JSP技术进行论坛系统的开发,具备一定的编程能力和问题解决能力。
同时,通过课程学习,培养学生的团队协作精神、创新意识和终身学习的理念。
具体来说,知识目标包括:1.掌握JSP的基本语法和指令。
2.理解JSP的内置对象和生命周期。
3.熟悉JSP与JavaBean的交互方式。
4.了解论坛系统的原理和架构。
技能目标包括:1.能够使用JSP技术编写简单的论坛页面。
2.能够运用JavaBean处理论坛数据。
3.能够使用数据库存储和管理论坛数据。
4.能够分析和解决论坛系统开发中的问题。
情感态度价值观目标包括:1.培养学生的团队协作能力和沟通技巧。
2.培养学生的创新意识和自主学习能力。
3.培养学生关注社会热点,运用所学知识解决实际问题的意识。
二、教学内容本课程的教学内容主要包括JSP基础知识、JSP与JavaBean的交互、数据库操作以及论坛系统的实际应用。
1.JSP基础知识:–JSP概述和基本语法–JSP内置对象和生命周期–JSP指令和脚本语言2.JSP与JavaBean的交互:–JavaBean的基本概念–JSP与JavaBean的调用方式–常用JavaBean技术及其在论坛系统中的应用3.数据库操作:–数据库基本概念和SQL语言–JSP与数据库的连接方式–论坛数据表设计和数据库操作4.论坛系统的实际应用:–论坛系统原理和架构–论坛模块划分和功能实现–论坛系统测试和优化三、教学方法本课程采用讲授法、案例分析法、实验法和讨论法等多种教学方法,以激发学生的学习兴趣和主动性。
1.讲授法:用于讲解JSP基础知识、JavaBean技术和数据库操作等理论内容。
2.案例分析法:通过分析实际论坛系统案例,让学生掌握JSP技术的应用。
3.实验法:安排实验室实践,让学生动手编写JSP代码和开发论坛系统。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——实现项目中的数据库连接组件及对应的单元测试用例(第2/4部分)1.1.1应用Struts DataSource为项目中的数据库提供数据库连接池功能1、在Eclipse开发工具中配置出数据库连接池(DataSource)Key:webDataSourceType:mons.dbcp.BasicDataSourceDriver Class:net.sourceforge.jtds.jdbc.DriverURL:jdbc:jtds:sqlserver://127.0.0.1:1433/BBSDataBaseUser:saPassWord:1234Min Count:10Max Count:10将产生出下面的DataSource的配置项目<data-source key="webDataSource"type="mons.dbcp.BasicDataSource"><set-property property="password" value="1234" /><set-property property="minCount" value="10" /> <!- - 没有该属性项目- -> <set-property property="maxCount" value="10" /><set-property property="user" value="sa" /><set-property property="driverClass"value="net.sourceforge.jtds.jdbc.Driver" /><set-property property="url"value="jdbc:jtds:sqlserver://127.0.0.1:1433/BBSDataBase" /> <set-property property="readOnly" value="false" /><set-property property="autoCommit" value="true" /></data-source>正确的项目如下:<data-source key="webDataSource"type="mons.dbcp.BasicDataSource"><set-property property="password" value="1234" /><set-property property="maxActive" value="10" /><set-property property="username" value="sa" /><set-property property="driverClassName"value="net.sourceforge.jtds.jdbc.Driver" /><set-property property="url"value="jdbc:jtds:sqlserver://127.0.0.1:1433/BBSDataBase" /><set-property property="defaultReadOnly" value="false" /><set-property property="defaultAutoCommit" value="true" /></data-source>2、在Action类中获得该DataSource数据库连接对象1.1.2应用DBCP组件为系统提供数据库连接池功能(优化数据库连接,并体验面向接口编程所带来的优点)1、JDBC直接连接的主要问题是什么?什么是数据库连接池(Pool)的连接?----缓存已经存在的数据库连接对象,为什么要应用?数据库连接池(Connection Pool)池是一个很普遍的概念,和缓冲存储有机制相近的地方,都是缩减了访问的环节,但它更注重于资源的共享。
基于J2EE Struts框架的课程设计实训项目《BBS论坛系统》系统概要设计说明书(第1/2部分)文档信息目录第一章引言 (4)1.1编写目的 (4)1.2背景 (4)1.3定义 (5)1.4参考资料 (5)第二章总体设计中的系统架构设计 (6)2.1需求规定 (6)2.2运行环境 (6)2.3基本设计概念和处理流程 (7)2.4 系统结构设计——系统各个组件设计 (13)第三章系统数据结构设计............................................................................. 错误!未定义书签。
3.1数据库逻辑结构设计......................................................................... 错误!未定义书签。
3.2系统数据库物理结构设计................................................................. 错误!未定义书签。
第四章系统出错处理设计............................................................................. 错误!未定义书签。
4.1出错信息............................................................................................. 错误!未定义书签。
4.2补救措施............................................................................................. 错误!未定义书签。
4.3系统维护设计..................................................................................... 错误!未定义书签。
基于J2EE Struts框架的课程设计实训项目——《BBS论坛系统》——应用Introduction Advice拦截器组件技术实现动态地扩展业务处理方法1.1.1在项目中的业务层组件中应用Introduction Advice拦截器组件技术——对BBSInfoManageInterface接口中的doSaveBBSInfo进行功能扩展1、增加一个新的功能所应该完成的功能接口BBSInfoManage Extends Interface(1)接口名称为BBSInfoManage Extends Interface,包名称为com.px1987.webbbs.model(2)设计该接口package com.px1987.webbbs.model;import com.px1987.webbbs.exception.WebBBSException;public interface BBSInfoManageExtendsInterface {public boolean doExtendsSaveBBSInfo(BBSInfoVO oneBBSInfo) throws WebBBSException;}该接口是对原来的doSaveBBSInfo方法进行功能扩展2、增加一个Introduction Advice类(以某种形式的Interceptor出现)(1)名称为BBSInfoManage IntroductionAdvice,包名称为com.px1987.webbbs.aop 该Introduction Advice类实现上面的BBSInfoManageExtendsInterface接口,并继承org.springframework.aop.support.DelegatingIntroductionInterceptor类,(2)编程BBSInfoManage IntroductionAdvice类中的相关功能实现方法注意:1)org.springframework.aop.support.DelegatingIntroductionInterceptor 是对IntroductionInterceptor接口的实现类2)DelegatingIntroductionInterceptor的设计是将introduction委托到真正实现introduction接口的接口,隐藏完成这些工作的拦截器。
目录绪论 (1)第1章专题论坛系统开发背景及意义 (2)1.1系统开发背景 (2)1.2系统开发意义 (3)第2章专题论坛系统需求分析 (4)2.1现状分析 (4)2.2可行性分析 (4)2.2.1经济可行性 (4)2.2.2技术可行性 (4)2.3设计目标 (5)2.4功能要求 (5)2.5平台选择 (5)2.6系统开发工具 (6)2.6.1开发语言—JSP(Java Server Page) (6)2.6.2数据库—MySQL5.0 (7)第3章专题论坛系统设计 (8)3.1数据库设计 (8)3.1.1数据库需求分析 (8)3.1.2数据库概念结构设计 (10)3.1.3数据库逻辑结构设计 (11)3.2系统结构设计 (15)3.2.1页面模块化设计 (15)3.2.2 MVC模式设计(Jsp+Servlet+JavaBean) (16)第4章专题论坛系统实现 (18)4.1系统各部分的实现方法 (18)4.1.1创建与数据库的连接 (18)4.1.2访问数据库的JavaBean (19)4.1.3用户及管理员登录模块页面 (20)4.1.4系统首页模块页面 (22)4.1.5会员注册模块的实现页面 (24)第5章系统测试与评价分析 (26)5.1测试环境简介 (26)5.2系统各模块的测试 (26)5.2.1管理界面测试 (26)5.2.2其它管理模块测试 (26)5.3系统的评价分析 (26)5.4系统的不足与展望 (27)结束语 (28)致谢 (29)参考文献 (30)绪论自我国正式进入互联网时代以来,短短的几年时光互联网在我国得到了飞速的发展。
目前它已经成为全球性信息传输的重要途径之一,并被喻为信息高速公路。
这不仅表现在互联网的基础设施方面,也表现在互联网的用户人数、互联网在各行各业的广泛应用等各个方面。
现实生活中的交流存在时间和空间上的局限性,交流人群范围狭小以及间断的交流不能保证信息的准确性和可取性。
《JSP基础教程》课程设计
BBS论坛系统
目录
1.功能需求 (3)
2.框架规划 (3)
2.1划分模块 (3)
1)用户注册模块 (3)
2)用户登录模块 (3)
3)信息显示模块 (4)
4)信息操作模块 (4)
5)用户管理模块 (4)
6)数据库模块 (4)
2.2模块之间的关系 (4)
2.3制定页面流程 (5)
3.数据库设计 (6)
3.1设计数据表的结构 (6)
4.各单位模块设计 (7)
4.1用户注册登陆功能 (7)
4.2 用户发贴与回复功能 (7)
4.3 管理员管理帖子与用户管理功能 (9)
5.个人心得 (10)
BBS论坛系统的设计与实现
1.功能需求
本系统根据论坛系统的需要,以实现交流信息的一个平台。
在这个BBS论坛系统中友三类用户,普通用户、版主和管理员。
普通用户具有的功能如下:
✓用户注册
✓分页查看所有主题文章列表
✓发表主题文章
✓回复文章
✓查看主题文章和回复文章的详细内容
✓对自己发表或回复的文章进行修改或者删除
版主具有的功能如下:
✓具有普通用户的所有功能
✓对本讨论区的所有文章可以修改或删除
管理员具有的功能如下:
✓具有普通用户的所有功能
✓对所有版面的所有文章可以修改和删除
✓用户管理功能,包括修改用户的个人信息或删除用户
2.框架规划
2.1划分模块
这个BBS论坛系统设计由6个基本模块所组成:
1)用户注册模块
这个模块完成新用户的注册功能,并能对新用户的注册信息进行差错检验。
包含的文件有:
新用户注册表单页面:register.jsp
验证注册信息并将注册信息存入数据库的页面:
chkregister.jsp
2)用户登录模块
这个模块提供用户的登录界面,并验证用户名和密码,以确认用户身份。
包含的文件有:
用户登录页面(论坛的主页面):index.html
验证登录信息的页面:chklogin.jsp
3)信息显示模块
这个模块显示论坛的所有讨论区、各讨论区中所有主题文章、主题文章和回复文章的详细内容。
包含的文件有:
显示所有讨论区列表的页面:listboard.jsp
各讨论区中所有主题文章的分显示页面:listarticle.jsp
显示主题文章和回复文章详细内容的页面:logout.jsp
4)信息操作模块
这个模块提供发表主题文章、回复文章、修改文章以及修改删除文章的功能,并且对不同身份的用户给予不同的操作权限。
包含的文件有:
发表主题文章或回复主题文章的页面:post.jsp
修改主题文章或回复主题文章的页面:modify.jsp
验证文章的合法性并将文章信息存入数据库的页面:chktodb.jsp
删除文章的页面:delete.jsp
5)用户管理模块
这个模块能够对用户个人信息进行管理,可以设置某用户为版主或删除某用户。
包含的文件有:
显示用户列表的页面:manage.jsp
修改用户个人信息的页面:mdfuser.jsp
将修改后的用户信息存入数据库或删除用户:magtodb.jsp
6)数据库模块
这个模块实现通过JDBC-ODBC的技术队Access数据库的连接和访问。
包含的文件有:
连接数据库的JavaBean:DBConn.java
数据库连接池的JavaBean:ConnPool.java
2.2模块之间的关系
数据库模块是这个系统中最重要的一个模块,所有jsp页面的编写都是围绕数据库的操作展开的。
用户注册模块将用户提交的个人信息存储到数据库之中,通过用户登录模块可以进入信息显示模块、信息操作模块、用户管理模块。
这几个模块之间的关系可以用下图来表示:
2.3制定页面流程页面流程图如下图所示:
3.数据库设计
这个BBS论坛系统使用Microsoft Acess作为数据库。
3.1设计数据表的结构
分两条线索来组织系统所要用到的数据:一条线索是用户的个人信息,另一条线索是文章的相关信息。
这两张表分别为:
用户表Users:保存用户个人信息,如:用户名、密码、用户的身份等级、用户的头像等等。
文章表Articles:保存主题文章或回复文章的详细信息,如文章的标题、具体内容、发表时间、回复文章的篇数等等。
4.各单位模块设计
4.1用户注册登陆功能
此部分是实现用户的注册功能。
通过填写注册资料,正确填写后,点击注册按钮后便可注册成为正式的会员。
如果密码输入错误会出现如下页面。
4.2 用户发贴与回复功能
此部分实现会员的发表新帖以及回帖等功能。
发表帖子会员只针对会员开放,如果想发表新的主题,必须登陆如果没有账号必须注册以后便可直接点击发表帖子按钮。
进到发表帖子页面后,首先要写自
己想发表的主题,然后填写作者和正文。
如果没有登陆直接点击发表主题,则会直接跳到用户登陆页面。
发布新帖子的页面如下图
显示发布帖子的页面如下图
论坛栏目页面如下图
话题栏页面如下图
4.3 管理员管理帖子与用户管理功能
此部分主要是管理员对论坛的帖子和会员进行综合管理,删除、编辑、查询、等等。
普通会员是不可以进行此操作的。
非法管理如下图所示
管理员管理用户页面如下图
用户修改个人信息页面如下图
用户退出论坛页面如下图
5.个人心得
在此次课程设计——BBS论坛系统中主要负责用户登录注册的相关代码编写和测试完善处理工作。
用户登录模块是防止非法用户登陆的第一道防线,通过它可以保护后台数据库的安全性,当用户要进行发贴或回复时,首先要进入的就是身份验证界面,只有在密码正确的情况下才能进行以后的操作,如果输入的密码不正确,则不能进行发表新帖和回复。
如果用户以浏览者的身份进入网站,则只能进行一般的帖子浏览和搜索,而不能发表新帖和回复,在点击发表新帖后,系统会判断该用户是否是登录用户,如果不是则进入登录页面,如果是第一次登录,请先注册。
用户注册时,提交信息之后,系统开始判断用户的注册信息是否有效,首先
是用户名是否为空,用户输入的两次密码是否一致,然后依次往后判断用户所填写的各项信息是否符合要求,直到所有信息均正确无误,系统将该用户注册信息写入用户表Users,并提示用户注册成功。
就可以进行其它有效的操作了。
通过这次课程设计,我从中学到了许多新的知识,培养了我综合多门学科中的知识、迅速规划并开发出目标系统的能力,以及编程能力也有了很大的提高。
另外也有许多心得体会,所谓系统开发如人生百味,酸甜苦辣皆有之。
我们小组三人在开始实现这个论坛系统时进行了人员分工,在设计的过程中,我们深深的体会到了团队合作的重要性。