本科生毕业论文(设计)
题目(中文): 基于JSP的BBS论坛管理系统
(英文): BBS Forum Management System
Based on Jsp
学生姓名: 学 号: 系 别: 专 业: 指导教师: 起止日期:
年 月 日
目 录
摘 要 ........................................................... 1 关键词 .......................................................... 1 Abstract ........................................................ 1 Keywords ........................................................ 2 前 言 ........................................................... 2 1 系统技术及运行环境 ................................................ 3
1.1 JSP技术简介 ................................................. 3 1.2 JAVABEAN技术简介 ............................................ 4 1.3 JDBC技术简介 ................................................ 4 1.4 TOMCAT技术简介 .............................................. 5 1.5运行环境 ..................................................... 5 2 需求分析 .......................................................... 6
2.1 编写目的 .................................................... 6 2.2 任务目标 .................................................... 6
2.2.1基本性能 ............................................... 6 2.2.2开发目标 ............................................... 7 2.2.3 应用目标 ............................................... 7 2.3选择编程语言 ................................................. 7
2.3.1 JSP与ASP的比较 ....................................... 7 2.3.2 JSP的特点与优点 ....................................... 8
3系统设计 ......................................................... 10
3.1系统设计思想 ................................................ 10
3.1.1 网上论坛系统说明 ...................................... 10 3.1.2 网上论坛系统总体分析 .................................. 10 3.2 数据库设计思想 ............................................. 11 3.3 各单元模块设计 ............................................. 13
3.3.1用户注册登陆功能 ...................................... 13 3.3.2会员发贴与回复功能 .................................... 14 3.3.3管理员管理帖子与用户管理功能 .......................... 15
4 编码实现 ......................................................... 17
4.1 功能总体说明 ............................................... 17
4.1.1 功能总体说明 .......................................... 17 4.1.2主要功能流程 .......................................... 18 4.2各个功能模块的实现 .......................................... 18
4.2.1数据库的连接 .......................................... 18 4.2.2用户登陆与注册模块的实现 .............................. 20 4.2.3分页显示的功能实现 .................................... 24 4.2.4 发表与回复功能模块实现 ................................ 25 4.2.5后台管理模块的实现 .................................... 28
5 系统测试 ......................................................... 32 总 结 .............................................................. 33
2
参考文献 ........................................................... 34 致 谢 .............................................................. 35
3
基于JSP的BBS论坛管理系统
摘 要
为了方便信息的交流,在结合动态服务网页(JSP)和MYSQL 技术之下开发了这个快截、界面友好的网上交流系统。论坛使用动态服务网页(JSP)技术建设论坛的骨干框架,使用MYSQL制作系统的数据库,实现了一个功能相对齐全的论坛系统,网友可以自由地提出问题以及帮助他人解决问题,或者交流经验。 该论坛功能较齐全,在这里可以自由地发表自己的观点和对论坛的主题发表意见,我们还可以对网友的问题及时地解决,获取对自己有用的知识。该论坛还有一些特殊的功能,强大的搜索功能等。
关键词
动态服务网页;论坛;用户管理
BBS forum Management System Based on JSP
Abstract
In order to facilitate people information the exchange, in unified JSP and MYSQL under the server technology has developed this quick truncation, the contact surface friendly system. The system use the JSP technology construction the main frame, use MYSQL as the systems database, realized a forum system which function relatively completely, the net friend has been possible freely to propose the question as well as helped other people to solve the problem, or exchange experience.
This forum function is complete, everyone may freely express his viewpoint in here and express the opinion to the subject, we also may promptly solve to net friend's question, and gain the useful knowledge from there. This forum also has some special functions, for example the power search function.
1
Keywords
Java Server Pages; BBS; user management
前 言
Internet是目前世界上最大的计算机互联网络,它遍布全球,将世界各地各种规模的网络连接成一个整体。作为Internet上一种先进的,易于被人们所接受的信息检索手段,World Wide Web(简称WWW)发展十分迅速,成为目前世界上最大的信息资源宝库。据估计,目前Internet上已有上百万个Web站点,其内容范围跨越了教育科研、文化事业、金融、商业、新闻出版、娱乐、体育等各个领域,其用户群十分庞大,因此,建设一个好的Web站点对于一个机构的发展十分重要。近年来,随着网络用户要求的不断提高及计算机科学的迅速发展,特别是数据库技术在Internet中的广泛应用,Web站点向用户提供的服务将越来越丰富,越来越人性化。
我们发现这样一个事实,一个用户在访问一个网站时一般来讲只对该网站的部分内容感性趣,而且这种兴趣会持续一段时间。这点启发了我们,如果能根据用户的喜好为不同的用户显示其个性化的页面,即着重显示该用户感兴趣的内容,将为用户节约大量的检索时间,而且这样的网页显然是更具有吸引力的。一些站点已经在这方面做出了一定的尝试,通常采用的方法是,在用户登陆时为其提供一系列的选项,使用户能够对站点进行一些自主的设置。这样做能够使站点呈现一定程度的个性化,但是对用户来讲,还是比较烦琐,而且在用户
2
了解一个站点前让其对站点进行设置,其结果未免有些粗糙。于是我们构想了这样一种方案,对用户登陆后的动作进行跟踪,分析,发掘用户点击的规律,即用户先后点击的关联规则,这样,在用户点击一个主题(链接)之后,系统能够自动生成一个页面,其中包含了该主题下用户经常关注的内容(若干链接),这样便在无须用户做出任何额外工作的情况下实现了为用户量身订做的个性化页面。
要实现这样的功能,离不开后台数据库的支持。用户验证信息,收集到的用户点击信息,主题层次信息,分析得出的关联规则表等大量的数据都由数据库管理系统管理。本文中数据库服务器端采用了MYSQL数据库并以先进的JDBC技术进行数据库存取等操作,使Web与数据库紧密联系起来。
本文作者主要完成Web服务器端的用户管理、帖子管理、数据库管理、浏览和查找功能等设计、实现与完善以及整个实验网站的组织建立和测试工作。 1 系统技术及运行环境 1.1 JSP技术简介
JSP是服务器端的脚本语言,是以SERVLET为基础开发而成的动
态网页生成技术,它的底层实现是JAVA SERVLET。
JSP(JAVA SERVER PAGES)由HTML代码和潜入其中的JAVA
代码所组成。服务器在页面被客户端请求以后对这些代码进行处理,然后将生产的HTML页面返回客户端的浏览器
3
JSP的特点是面向对象、 跨平台、 和SERVLET一样稳定、 可
以使用SERVLET提供的API,同时克服了SERVLET的缺点。
在使用JSP时一般和JAVABEANS结合使用,从而将界面表现和
业务逻辑分离。 1.2 JAVABEAN技术简介
JAVABEAN是基于JAVA的组建模型,有点类似于MICROSOFT的COM组建。
在JAVA平台中,可以无限扩充JAVA程序的功能,通过
JAVABEAN的组合可以快速生产新的应用程序。
对于程序员来说,最好的一点就是JAVABEAN可以实现代码的重
复利用,另外对于程序的易维护性等等也有很重大的意义。
JAVABEAN 通过JAVA虚拟机(JAVA VIRTUAL MACHINE)执
行,运行JAVABEAN最小的需求是JDK1.1或者以上的版本。
JAVABEAN传统的应用在于可视化的领域,如AWT下的应用。
自从JSP诞生后,JAVABEAN更多的应用在了非可视化领域,在服务器端应用方面表现出了越来越强的生命力。 1.3 JDBC技术简介
JDBC是一组API,定义了用来访问数据库源的标准JAVA类库,
使用这种类库可以使用一种标准的方法、方便地访问数据库资源。
JDBC的目标是使应用程序开发人员使用JDBC可以连接任何提
4
供了JDBC驱动程序的数据库系统,这样就使得程序员无须对特定的数据库的特点有过多的了解,从而大大简化了和加快了开发过程。
JDBC API 为访问不同的数据库提供了一种统一途径,像ODBC
一样,JDBC为开发者屏蔽了一些细节问题。
另外,JDBC对数据库的访问也具有平台无关性。
1.4 TOMCAT技术简介
在已JAVA技术为的WEB开发领域中,TAMCAT是许多JAVA程
序员相当喜爱的开放源代码产品,它附属在APACHE SOFTWARE FOUNDATION 所主导的JAKART项目内。由于TAMCT是SERVLET与JSP技术的参考实现(REFERNCE IMPLEMENTATION), 所以它不但可以当作的WEB服务器,也可以结合其它的WEB服务器,只担任SERVLET容器或JSP容器的角色。 1.5运行环境
为了保证BBS论坛管理系统运行的高效性和可靠性,服务器应具有较高的软硬件配置,客户端的要求不是很高。此应用程序可广泛运行于国际互联网即Internet,也可适用于内部的局域网。其运行要求如下: 软件环境:
客户端: Windows95/98/2000/XP,Internet Explorer(IE)等。 服务器端:Windows NT/Windows2000,Tomcat 5.0,JDK 1.5及其以上
5
版本,IE等;
数据库:采用MYSQL,运行于服务器端。 硬件环境:
服务器 CPU:PIII 500以上 ,内存:512M以上。 客户机 CPU:P200MMX以上,内存:32M以上。 2 需求分析 2.1 编写目的
当今网络技术逐渐渗入社会生活各个层面,以前网站上的论坛管理系统要用户登陆以后才能进行相关访问及互动。而随着网络互联技术的进步,现在网站投票只需打开网页就可进行论坛留言。论坛对象是很多的,各个层次都可进行论坛访问,大至国家领导,小至一个普通干部,访问和留言从到指定用户进行表格到现在通过网络直接点击相应就可进行。网上论坛管理系统可解决游客访问及留言,致使现在几乎各个网站都有各种类型网站论坛管理系统,用户可选择自己的看法。所以我提出了本课题的研究。 2.2 任务目标 2.2.1基本性能
系统包括主要的功能:新用户的注册,会员登录,管理员删除用户,管理员删除帖子和修改帖子,查询主题,和查询用户这些功能,游客浏览留言,会员新增主题,会员留言回复,查询主题这些功能,
6
可以满足一般的用户需要。 2.2.2开发目标
这个系统预期的目的是为了做成交互式的网页,方便客户端和浏览器端之间的交流。通过论坛,人们能够相互交流沟通,把疑惑在论坛里公布,大家献计献策,共同学习,共同进步。 2.2.3 应用目标
网上论坛系统是一个会员登录留言系统。网上游客能够浏览论坛上的帖子,并且能够注册成为用户。论坛注册会员能够发表帖子,让大家积极参与讨论。论坛管理员能够便于管理论坛,包括浏览游客留言,审核留言,对于不健康或是不利于社会稳定的留言能进行删除操作。
2.3选择编程语言 2.3.1 JSP与ASP的比较
总的来讲Java Server Page(JSP)技术和Microsoft 公司提供的Active Server Pages(ASP)技术在技术方面有许多相似之处:两者都是基于WEB应用实现动态交互网页制作提供技术环境支持。两者都能为程序开发人员提供实现应用程序的编制与自带组建设计网页从逻辑上分离的技术。而且两者都能替代CGI使网站建设与发展变得较为简单与快捷。
7
1).相同之处
都是运行于服务器端的脚本语言,两者都是动态网页生成技术,这两项技术都是由HTML来决定网页的版面,都是在HTML代码中混合某种代码,有语言引擎解释执行程序代码。HTML主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑。 2).不同之处
JSP是由SUN公司推出的一项技术,是基于JavaServlet 以及整个JAVA体系的WEB开发技术,利用这项技术可以建立先进、安全和跨平台的动态网站。ASP是MS公司推出的技术只能在MS的平台上运行,无法实现跨平台,也无安全性保障。
ASP下的编辑语言是VBScript 之类的脚本语言,而JSP使用的是JAVA。
ASP与JSP还有一个更为本质的区别:两种语言引擎用完全不一样的方式来处理也面中潜入的程序代码。在ASP下,VBScript代码被ASP引擎解释执行。在JSP中,代码被编译生产Servlet并有JAVA虚礼机执行,这种也面仅在对JSP也面的第一次请求时发生。 2.3.2 JSP的特点与优点
综合而言,JSP技术具有下面的特点: 1)write once run anywhere
JSP技术继承了JAVA先天性的先进概念“write once run anywhere”这种概念正越来越深远的影响着互连网行业的交互式、WEB设计的
8
理念。JSP Pages 可以非常容易的开平台跨WEB服务器软件来是设计和开放源代码。 2)支持多种动态网页格式
目前对使用JSP技术设计出来的网页应该采取什么样的格式还没有一个明确的标准。一般来说JSP技术即可以支持HTML/DHTML的传统浏览器文件格式,又可以支持应用与无线通讯设备例如移动电话、PDA等设备进行网页浏览器的VML文件格式,还可以支持其它一些B2B应用的XML格式。与以往的其它WEB应用技术相比较JSP技术有它很鲜明的特点。 3)JSP 标签可扩冲性
尽管JSP与ASP都使用标签与脚本技术来制造动态WEB网页,但是JSP技术能够使开发者扩展JSP标签,使得应用JSP的开发者能定制标签库所以网页制作者可以充分利用与XML兼容的标签技术,大大减少了对脚本语言的依赖。由于指定标签库技术使得网页制作者降低了制作网页和想多个网页扩充关键功能的复杂程度。 4)JSP跨平台的可重用性
JSP的开发人员在开发过程中一直关注可重用性,JSP足见、企业JavaBean或制定的标签都是跨平台可重用的。企业JavaBean可以访问传统的数据库并能并能已分布式系统模式工作于UNIX和WINDOWS平台,JSP标签可扩充功能为开发人员提供简便的与XML兼容的接口,即共享网页的打包功能使其完全的工业标准化。这种基于组建的模式能够有效的提高应用程序的开发效率。因为这种模式能
9
够使开发人员利用快捷的子组建快速创建模板应用程序。然后再整和一些附加功能将其打包成一个JAVABEAN组建。 5)易于维护性
基于JSP技术的应用程序比基于ASP的应用程序更易于维护和管理。脚本语言都很好服务于小的应用程序但不能适宜大型的复杂的应用程序,因为JAVA是结构化的,它比较比较容易创建和维护庞大的组建化的应用程序。 3系统设计
3.1系统设计思想 3.1.1 网上论坛系统说明
此网上论坛中三种不同角色游客、注册用户管理员分别可现: 游 客:查看帖子、注册新用户。
注册用户:查看帖子、发新帖子、回复信息、查询主帖。 管理员:帖子管理、用户管理、数据库管理。 3.1.2 网上论坛系统总体分析
通过上面的功能说明,我们可以将论坛的制作分为四大部分: (1) 会员注册和登陆模块:
这个模块的功能,就是新来网友可以填写注册资料 ,通过审核后便成为本论坛的正式会员,并可以以会员身份登陆论坛。 (2) 文章显示模块:
10
显示所有会员最新发表的一些文章主题。 (3) 发表文章模块:
为会员提供发表文章的地方,以及回复主题等。 (4) 论坛与用户管理模块:
版主以上职务可以进行对文章和用户进行处理,查询,修改,删除等。了解了具体的功能需求后,就可以按模块的开始论坛的设计了。当然,这些模块的只是在功能上对论坛结构的划分,实际上并不能够完全的把他们出来进行设计。对于这种较小的应用,也没有必要进行完全的模块化设计,在良好的规划下直接写程序代码或许来的更为简单一些。 3.2 数据库设计思想
在建设网站系统之前,我们必须对系统所用到的数据进行大致的分类和具体的结构设计,既要做到清晰明了,又要能适应系统各项功能的调用,而不至于产生结构上的逻辑混乱,保证关键数据在意外情况下不会被破坏,可以说数据库是系统的重中之重。
数据库设计要遵循一些规则,一个好的数据库满足一些严格的约束和要求。尽量分离各实体对应的表,一个实体对应一个表,分析该实体有哪些属性,对应有些什么字段,以及各实体之间的联系。实体、属性与联系是进行概念设计时要考虑的三个元素,也是一个好的数据库设计的核心。
从实际出发,经过仔细地设计,得到各表的设计如表3.1——3.3
11
所示。
表3.1 帖子信息表article
字段 id pid Rootid Title Writer cont pdate 字段名 编号 父亲编号 孩子编号 标题 作者 内容 发贴日期 类型 Aotu_increment INT INT varchar varchar varchar 日期型 宽度 一 11 11 50 20 250 一 小数位 一 一 一 一 一 一 一 索引 是 一 一 一 一 一 一 可否为空 否 否 否 一 一 一 一
表3.2 用户信息表user 字段 id name password sex email 字段名 会员编号 会员姓名 会员密码 会员性别 会员邮箱 类型 Aotu_increment varchar varchar varchar varchar 宽度 一 32 14 2 20 小数位 一 一 一 一 一 索引 是 一 一 一 一 可否为空 一 一 否 否 一
表3.3管理员信息表adminuse
字段 字段名 类型 宽度 小数位 索引 可否为空 12
id name password 会员编号 会员姓名 会员密码 Aotu_increment varchar varchar 一 32 14 一 一 一 是 一 一 一 一 否 3.3 各单元模块设计 3.3.1用户注册登陆功能
此部分是实现用户的注册功能。通过填写注册资料,正确填写后,点击注册按钮后便可注册成为正式的会员。如图3.1
图3.1 注册
用户资料填写正确就可以注册了。而且对其用正则表达式做了一些。用户名只能是3-12位单字字符,而且不允许注册重复的用户名。性别只能选择男或女其中一个。密码最多不能超过12位,两次密码必须输入一致,否则不可以注册。E-mail必须输入有效的邮箱地址,以便日后能使用到论文的各种功能。只要用户按照出现提示信息输入进去就可以了。用户注册成功后就可以使用会员所拥有的一切功能了。
13
3.3.2会员发贴与回复功能
此部分实现会员的发表新帖以及回帖等功能。
发表帖子会员只针对会员开放,如果想发表新的主题,必须登陆如果没有账号必须注册以后便可直接点击发表帖子按钮。进到发表帖子页面后,首先要写自己想发表的主题,然后填写作者和正文。如果没有登陆直接点击发表主题,则会直接跳到用户登陆页面。
发表主题如图3.2所示:
图3.2 发表新贴
回复主题界面 如图 3.3所示:
14
图3.3 回复主题
发表成功回到显示主题页面 再点击主题会看到主题贴的相关内容和回复内容。回复帖子只针对会员开放,游客不可以回复主题。回复内容比较全面,可有表情,也可以设置字体大小颜色,段落格式等。如果没有登陆直接点击回复则直接跳转到登陆页面。 3.3.3管理员管理帖子与用户管理功能
此部分主要是管理员对论坛的帖子和会员进行综合管理,删除、编辑、查询、等等。普通会员是不可以进行此操作的。管理员登陆界面如图3.4所示:
15
图3.4 管理员登陆
首先用session判断管理员是否登陆,如果没有登陆直接在浏览器里面输入管理界面的地址则不能对其内容进行操作。这样保证了数据的安全性。管理员登陆以后可以对有些文章内容有地方不足时,可以对其进行编辑修改,当然对于不好的帖子或者就是灌水的帖子,严重的可以直接删除了。帖子都是按照发表时间和回复时间排列的,时间最新的帖子则排在最前面,时间越旧的就越靠后面。 如果登陆成功则进入管理员管理页面,如图3.5所示:
16
图 3.5 后台管理
4 编码实现 4.1 功能总体说明 4.1.1 功能总体说明 (1)前台功能页面
登陆与注册:register.jsp、uselogin.jsp、reg_failure.jsp、log_failure.jsp 帖子展示:articleFlat.jsp 、articleDetailFlat.jsp 发表主题帖:post.jsp 回复:reply.jsp、replyDeal.jsp 搜索:articleSearch.jsp (2)后台功能页面
主页面框架: fram.jsp、left.jsp、main.jsp、top.html
17
帖子管理:modify.jsp、delete.jsp、articleSearch.jsp、searchResult.jsp、articleFlat1.jsp
用户管理:userMrg.jsp、login.jsp、searchResultUser.jsp、deleteUser.jsp 4.1.2主要功能流程
主页面 用户登陆 后台管理 注册 是否会会员管理 回复帖子 帖子管理 注销登陆 发表新帖 搜索主帖 会员查询 会员删除 主帖查询 修改帖子 删除帖子
图 4.1 主要功能流程图
4.2各个功能模块的实现 4.2.1数据库的连接
出于安全性的考虑,我们将与数据库的连接,单独写出来并进行编译,也就是数据库连接的javabean文件,编译出来的.class文件是无法被修改的只能通过源文件进行修改,我们在JSP页面中只用直接
18
调用该方法即可,在本系统中我们将其命名为DBConMgr.java 关键代码如下:
表4.1 数据库的连接
import java.sql.*; public class DBConMgr { private String driverName=\"com.mysql.jdbc.Driver\"; //驱动程序名 private String userName=\"root\"; //数据库用户名 private String userPwd=\"123456\"; //密码 private String url= \"jdbc:mysql://localhost:3306/bbs\"; //连接字符串 private Connection conn=null; //数据库连接对象 public Statement sm=null; //数据库语句对象 public void ConnectDB(){ try { Class.forName( driverName); conn = DriverManager.getConnection(url, userName , userPwd); sm=conn.createStatement(); System.out.println(\"------------------数据库连接成功!\"); } catch(Exception e) { e.printStackTrace(); System.out.println(\"------------------数据库连接失败!\"); } } public void CloseDB(){ try { if (sm != null) { sm.close(); } conn.close(); } catch (SQLException SqlE) { SqlE.printStackTrace(); System.out.println(\"-------------------数据库关闭失败!\"); } } } 19
4.2.2用户登陆与注册模块的实现
用户登陆模块是防止非法用户登陆的第一道防线,通过它可以保护后台数据库的安全性,当用户要进行发贴或回复时,首先要进入的就是身份验证界面,只有在密码正确的情况下才能进行以后的操作,如果输入的密码不正确,则不能进行发表新帖和回复。如果用户以浏览者的身份进入网站,则只能进行一般的帖子浏览和搜索,而不能发表新帖和回复,在点击发表新帖后,系统会判断该用户是否是登陆用户,如果不是则进入登陆页面,如果是第一次登陆,请先注册。
登陆的具体实现要通过一个全程变量,即Session变量来实现,用户登录的界面userlogin.jsp,从user表查得用户提交的帐户名和密码正确后,用一个全局变量,即Session变量保存这一消息该变量称为session.setAttribute(\"uLogined\", \"true\");。具体的判断过程为:
表4.2用户登陆代码实现
<% request.setCharacterEncoding(\"GBK\"); String action = request.getParameter(\"action2\"); String username; String pwd; if (action != null && action.trim().equals(\"ulogin\")) { username = request.getParameter(\"username\"); pwd = request.getParameter(\"pwd\"); try { //创建一个用户表数据库读写类 UserMgr userdb=new UserMgr(); //通过用户名查找用户 此方法在封装在UserMgr.java中 User user1=userdb.get(username); if (user1 == null) { // 如果记录集为空,表明没有相匹配的用户名,注册失败: try { //转发至注册错误页面
20
response.sendRedirect(\"log_failure.jsp\"); } catch (Throwable t) { //写异常日志 getServletContext().log(t.getMessage()); } } else if (user1.getPassword().equals(pwd)){ try { //转发至注册成功页面 //设置session判断用户是否登陆如果已登陆则为true session.setAttribute(\"uLogined\", \"true\"); //设置session用来得到用户名 session.setAttribute(\"name\", username); response.sendRedirect(\"articleFlat.jsp\");//跳转到住页面 } catch (Throwable t) { //写异常日志 getServletContext().log(t.getMessage()); } } } catch (Exception e) { e.printStackTrace(); } } %> boolean ulog = false; //判断用户是否登陆
String u = (String)session.getAttribute(\"uLogined\"); if (u != null && u.trim().equals(\"true\")) ulog = true;
若ulog为false,表明没有经过登陆与否的验证,则只能已游客的生份浏览和搜索帖子如果想留言和发表帖子,只有登录或注册用户才可以。
若ulog为true则表名用户已经登陆,而且可以用session得到用户名(String)session.getAttribute(\"name\"),显示在主页上。
如果用户还不是会员则提示用户进行注册,用户提交信息之后,系统开始判断用户的注册信息是否有效,首先是用户名是否为空,用
21
户输入的两次密码是否一致,然后依次往后判断用户所填写的各项信息是否符合要求,直到所有信息均正确无误,系统将该用户注册信息写入会员表即user表,并提示用户注册成功。就可以进行其它有效的操作了。
系统对用户的注册信息的验证实现如下: 首先是用正则表达式对表单的控制
表4.3 正则表达式对表单的控制
} document.register.submit();//填写的内容都符合那么就会提交
表4.4 用户注册代码实现
<%@ page pageEncoding=\"gb2312\"%> <%@ page import=\"java.sql.*,com.bjsxt.bbs.*,java.util.*\"%> <%@ page import=\"userbean.User\"%> <%@ page import=\"dbmgr.UserMgr\"%> <% request.setCharacterEncoding(\"gb2312\"); String action = request.getParameter(\"action\");//提交到自身所以需要做判断 String username; if (action != null && action.trim().equals(\"login\")){ username = request.getParameter(\"username\");//得到表单信息 String pwd = request.getParameter(\"pwd\"); String confpwd = request.getParameter(\"confpwd\"); String email = request.getParameter(\"email\"); String sex = request.getParameter(\"sex\"); try { //创建一个用户表数据库读写类 UserMgr userdb=new UserMgr(); User user=userdb.get(username); if (user != null) { // 如果记录集为非空,表明有相匹配的用户名,注册失败 try { //转发至注册错误页面 response.sendRedirect(\"reg_failure.jsp\"); } catch (Throwable t) { //写异常日志 getServletContext().log(t.getMessage()); } } else { user=new User(); user.setUsername(username); user.setPassword(pwd);
23
user.setEmail(email); user.setsex(sex); //写入数据库 int i=userdb.add(user); // 注册成功 try { //设置session 判断是否注册成功 session.setAttribute(\"userLogined\",\"true\"); //设置session用来在主页获取用户名 session.setAttribute(\"name\",username); //注册成功跳转到主页 response.sendRedirect(\"articleFlat.jsp\"); } catch (Throwable t) { //写异常日志 getServletContext().log(t.getMessage()); } } } catch (Exception e) { e.printStackTrace(); } } %>
4.2.3分页显示的功能实现
这里是分页功能的实现,这里把每页几条记录设为一个常量便于修改。
表4.5 分页显示代码实现
<% final int PAGE_SIZE = 4; // 每页几条记录 int pageNo = 1; String strPageNo = request.getParameter(\"pageNo\");//当前页 if (strPageNo != null && !strPageNo.trim().equals(\"\")) { try { pageNo = Integer.parseInt(strPageNo); } catch (NumberFormatException e) { pageNo = 1; //异常处理如果当前为空pageNo = 1 } }
24
if (pageNo <= 0)//如果小于0 pageNo = 1 pageNo = 1; int totalPages = 0;//总页数 List articles = new ArrayList();//定义一个数组链表 Connection conn = DB.getConn(); Statement stmtCount = DB.createStmt(conn); ResultSet rsCount = DB.executeQuery(stmtCount, \"select count(*) from article where pid = 0\"); // 显示所有pid=0的帖子 rsCount.next(); int totalRecords = rsCount.getInt(1);//总记录数 totalPages = (totalRecords + PAGE_SIZE - 1) / PAGE_SIZE; if (pageNo > totalPages) pageNo = totalPages; Statement stmt = DB.createStmt(conn); int startPos = (pageNo - 1) * PAGE_SIZE; String sql = \"select * from article where pid = 0 order by pdate desc limit \" + startPos + \ + PAGE_SIZE; System.out.println(sql); ResultSet rs = DB.executeQuery(stmt, sql); while (rs.next()) { Article a = new Article(); a.initFromRs(rs);//初始化此方法封装在article.java里面 articles.add(a);//加如数组链表articles } DB.close(rsCount); DB.close(stmtCount); DB.close(rs); DB.close(stmt); DB.close(conn); %>4.2.4 发表与回复功能模块实现
点击发表主题进入post.jsp,填写标题、作者与内容提交到自身页面
表4.6 发表帖子功能代码实现
<%@ page pageEncoding=\"GB18030\"%> <%@ page import=\"java.sql.*,com.bjsxt.bbs.*\"%> <% request.setCharacterEncoding(\"GBK\"); String action = request.getParameter(\"action\"); if (action != null && action.trim().equals(\"post\")) { String title = request.getParameter(\"title\"); String writer = request.getParameter(\"writer\"); String cont = request.getParameter(\"cont\"); String pno = request.getParameter(\"pno\"); Connection conn = DB.getConn(); boolean autoCommit = conn.getAutoCommit(); conn.setAutoCommit(false); int rootId = -1; String sql = \"insert into article values (null, ?, ?, ?, ?, ?, now(),? ,?)\"; PreparedStatement pstmt = DB.prepareStmt(conn, sql, Statement.RETURN_GENERATED_KEYS); pstmt.setInt(1, 0); pstmt.setInt(2, rootId); pstmt.setString(3, title); pstmt.setString(4,writer); pstmt.setString(5, cont); pstmt.setInt(6, 0); pstmt.setInt(7, 0); pstmt.executeUpdate(); ResultSet rsKey = pstmt.getGeneratedKeys(); rsKey.next(); rootId = rsKey.getInt(1); Statement stmt = DB.createStmt(conn); stmt.executeUpdate(\"update article set rootid = \" + rootId + \" where id = \" + rootId); conn.commit(); conn.setAutoCommit(autoCommit); DB.close(pstmt); DB.close(stmt); DB.close(conn); response.sendRedirect(\"articleFlat.jsp\");//发表成功跳转到主页面 }26
%>
回复功能关键代码
表 4.7 回复功能实现
<%@ page language=\"java\" import=\"java.util.*, java.sql.*, com.bjsxt.bbs.*\" pageEncoding=\"GB18030\"%> <% request.setCharacterEncoding(\"GBK\"); int pid = Integer.parseInt(request.getParameter(\"pid\")); int pno = Integer.parseInt(request.getParameter(\"pno\")); int rootId = Integer.parseInt(request.getParameter(\"rootId\")); String writer = request.getParameter(\"writer\"); String title = request.getParameter(\"title\"); String cont = request.getParameter(\"cont\"); Connection conn = DB.getConn(); boolean autoCommit = conn.getAutoCommit(); conn.setAutoCommit(false); String sql = \"insert into article values (null, ?, ?, ?, ?, ?, now(), ?, ?)\"; PreparedStatement pstmt = DB.prepareStmt(conn, sql); pstmt.setInt(1, pid); pstmt.setInt(2, rootId); pstmt.setString(3, title); pstmt.setString(4, writer); pstmt.setString(5, cont); pstmt.setInt(6, 0); pstmt.setInt(7,pno); pstmt.executeUpdate(); Statement stmt = DB.createStmt(conn); stmt.executeUpdate(\"update article set isleaf = 1 where id = \" + pid); conn.commit(); conn.setAutoCommit(autoCommit); DB.close(pstmt); DB.close(stmt); DB.close(conn); %>
这里是javscript实现五秒之后自动跳转
27
表4.8 Javascript 实现延迟跳转
span id=\"time\" style=\"background:red\">5秒钟后自动跳转,如果不跳转,请点击下面链接 主题列表
4.2.5后台管理模块的实现
网上论坛系统除了能够让用户实现前台的浏览和回复等操作之外,还必须能够使管理人员能够对系统的各种信息进行维护,比如帖子的增加、删除、修改,会员的搜索,删除等等。管理功能是网上论坛系统相当重要的一部分功能。
管理员可以通过主页面进入系统后台进行维护,点击之后,首要的就是进行身份验证,输入正确的账号,密码之后,方能进入。出于安全性考虑,管理员账号应尽量少分配,密码也要尽量复杂,经常更
28
换。
进入之后系统管理的主页面采用了框架结构,左边是一个菜单,右边显示具体信息。
管理的主要功能有帖子的查询、更新,删除等,用户管理,主要就是查询用户,删除用户。
这一部分的实现也没有新的方法,使用的依然是一些SQL语句来对相关数据进行查询和删除,修改。
网上论坛作为一个在网上交流思想的论坛系统,如何能让用户以最快的速度找到自己希望看到的帖子,也是需要非常重视的一个问题,此时搜索引擎也就必不可少了。本论坛系统也做了一个小模块,以供用户进行一些模糊查找,用户不必输入全部名称,只需输入一些关键词,系统就可以将符合该查询条件的所有帖子信息以网页形式返回给用户。该搜索功能在JSP页面中实现的关键代码为:
表4.9搜索功能代码实现
Connection conn = DB.getConn(); Statement stmtCount = DB.createStmt(conn); String sqlCount = \"select count(*) from article where title like '%\" + keyword + \"%'\" ;//得到符合条件的总记录数 System.out.println(sqlCount); ResultSet rsCount = DB.executeQuery(stmtCount, sqlCount); rsCount.next(); int totalRecords = rsCount.getInt(1); totalPages = (totalRecords + PAGE_SIZE - 1)/PAGE_SIZE; if(pageNo > totalPages) pageNo = totalPages; if(pageNo <= 0) pageNo = 1; Statement stmt = DB.createStmt(conn); int startPos = (pageNo-1) * PAGE_SIZE;
29
//这里是为了分页显示 String sql = \"select * from article where title like '%\" + keyword + \"%' and pid = 0 order by pdate desc limit \" + startPos + \ + PAGE_SIZE ;
修改功能实现的关键代码为:
表4.10修改功能代码实现
<%@ page pageEncoding=\"GB18030\"%> <%@ page import=\"java.sql.*,com.bjsxt.bbs.*\"%> <% request.setCharacterEncoding(\"GBK\"); String action = request.getParameter(\"action\"); int id = Integer.parseInt(request.getParameter(\"id\")); if (action != null && action.trim().equals(\"modify\")) {//隐藏域 Connection conn = DB.getConn(); String title = request.getParameter(\"title\"); System.out.println(title); String cont = request.getParameter(\"cont\"); System.out.println(cont); PreparedStatement pstmt = DB.prepareStmt(conn, \"update article set title = ? , cont = ? where id = ?\"); pstmt.setString(1, title); pstmt.setString(2, cont); pstmt.setInt(3, id); pstmt.executeUpdate(); DB.close(pstmt); DB.close(conn); response.sendRedirect(\"articleFlat.jsp\"); return; } %> 删除功能实现的关键代码为
表4.11删除功能代码实现
<%@ page pageEncoding=\"GB18030\"%> <%@ page import=\"java.sql.*, com.bjsxt.bbs.*, java.util.*\"%> <%!
30
private void delete(Connection conn, int id, boolean isLeaf) { //delete all the children //delete(conn, chids's id) if(!isLeaf) { String sql = \"select * from article where pid = \" + id; Statement stmt = DB.createStmt(conn); ResultSet rs = DB.executeQuery(stmt, sql); try { while(rs.next()) { delete(conn, rs.getInt(\"id\"), rs.getInt(\"isleaf\") == 0); } } catch (SQLException e) { e.printStackTrace(); } finally { DB.close(rs); DB.close(stmt); } } //delete self DB.executeUpdate(conn, \"delete from article where id = \" + id); } %> <% int id = Integer.parseInt(request.getParameter(\"id\")); int pid = Integer.parseInt(request.getParameter(\"pid\")); boolean isLeaf = Boolean.parseBoolean(request.getParameter(\"isLeaf\")); Connection conn = null; boolean autoCommit = true; Statement stmt = null; ResultSet rs = null; try { conn = DB.getConn(); autoCommit = conn.getAutoCommit(); conn.setAutoCommit(false); delete(conn, id, isLeaf); stmt = DB.createStmt(conn); rs = DB.executeQuery(stmt, \"select count(*) from article where pid = \" + pid); rs.next(); int count = rs.getInt(1);
31
if(count <= 0) { DB.executeUpdate(conn, \"update article set isleaf = 0 where id = \" + pid); } conn.commit(); } finally { conn.setAutoCommit(autoCommit); DB.close(rs); DB.close(stmt); DB.close(conn); } response.sendRedirect(\"articleFlat1.jsp\"); %>
5 系统测试
系统完成之后,对各个模块的功能进行了详细的测试,输入数据和预测输出数据相比,发现了一些问题。主要是在查询过程中预计查询结果和实际结果不一致,有时候达不到目的,对数据库的操作表之间的关联考虑得不够周到,因此往往会出现一些小的错误。需要靠一步步的查找解决。各个模块组装完成后,又会出现一些问题。所以很容易造成数据混乱,必须对相应的数据关系理清楚,一些关键查询统计的SQL语句必须反复斟酌才能放在程序中使用。
先注册一个用户名为USER的用户(先前数据库中无此用户名的),注册成功后,再注册一个用户名为USER的用户,预期结果应该是系统提示该用户名已经存在。填写完整的资料后点击注册,此时系统按照预期结果提示该用户名已经被注册了。测试结果,系统正常按照设计模式运行。将用户名改为:几个空格然后其他的不变提交之后我们会发现系统返回成功页面,但问题是用户名什么也没有,空格也
32
被作为合法的用户名,这在实际应用中是不允许的,我们需要对其命名规则进行定义,具体修改请参看前面正则表达式对表单的控制。同样的邮箱也存在规则未定义的问题,需要对其加以定义。
在测试过程中,我经过测试,排除了系统的大部分错误。当然排除所有错误是不太可能的,我想应该还有些不易检测到的错误还没有被发现,需要在使用的过程中进一步的完善,数据库的加密是一个重要的概念,在实际的应用过程中是一个尚待解决的问题,应该做好数据库的完善工作,特别是备份和安全工作;另一方面由于时间仓促难免有错误和不完善的地方,希望老师能够帮我指点和纠正。 总 结
完成这次设计任务总共用了六个星期时间,前三个星期用来收集资料、学习要用到的各项开发技术、进行论坛的系统分析,中间两个星期用来设计系统,后一个星期用来测试及修改。论文的撰写一直贯穿其中。
通过这次毕业设计,我从中学到了许多新的知识,而且通过这次毕业设计,培养了我综合多门学科中的知识、迅速规划并开发出目标系统的能力,以及编程能力也有了很大的提高。另外也有许多心得体会,所谓系统开发如人生百味,酸甜苦辣皆有之。
严格按工程的方法来设计系统相当重要,不能认为基于Web的数据库管理的BBS系统很小,可以无需花太多的时间来做系统分析,甚至可以无需经过系统定义而直接进入系统编码阶段。这种想法很天
33
真,最小的系统,你若想保证质量,把系统做得越可靠越有效率功能越强,应该考虑的方方面面就越多越复杂。系统分析过于简单,系统定义过于抽象,则在系统设计与编码阶段遇到的困难就越多,特别是其中不得不做一些功能性甚至系统结构性方面的变动,将面对许多重复性的工作。在系统开发过程中重复工作过多,将会极大地影响系统开发的积极性,从而影响整个系统的质量。在这一点上,我体会尤深,我花了三个星期,即接近系统开发一半的时间用在系统分析与系统定义上,也就是在开始浪费了一周多的时间,即边编码边分析,边分析边编码,后来越来越乱越来越复杂,不得不重新考虑系统开发计划的合理性。总之,在这一点上,我的体会是,系统分析越充分,系统定义越具体,那么后续的系统设计与开发工作就越有效率,且系统的质量也越有保障。
回顾这一个半月的系统开发工作,总结起来那就是,软件的开发是相当辛苦的,但成功以后的喜悦也是非常美妙的,而且我发现,其中你投入的心血越多,成功以后你所获得的快乐与充实感也更多更强。难道人越辛苦就会越幸福快乐吗?对,软件系统开发就是这样!
参考文献
主要参考资料:
[1] 武延军,黄飞跃. 精通JSP编程技术[M]. 北京:人民邮电出版社,
2001:126-178.
34