资源描述
本科生课程实习
课程名称
Web开发技术课程实习
课程编号
j1620108
学号
学生姓名
所在专业
计算机科学与技术
所在班级
指导教师
成绩
教师签字
课程实习时间:2012年5月14日 至 5月18日
评语:
目 录
1、开发背景 3
2、需求分析 3
3、系统设计 3
3.1、系统目标 3
3.2、系统功能结构 3
3.3、系统浏览 4
3.4、业务流程图 8
3.5、程序运行环境 8
4、数据库设计 8
4.1、数据库概要说明 8
4.2、数据库概念设计 8
4.3、数据库逻辑结构设计 11
4.4、文件夹组织结构 12
5、公共类设计 13
5.1、数据库公共类 13
5.2、编码转换公共类 15
6、登录模块 15
6.1、登录模块概述 15
6.2、登录模块技术分析 16
7、注册模块 16
7.1、注册模块概述 16
7.2、注册模块的实现 16
8、论坛的主页面设计 18
8.1、论坛主页面概述 18
8.2、论坛主页面的实现 19
9、主题显示模块 21
9.1、主题显示模块概述 21
9.2、主题显示模块的设计 21
10、主题内容显示与回复内容显示 23
10.1、设计概念 23
10.2、主题内容显示和回复内容显示设计过程 23
11、主题回复 24
11.1、主题回复模块概述 24
11.2、主题回复模块的设计 25
12、发表新主题 25
12.1、发表新主题模块概述 25
12.2、新主题模块设计 26
13、后台设计 27
13.1、后台模块的概述 27
13.2、后台模块的设计 27
14、总结 29
1、开发背景
在当今网络的时代,人与人之间的交流从原来的面对面交流,慢慢地借助于现代计算机软件技术和网络技术演变成一种远程的,存在于网络上的交流,这种远程交流其中一种方式是通过使用BBS论坛进行的,有了这样的交流,人与人之间的知识文化就可以很快地进行传播
2、需求分析
BBS系统主要的功能是讨论各种话题的交流中心。需要有各种不同话题的板块。需要为用户分等级,版主(拥有删除该板块中帖子的能力)、普通用户(拥有发帖和浏览不同板块的帖子的功能)、管理员(拥有新建板块,删除板块和删除用户等一些列后台管理功能)
3、系统设计
3.1、系统目标
根据需求分析的要求,制定了BBS系统目标如下:
1、 系统界面友好、美观
2、 划分用户级别,将不同的权限划分给不同的人群
3、 合理管理论坛相关信息
4、 易于维护和扩展
5、 系统运行稳定可靠
3.2、系统功能结构
本BBS系统是一个典型的Java Web程序,由系统的前台和后台管理两部分组成
1、 系统前台
系统前台模块提供给所有用户使用,用户包括注册用户和普通游客,两者所拥有的功能不同。
系统前台主要包括用户登录、用户注册、发表主题、论坛浏览、主题浏览等功能模块
图3.2.1
2、 系统后台
后台管理主要由管理员使用,可对论坛中相关信息进行管理维护。普通用户无权使用。后台管理功能主要包括用户管理、板块管理、帖子管理、回复管理等。
图3.2.2
3.3、系统浏览
BBS论坛主页,主要内容是导航条、用户登录、用户注册、板块信息。用户可以通过论坛主页获得相应的信息。
图3.3.1(论坛主页)
用户登录界面在主页面的上方(用户可以通过登录界面登录论坛,登录论坛后可以发帖,否则只能浏览帖子内容,不能回复和发帖)
图3.3.2(用户登录界面)
图3.3.3(登录后的界面)
游客通过用户注册页面注册为论坛用户
图3.3.4(注册页面)
板块里的主题(帖子)
图3.3.5(板块主题)
主题内容和回复信息
图3.3.6
快速回复,在每个主题的最下方
图3.3.7
后台管理页面(管理板块信息、用户信息、主题信息)
图3.3.8
3.4、业务流程图
3.5、程序运行环境
1、系统开发平台:MyEclipse9
2、系统开发语言:JSP
3、数据库管理系统软件:Microsoft SQL Server 2005
4、运行环境:Windows 7
4、数据库设计
在开发应用程序时,对数据库的操作是必不可少的,数据库设计是根据程序的需求及其实现功能所制定的,数据库设计的合理性将直接影响到程序的开发过程。
4.1、数据库概要说明
本系统采用SQL Server 2005数据库,相对于Oracle等大型数据库来讲,SQL Server2005更加适合中小型系统,再者由于对SQL Server2005比较熟悉,因此选用了SQL Server2005作为数据库软件。
4.2、数据库概念设计
根据本系统的需求分析、流程设计及功能结构的确定,每个功能模块可以抽象出一个或多个实体对象,例如用户、论坛版块、主题、回复主题等实体对象。这些实体对象彼此相互联系,并且最终创建成数据库表结构。
1、 用户实体对象
用户实体包括用户编号、用户名、用户等级、用户头像等用户相关属性。用户编号是识别用户实体的唯一编号,也就是数据表的主键,它的数据类型为int型,并具有自增的特性;用户级别属性是标明用户在本系统中的功能权限;其他属性都是描述用户相关信息的属性。
图4.2.1
2、 论坛版块实体对象
论坛版块实体对象包括论坛版块编号、论坛名称、版主、创建时间等相关属性。版块实体对象中的板块编号属性与用户实体对象中的用户编号属性类型相同。都是具有自增的特性,板块实体的其他对象都是描述板块的相关信息的属性。
图4.2.2
3、 主题实体对象
主题实体包括主题编号、主题标题、主题内容、主题作者、提价时间、论坛板块编号(外键)、论坛板块名称(外键)、人气等相关属性。主题编号属性类型为int型,并具有自增特性;论坛板块编号标明此主题发表在哪个论坛板块中,人气属性用来记录主题的被访问信息。
图4.2.3
4、 回复主题实体对象
回复主题实体包括回复编号、回复标题、回复内容、回复时间、回复作者、主题编号、主题标题等相关回复属性。回复编号属性类型为int型,并具有自增特性。主体编号和主题标题是外键。
图4.2.4
5、 各个表之间的关系
图4.2.5
4.3、数据库逻辑结构设计
根据上面设计好的E-R图,可以在数据库中创建相应的数据表,BBS系统中各数据表的结构如下:
1、 tb_user(用户表)
表tb_user用于保存注册用户的信息
用户表(tb_user)
字段名
数据类型
主键
描述
username
varchar(20)
否
用户名
password
varchar(20)
否
用户密码
sex
varchar(20)
否
性别
email
varchar(50)
否
邮箱
qq
varchar(20)
否
qq号
signature
varchar(300)
否
个性签名
grade
varchar(20)
否
用户等级
lxdz
varchar(50)
否
联系地址
tx
varchar(50)
否
头像
grzy
varchar(50)
否
个人主页
realname
varchar(30)
否
真名
id
int
是
用户编号
图4.3.1
2、 tb_forum(板块表)
表tb_forum用于保存论坛板块信息
版块表(tb_forum)
字段名
数据类型
主键
描述
id
int
是
版块号
forumname
varchar(20)
否
版块名
manager
varchar(100)
否
版块管理员
createtime
datetime
否
版块创建时间
图4.3.2
3、 tb_topic(主题表)
表tb_topic保存主题信息,其中forumid为板块号,通过检索板块号,可以获得该板块下相应的主题。因此版块号为外键。
主题表(tb_topic)
字段名
数据类型
主键
描述
id
int
是
主题号
content
text
否
主题内容
author
varchar(20)
否
作者
submittime
datetime
否
主题提交时间
forumid
int
否
所属版块号
title
varchar(300)
否
题目
xq
varchar(30)
否
心情
rq
int
否
人气
forumname
varchar(20)
否
所属版块名
图4.3.3
4、 tb_response(回复表)
表tb_response用于保存回复信息,其中topicid为主题号,通过检索主题号可以获得该主题相对应的回复信息,主题好为外键
回复表(tb_response)
字段名
数据类型
主键
描述
id
Int
是
回复编号
title
varchar(300)
否
题目
content
text
否
内容
author
varchar(20)
否
作者
submittime
timestamp
否
提交时间
topicid
int
否
主题号
topicname
varchar(100)
否
主题名
xq
varchar(20)
否
心情
图4.3.4
4.4、文件夹组织结构
每个项目都会有相应的文件夹组织结构。当项目文件过多时,会划分相应的包来存放文件。其中javabean包放javabean,servlet包放servlet,tag包放自定义标签,util放一些通用工具方法,如数据库连接、编码转换等。
图4.4.1
5、公共类设计
在开放应用程序时,可以将数据库等相关操作封装在自定义类中,以便于在开发程序时调用,这样,可以提高代码的重用性。本系统创建了DB类、HandleString类等公共类
5.1、数据库公共类
本系统采用SQL Server2005数据库,系统通过数据源来连接数据库。创建数据库时应该在系统上创建数据源(创建数据源的方法详见百度)。
DB类为数据库类,它里面封装了数据库操作的常用方法、如数据的插入、数据的更新、事务等一些列常用方法。
DB类的构造函数负责加载Java提供的数据库连接驱动,并且与数据库连接
每次调用DB类时都会与数据库相连。而每次调用完数据库时应该释放连接和结果集对象,因此需要一个close方法
DB类还应该有SQL语句的执行等方法
除了数据库正常的连接、释放、执行SQL方法外,还有数据库所对应的执行方法。在这里就不一一列出,DB类的详细方法可以浏览该类的源代码。
5.2、编码转换公共类
本系统是一个Java Web程序,很多不同的页面与数据库的操作都需要通过转码才能正确显示。因此,有必要建立一个编码转码的公共类。
通过这个方法能把gb2312的编码转为正确,不会出现乱码。
但是还考虑到以后的拓展性,页面可能采用的是UTF-8的编码,这里上述的方法就不适用,因此在转码类中还定义了其他方法,以为以后的拓展左准备。
6、登录模块
6.1、登录模块概述
登录模块嵌套在主页面上,用户通过登录模块登录论坛。只要用户输入正确的用户名和密码就能通过登录按钮进行登录。
图6.1.1
6.2、登录模块技术分析
由于本次设计我采用的是MVC模式,因此有视图、模型和控制三个层次,其中视图就是图6.1.1所示。而模型就是在javabean包中Login.java它里面的成员包含了用户的所有信息,当然登录并不需要用到里面的所有成员,只需要用到用户名和密码这两项就可以了。而servlet就是负责处理用户名和密码是否存在数据库,如果存在就允许登录,如果不是的话就提示登录失败。
1、 在视图中获取用户名和密码
<form action="helpLogin" method = "post" name = form>
<td width="177"> </td>
<td width="189" height="25" id="bgclock" class="zi"></td>
<td width="247"><font size="2">用户名:
<input type="text" name="username" />
</font></td>
<td width="228"><font size="2">密码:
<input type="password" name="password" /></font></td>
</form>
2、 获取用户名和密码后,把这两项内容提交到servlet中,然后在servlet中连接数据库,把用户名和密码与数据库进行select。最后把结果放到一个session中。最后跳转页面。(代码略)
3、 跳转页面显示是否登录成功(视图jsp页面代码略)
7、注册模块
7.1、注册模块概述
用户通过注册模块进行注册
注册模块在图3.3.4中
7.2、注册模块的实现
本系统一致采用MVC模式。注册页面是视图、Servlet为控制器、JavaBean为模型。用户通过在注册页面填写注册信息。通过提交后,信息被提交到Servlet中。然后通过Servlet写入数据库中。最后跳转页面返回信息。
Servlet核心代码:
try {
con = DriverManager.getConnection(uri, "sa", "709394");
if (boo) {
String insertUser = "insert into tb_user(username,password,sex,email,qq,signature,grade,lxdz,tx,grzy,realname)"
+ " values(?,?,?,?,?,?,?,?,?,?,?)";
pre = con.prepareStatement(insertUser);
pre.setString(1, username);
pre.setString(2, password);
pre.setString(3, sex);
pre.setString(4, email);
pre.setString(5, qq);
pre.setString(6, signature);
pre.setString(7, grade.trim());
pre.setString(8, lxdz);
pre.setString(9, tx);
pre.setString(10, grzy);
pre.setString(11, realname);
int m = pre.executeUpdate();
if (m != 0) {
backNews = "注册成功";
reg.setBackNews(backNews);
}
} else {
backNews = "信息填写不完整,请填写带星号的信息";
reg.setBackNews(backNews);
}
con.close();
} catch (SQLException exp) {
backNews = "该会员名已被使用,请更换名字" + exp;
reg.setBackNews(backNews);
}
String register = "register";
session.setAttribute("changeMes", backNews);
session.setAttribute("reg", register);
RequestDispatcher dispatcher = request
.getRequestDispatcher("showCBMes.jsp");
dispatcher.forward(request, response);
}
8、论坛的主页面设计
8.1、论坛主页面概述
论坛主页面包括3部分,第一部分是导航条、第二部分是用户登录与注册、第三部分是论坛板块的显示。其中论坛主页有两个页面,一个是用户登录前的页面,一个是用户登录后的页面(两个页面的主要区别是导航条游客一栏变回该登录的用户名、用户登陆框和注册按钮消失,其他的不变)图8.1..1为登录前的页面、图8.1.2为登录后的页面
图8.1.1
图8.1.2
8.2、论坛主页面的实现
论坛主页面的JSP代码(部分),它通过判断用户是否登录,登录的话打开afterlogin.jsp这个页面,否者的话打开beforelogin.jsp这个页面
<script src="JS/onclock.JS"></script>
<center>
<%@ include file="head.jsp"%>
<%@ include file="navbar.jsp" %>
<body onload="clockon(bgclock)">
<%
if (session.getAttribute("username") == null) {
%>
<%@ include file="beforelogin.jsp"%>
<%
} else {
%>
<%@ include file="afterlogin.jsp"%>
<%
}
%>
</body>
<%@ include file="copyright.jsp"%>
登录前页面beforelogin.jsp与afterlogin.jsp的结构大致相同,不同的是用户登录注册模块,登录前页面有用户登录模块,而登录后页面没有用户登录模块。除此以外,两者的结构都有论坛板块显示DisplayTag,java文件(这个文件是自定应标签)。这个标签文件用于显示论坛板块的详细信息。
Beforelogin.jsp的代码(部分)
用户登录与注册:
<td width="837" height="65"><table width="859" height="63" border="0">
<tr>
<form action="helpLogin" method = "post" name = form>
<td width="177"> </td>
<td width="189" height="25" id="bgclock" class="zi"></td>
<td width="247"><font size="2">用户名:
<input type="text" name="username" />
</font></td>
<td width="228"><font size="2">密码:
<input type="password" name="password" /></font></td>
</form>
注册采用的是图片热点跳转:
<map name="Map" id="Map">
<area shape="rect" coords="6,12,51,35" href="#" onClick="return submit2();"/>
<area shape="rect" coords="59,12,103,35" href="register.jsp" />
</map>
调用自定义标签:
<app:display />
自定义标签DisplayTag.java部分代码:
try {
List l = new ArrayList();
if (session.getAttribute("list") != null) {
l = (List) session.getAttribute("list");
}
for (int i = 0; i < l.size(); i++) {
Forum forumBean = (Forum) l.get(i);
out.println("<tr>");
out.println("<td colspan='2' height='64'>");
out.println("<table width='1003' height='64' border='0' background='images/06.png'>");
out.println("<tr>");
out.println("<td></td>");
out.println("<td colspan='2' align='left'><font size = '2'>"
+ "[<a href=topic?forumid=" + forumBean.getId()
+ "&forumname=" + forumBean.getForumname()
+ "&iflogin=" + null + ">" + forumBean.getForumname()
+ "</a> ]</font></td>");
out.println("<td width='40%' align='left'><font size = '2'>"
afterlogin.jsp页面也beforelogin.jsp页面大致相同,除了没有用户登录模块以外。
9、主题显示模块
9.1、主题显示模块概述
主题显示模块同样使用了自定义标签来设计。通过点击论坛板块,把论坛板块的id号,传到servlet中,通过servlet处理,把获得的内容存放到javabean中,然后通过跳转到主题显示模块,把获得的内容通过一定的方式显示在页面上。
图9.1.1
9.2、主题显示模块的设计
调用自定义标签DisplayTopic.java文件显示
DisplayTopic.java(代码)
public class DisplayTopic extends TagSupport {
public int doEndTag() throws JspException {
JspWriter out = pageContext.getOut();
HttpServletRequest request = (HttpServletRequest) pageContext
.getRequest();
HttpSession session = pageContext.getSession();
HandleString s = new HandleString();
try {
if (session.getAttribute("List") != null) {
List l = (List) session.getAttribute("List");
for (int i = 0; i < l.size(); i++) {
Topic t = (Topic) l.get(i);
out.println("<tr><font size='2'>");
out.println("<td width='1003' height='33'><table width='1003' border='0' background='images/lb3.gif'>");
out.println("<tr>");
out.println("<td width='73'> </td>");
out.println("<td width='73' align='center' valign='middle'><img src='images/xq/"
+ t.getXq() + "' width='20' height='20'></td>");
out.println("<td width='38%' align='left' valign='middle'><a href='responseList?name="
+ session.getAttribute("username")
+ "&topicid="
+ t.getId() + "&topicname=" + t.getTitle()
+ "'>"
+ (t.getTitle()) + "</a></td>");
out.println("<td width='109' align='center' valign='middle'>"
+ t.getAuthor() + "</td>");
out.println("<td width='126' align='center' valign='middle'>"
+ t.getReCount() + "/" + t.getRq() + "</td>");
out.println("<td width='207' align='center' valign='middle'>"
+ t.getSubmittime() + "</td>");
out.println("</tr>");
out.println("</table>");
out.println("</td>");
out.println("</font></tr>");
}
}
} catch (Exception e) {
e.printStackTrace();
}
return super.doEndTag();
} }
10、主题内容显示与回复内容显示
10.1、设计概念
同样通过自定义标签来显示主题内容和回复内容。DisplayResponse.java为自定义标签。
图10.1.1
10.2、主题内容显示和回复内容显示设计过程
DisplayResponse.java自定义标签的设计和上述论坛板块的自定义标签的设计方法大致相同。不同的是页面的布局和内容的不同。
代码不详细放出。
HandleResponse.java是负责获取主题的信息和回复信息,并且把这些显示反馈给视图(即这里的自定义标签DisplayResponse.java,负责显示主题内容和回复内容的Jsp页面嵌套了DisplayResponse.java这个自定义标签)
HandleResponse.java部分代码:
// 获取发表人的发表内容和信息
Topic topicBean = new Topic();
try {
List listContent = topicBean.getRecordTopic((String) session
.getAttribute("topicId"));
session.setAttribute("listContent", listContent);
List listAuthor = topicBean.getTopicAuthorInfo((String) session
.getAttribute("topicId"));
session.setAttribute("listAuthor", listAuthor);
} catch (SQLException e1) {
e1.printStackTrace();
}
// 获取回复人回复内容和信息
Topic topicBean2 = new Topic();
try {
List listResponse = topicBean2.getRecordResponse((String) session
.getAttribute("topicId"));
session.setAttribute("listResponse", listResponse);
} catch (SQLException e) {
e.printStackTrace();
}
11、主题回复
11.1、主题回复模块概述
主题回复模块放在主题内容显现的最下方。主题的回复用户必须要先登录才能回复。
图11.1.1
11.2、主题回复模块的设计
通过回复按钮,把回复得内容提交到主题回复的servlet中,然后通过servlet把内容存放到数据库中。最后再次跳转到主题内容显示这个页面,把最新的回复信息显示到视图上。
Servlet部分代码:
try {
//快速回复不用tilte
String resTitle = "response";
m = topicBean.InsertDataResponse(resTitle, content, xq, author, topicId, topicName);
if (m == 1) {
try {
RequestDispatcher dispatcher = request
.getRequestDispatcher("responseList");
dispatcher.forward(request, response);
} catch (Exception ex) {
ex.printStackTrace();
}
}
} catch(Exception e) {
e.printStackTrace();
}
12、发表新主题
12.1、发表新主题模块概述
发表新主题和回复模块的设计大致相同。
图12.1.1
通过在视图上输入新主题的信息,然后通过提交到servlet中并把信息存放到数据库中,最后跳转到主题显示页面,把新主题显示出来。
12.2、新主题模块设计
新主题模块的设计与回复模块大致相同。
新主题模块的servlet部分代码:
Topic topicBean = new Topic();
int i = 0;
try {
i = topicBean.InsertData(title, content, xq, author, forumId,
forumName);
} catch (Exception e) {
e.printStackTrace();
}
if (i == 1) {
try {
List l = topicBean.search(0, forumId);
session.setAttribute("List", l);
RequestDispatcher dispatcher = request
.getRequestDispatcher("topiclist.jsp");
dispatcher.forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
13、后台设计
13.1、后台模块的概述
后台模块负责管理整个BBS,它的功能有删除用户、增添新的板块、删除板块、更改版主等一些功能。
后台页面采用框架设计,在后台主页面上创建三个框架。上方的是导航条、左方的后台板块的导航条、右方是主要显示内容。后台管理模块的图为图3.3.8
后台主页面框架代码(部分)
<frameset cols="*,1050,*" border="0">
<frame src="about:blank"></frame>
<frameset rows="175,*" cols="*" frameborder="NO" border="0" framespacing="0">
<frame src="backtop.jsp" name="topFrame" scrolling="no" noresize>
<frameset cols="198,*" frameborder="NO" border="0" framespacing="0">
<frame src="backleft.jsp" name="leftFrame" scrolling="NO" noresize>
<frame src="adminListForum" name="mainFrame"scrolling="auto">
</frameset>
</frameset>
<frame src="about:blank"></frame>
</frameset>
<noframes></noframes>
13.2、后台模块的设计
1、板块管理
图13.2.1
板块管理的功能有版主的更换,板块的添加和板块的删除。
由于本系统是基于MVC设计的,他们所有功能都是通过servlet来对数据库进行操作的。
板块删除servlet(部分代码)
try {
// 方法集成在Topic类中
Topic topicBean = new Topic();
i = topicBean.DelRecordforForumn(forumid);
} catch (SQLException e) {
e.printStackTrace();
}
if (i == 1) {
changeMes = "删除成功";
} else {
changeMes = "删除失败";
}
session.setAttribute("changeMes", changeMes);
RequestD
展开阅读全文