合肥学院
计算机科学与技术系
课程设计报告
2011~2012学年第一学期
课学学专指
业导
班教生
姓
程 JAVA语言
信息发布系统
09网络工程(2)班 张贯虹、张艳明
名 号 级 师
课程设计名称
20 12年09 月
一、需求分析
随着网络的飞速发展和普及,越来越多的人们习惯上网浏览信息。本系统的主要目的就是为用户提供一个方便的网上信息发布、浏览平台。利用本系统,用户可以直接在网上发布信息并根据自己的需要对信息进行检索。从开发者的角度进行分析,此系统的用户主要由两部分组成:
第一部分,即浏览者, 浏览者登录前台后,可以通过导航条分栏目浏览信息,可以查看信息的详细内容,可以通过关键字实现信息检索。
第二部分,即管理员和普通用户,管理员可包括增加用户、修改用户和删除用户。管理员可以进行所有后台操作;普通用户只能执行信息管理操作,且所能管理的信息栏目由管理员指定。管理员可以维护信息栏目,包括增加栏目、修改栏目、删除栏目、指定栏目的信息维护员。对栏目的所有操作都将反映在前台网站的导航条上。普通用户只能维护自己有权的栏目。
二、设计
1. 设计思想
Servlet就是一种能够和用户互动的技术, 能够处理用户提交的数据并作出回应.Servlet是基于Java的、与平台无关的服务器端组件.用户通过浏览器向服务器发送一个Servlet请求, WEB服务器软件(Servlet容器)收到请求后, 执行对应的Servlet程序, 处理用户提交的数据, 然后向客户端发送应答, 浏览器收到应答后把结果显示出来. Servlet程序必须继承Javax.servlet.http.HttpServlet, 这样才能被WEB服务器(Java EE容器)调用, 才能够让客户端通过浏览器访问.WEB服务器(Java EE容器)接收到访问Servlet的请求后, 调用对应Servlet程序的service方法.在这个例子里, 我们覆盖了service方法, 完成要实现的功能. service方法的第一个参数是ServletRequest对象request, 用来接收请求信息;第二个参数是ServletResponse对象response, 用来处理应答信息.
客户端的浏览器通过URL访问Web服务器,服务器请求数据库服务器,并获得的结果以HTML形式返回客户端浏览器。浏览者通过前台的网页浏览信息,管理员通过后台登陆界面登录后台进行信息的管理。服务器端使用JSP进行动态网页的开发,通过JDBC:ODBC桥的方式连接SQL Server 2005数据库。系统中的所有数据(包括用户、栏目、信息等)都存储在数据库中。
2.功能设计
2.1查看信息功能
任何用户均可以使用查看信息功能。用户通过在系统导航栏上单击各个栏目的超链接,可以进入查看各栏目下的信息。查看信息功能显示所有信息,并且使用分页显示的效果,每页显示8条新闻,用户可通过单击下方“首页”、“末页”、“前页”、“后页”等按钮跳转到其他页面浏览。这里显示的所有信息按信息的序号大小降序排列。用户通过单击每条信息的标题可以查看到信息的详细内容。
2.2信息搜索功能
任何用广均可以使用信息搜索功能。在首页上,用户可以通过在文本框中输入信息的关键字来搜索符合条件的信息。这里提供的是模糊搜索功能,即只要在查询字段中包含用户输
入的关键字内容就认为是符合查询条件的记录。查询结果同样以分页的方式显示。
2.3 后台管理功能
用户通过在浏览器的地址栏中输入后台登录界面的地址打开后台登录界面。在登录界面中输入用户名和密码,系统通过判断用户的权限给出相应的后台管理界面。用户分两个级别:管理员和普通用户。管理员可进行的操作包括修改密码、管理用户、栏目管理、信息管理。管理员可以修改自己的登录密码;可以添加和删除普通用户,并赋予普通用户管理权限;可以增加、删除和修改栏目,对栏目的所有操作都将反映在前台网站的导航条上;可以对信息进行管理。信息管理包括增加信息、修改信息、删除信息。一条信息的数据包括标题、正文和附件,可最多上传3个附件。管理员可以维护所有栏目的信息,而普通用户只能维护自己有权的栏目。普通用户只能根据自己的权限执行信息管理操作,且所能管理的信息栏目由管理员指定。
3. 数据库设计
数据库是系统的核心组成部分,系统中的所有数据(包括用户、栏目、信息等)都存储在数据库news中。数据news中包括:用户信息表classes、栏目表items、日志表logs、信息表news,用户表news_user、用户身份表news_popedom.
用户信息表:
栏目表
日志表:
信息表:
用户表:
用户身份表:
4.详细设计
4.1与数据库连接
首先与想要使用的 DBMS 建立一个连接。这包含 2 个步骤:装载驱动程序并建立连接。 ·装载驱动程序
装载驱动程序只需要非常简单的一行代码。例如,你想要使用 JDBC-ODBC 桥驱动程序, 可以用下列代码装载它:Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
·建立连接
第二步就是用适当的驱动程序类与 DBMS 建立一个连接。下列代码是一般的做法: Connection conn = DriverManager.getConnection("jdbc:odbc:idsdby","sa","");
URL 通常是数据源的名字或数据库系统。登陆数据库系统的用户名为 "sa" 口令为 ""。
4.2查看信息功能
4.2.1首页(indexx.jsp)
首页包括网站Banner、导航条等,同时显示了系统的前两个栏目的信息。
显示导航条的代码:
图2-5 首页
4.2.2分栏目显示信息(more_news.jsp)
用户点击首页导航条上的栏目名后,系统根据超链接传递用户请求查看的栏目信息,返回详细信息的页面。这个页面包括此栏目下信息的编号、标题、访问次数、信息来源、发布者、发布时间。
显示栏目下信息的代码:
<tr>
<td width="7%">
<div align="center"><%=rs.getString("news_id")%></div>
</td>
<td width="35%">
<div align="center"><a href="newsdetail.jsp?news_id=<%=rs.getString("news_id")%>"
target=_blank><%=rs.getString("news_title")%></a></div>
</td>
<td width="15%">
<div align="center"><%=rs.getString("news_hits")%></div>
</td>
<td width="15%">
<div align="center"><%=rs.getString("news_source")%></div>
</td>
<td width="10%">
<div align="center"><%=rs.getString("news_author")%></div>
</td>
<td width="18%">
<div
align="center"><%=rs.getString("news_time").substring(0,10)%></div>
</td>
</tr>
图2-6 分栏目显示信息
4.2.3详细信息(newsdetail.jsp)
当用户点击信息的标题查看信息的详细内容时,系统根据用户的请求信息将数据
库内与此标题有关的信息导入此页面,显示给用户查看。
连接数据库的代码:
rs = stmt.executeQuery("select * from ids_news where news_id = "+news_id+"");
//根据标题的编号从数据库中查询信息
显示信息内容代码:
<tr>
<td style="word-break:break-all"><div align="left">
<%=rs.getString("newsdetail_content")%></div>
</td>
</tr>
<%newsimg1=rs.getString("news_img1");
if (!"".equalsIgnoreCase(newsimg1)&&newsimg1!=null) { %>
<tr>
<td><div align="center">
<IMG src='upload/<%=newsimg1%>' border=0")>
</div>
</td>
</tr>
<%
}%>
<% newsimg2=rs.getString("news_img2");
if (!"".equalsIgnoreCase(newsimg2)&&newsimg2!=null) { %>
<tr>
<td><div align="center">
<IMG src='upload/<%=newsimg2%>' border=0")>
</div>
</td>
</tr>
<%
}%>
<% newsimg3=rs.getString("news_img3");
if (!"".equalsIgnoreCase(newsimg3)&&newsimg3!=null) { %>
<tr>
<td><div align="center">
<IMG src='upload/<%=newsimg3%>' border=0")>
</div>
</td>
</tr>
图2-7 详细信息
4.3信息搜索界面
显示搜索栏目的代码:
<table width="98%" border="0" bordercolor="#FFFFFF" background="bg.gif" bgcolor="#FFFFFF">
<tr bgcolor="#D8FEE4">
<td colspan="2" class="board_name"> <div align="left">
信息搜索
</div>
</td>
</tr>
<tr>
<td align="center">
<form name="form1" method="post" action="search.jsp">
请 输 入 关 键 字<br>
<input name="strSearchWord" type="text" size="10" class=input value=""><br>
<br><input type="submit" name="Submit" class=button value="确 定"> </form>
</td>
</tr>
</table>
</td>
</tr>
</table>
图2-8信息搜索界面
4.4后台管理功能
4.4.1后台登录界面(admin/index.jsp)
在浏览器的地址栏输入http://localhost:8080/infods/admin/login.jsp进入系统后台管
理系统。
显示登录界面代码:
<form action="login.jsp" method=post name=form1 onsubmit="return formCheck()">
<table width="50%" border="0" cellspacing="5" cellpadding="6" align="center">
<tr>
<td> <div align="center"><font size="2"><b>用户账号:</b></font>
<input type="text" name="user_account" class="input" size="18" maxlength="16" onMouseOver=this.focus()>
</div></td>
</tr>
<tr>
<td> <div align="center"><font size="2"><b>登陆密码:</b></font>
<input type="password" name="user_password" class="input" size="18" maxlength="14" onMouseOver=this.focus()>
</div></td>
</tr>
<tr>
<td> <div align="center">
<input name="submit" type="submit" class="button" value="登 陆"> </div></td>
</tr>
</table>
</form>
判断输入账号、用户密码是否有误的代码:
<SCRIPT language=JavaScript>
function formCheck()
{if(document.form1.user_account.value=="")
{alert("请输入您的帐号!");
document.form1.user_account.focus();
return false;}
if(document.form1.user_password.value=="")
{alert("请输入您的用户密码!");
document.form1.user_password.focus();
return false;}
}</SCRIPT>
图2-9 后台登录界面
4.4.2用户修改口令界面(password_man.jsp)
用户可以用此功能更改自己的登录口令。用户需输入自己的旧密码,系统验证旧密码正
确无误后,将新密码更新到数据库中。代码如下:
if(user_password_new!=null
user_password_new1!=null&&user_password_old!=null)
{
if(user_password_new.equals(user_password_new1)&&user_password_new.length()>=6)
{sql = "select count(*) as user_num from ids_user where user_id="+session.getValue("user_id")+"
user_password='"+user_password_old+"'";
rs = stmt.executeQuery(sql);
rs.next();
if(Integer.parseInt(rs.getString("user_num"))==1)
{
sql = "update ids_user Set user_password ='"+user_password_new+"' where user_id ="+session.getValue("user_id")+"";
stmt.executeUpdate(sql);
%>
<script language=vbscript>
msgbox "操作成功!您的密码已经修改"
</script>
<%
}
else {
%>您的原密码好象不对耶!
<%
}
}
&& and
else {%>
您两次输入的密码不相同!<br>或你的新密码太短
<%
}
}
stmt.close();
%>
图2-10 用户修改口令界面
4.4.3管理用户界面(user_man.jsp)
管理员可以用此功能对后台普通用户进行管理,包括添加新用户,修改用户权限,
删除用户。
添加新用户代码:
if("add".equalsIgnoreCase(request.getParameter("action")))
{
String user_account=request.getParameter("user_account").trim(); String user_name=request.getParameter("user_name").trim();
String user_password=request.getParameter("user_password").trim(); String user_email=request.getParameter("user_email").trim(); String user_mobile=request.getParameter("user_mobile").trim(); String user_qq=request.getParameter("user_qq").trim();
int
user_power=Integer.parseInt(request.getParameter("user_power").trim());
if(user_account.length()>=2&&user_name.length()>=2)
{
sql = "insert into ids_user (user_account,user_name,user_password,user_email,user_mobile,user_qq,user_power)
values('"+user_account+"','"+user_name+"','"+user_password+"','"+user_email+"','"+user_mobile+"','"+user_qq+"',"+user_power+")"; stmt.executeUpdate(sql);
}
}
修改用户信息代码:
if("modify".equalsIgnoreCase(request.getParameter("action"))) {
String user_account=request.getParameter("user_account").trim(); String user_name=request.getParameter("user_name").trim();
String user_password=request.getParameter("user_password").trim(); String user_email=request.getParameter("user_email").trim();
String user_mobile=request.getParameter("user_mobile").trim(); String user_qq=request.getParameter("user_qq").trim();
int
user_power=Integer.parseInt(request.getParameter("user_power").trim());
if(user_account.length()>=2&&user_name.length()>=2)
{
sql = "update ids_user set user_account = '"+user_account+"',user_name =
'"+user_name+"',user_password='"+user_password+"',user_email='"+user_email+"',user_mobile='"+user_mobile+"',user_qq='"+user_qq+"',us
er_power="+user_power+" where user_id = "+user_id+"";
stmt.executeUpdate(sql);
}
}
删除用户代码:
if("delete".equalsIgnoreCase(request.getParameter("action"))) { sql = "delete from ids_user where user_id = "+user_id+""; stmt.executeUpdate(sql);
}
图2-11 管理用户界面
4.4.4栏目管理界面(board_man.jsp)
管理员可以对网站的栏目进行管理。包括栏目的添加、修改、删除等操作。
添加栏目代码:
if("add".equalsIgnoreCase(request.getParameter("action")))
{ board_id=Integer.parseInt(request.getParameter("board_id").trim());
type_id=Integer.parseInt(request.getParameter("type_id").trim()); boardnum=Integer.parseInt(request.getParameter("board_num").trim());
String board_name=request.getParameter("board_name").trim();
String board_describ=request.getParameter("board_describ").trim(); if(board_name.length()>=2)
{
sql
= "insert into ids_board
(board_id,board_num,type_id,board_name,board_describ)
values('"+board_id+"','"+boardnum+"','"+type_id+"','"+board_name+"','"+board_describ+"')";
stmt.executeUpdate(sql);
}
}
修改栏目代码:
if("modify".equalsIgnoreCase(request.getParameter("action")))
{board_id=Integer.parseInt(request.getParameter("board_id").trim());
type_id=Integer.parseInt(request.getParameter("type_id").trim()); boardnum=Integer.parseInt(request.getParameter("board_num").trim());
String board_name=request.getParameter("board_name").trim();
String board_describ=request.getParameter("board_describ").trim(); if(board_name.length()>=2)
{
sql = "update ids_board set board_id='"+board_id+"',
board_name = board_num='"+boardnum+"',type_id='"+type_id+"',
'"+board_name+"',board_describ = '"+board_describ+"' where board_id = '"+board_id+"'";
stmt.executeUpdate(sql);
}
}
删除栏目代码:
if("delete".equalsIgnoreCase(request.getParameter("action"))) {
rs=stmt.executeQuery("select news_id from ids_news where type_num ="+board_id+"");
if(rs.next())
out.print("此栏目有信息,无法删除!");
else
{
sql = "delete from ids_board where board_id ="+board_id+"";
stmt.executeUpdate(sql);
}
}
图2-12 栏目管理界面
三. 调试及测试
1.调试过程中遇到的主要问题及解决方法
问题描述:如何使sql server2000数据库与tomcat建立连接。
解决办法:使用JDBC-ODBC桥连接访问数据库。首先建立数据源DSN,在“控制面板-管理工具-数据源“中建立 。这个数据源对应系统中所用到的数据库idsdb。这样就可以通过Connection conn = DriverManager.getConnection("jdbc:odbc:idsdby","sa","");代码与数据库idsdb进行连接了。
问题描述:当用户向服务器发送一个请求时,服务器如何获取用户信息。
解决办法:可以使用request对象的getParameter方法。
问题描述:当有多个用户同时向服务器发出请求时,服务器如何识别他们的信息。
解决办法:可以利用session对象,当用户连接到服务器后JSP引擎就会为他创建一个session对象,不同的用户有不同的session对象,服务器通过session对象识别用户,通过session提
供的方法获取用户信息。
2.对设计和编码的回顾讨论和分析
2.1分页浏览功能的实现:
预先设定每页要显示的记录数,通过while循环来控制,统计总的记录数,计算要显示的页数,并对每一页建立链接,通过点击要显示的页码来查看全部的记录。
<%
if(request.getParameter("page")==""||request.getParameter("page")==null)
intCurrentPage = 1;
else
{
intCurrentPage = Integer.parseInt(request.getParameter("page")); if(intCurrentPage<1) intCurrentPage = 1;
} //得到当前页数
* from ids_news where rs=stmt.executeQuery("select
type_num="+type_id+" order by news_id desc");
rs.last();
intRowCount = rs.getRow();
intPageCount = (intRowCount+intPageSize-1)/intPageSize;
if(intCurrentPage>intPageCount) intCurrentPage=intPageCount; //对当前页数的控制
if(intPageCount>0)
{
rs.absolute((intCurrentPage-1)*intPageSize+1);
//for(color=0,i=0;i<intPageSize&&!rs.isAfterLast();color++,i++) i=0;
do {
%>
//所要显示的内容
<%
i++;
}
while(rs.next()&&i<intPageSize);
}
%>
2.程序运行的时空效率分析
程序在执行对数据库查找时所耗费的时间和空间最大。因为程序首先要连接数据库,执行查询后,将返回的信息保存在结果集ResultSet的对象中。查询需要消耗时间,保存返回查询的信息需要空间。所以在编写查询语句时尽量使查询的时间缩短,同时返回的数据精简这样才能提高时空效率。另外利用循环语句实现多条信息的输出也可以降低重复的代码对空间的消耗。
四、经验和体会
在本次课程设计的过程中,通过指导老师的细心指导,使我不仅在知识水平和解决实际问题的能力上有了很大的提高。整个课程设计期间,我都基本上处于一个不段学习的状态,配置tomcat环境并与数据库建立连接就花了我很长时间。Jsp虽然是JAVA的一个部分,但跟上学期学习的JAVA程序设计语言还是不太一样,另外编网页的html语言我以前接触的也很少。通过这次课程设计让我受益匪浅,并深切的体会到理论联系实际的重要性,认识到提高运用知识、解决实际问题的能力是十分重要的。通过这次课程设计让我对JSP有了深层次的掌握,并学会如何自学查阅技术文档去解决问的方法。也非常感谢指导老师给我提供的帮助和指导,让我能克服上传图片时所遇到的困难。由于时间和能力的不足,我的设计还有许多需要待改进的地方。通过本次设计,我积累了经验也学到了很多知识,相信以后我会做的更好。
五、参考资料
[1] 吕凤羽、马皓《JAVA程序设计》清华大学出版社
[2] 耿祥义 《JAVA课程设计》 清华大学出版
[3] 黄小东 《Java课程设计案例精编》中国水利水电出版社
[4] 印旻 《Java与面向对象程序设计》清华大学出版社
六、主要源代码
Indexx.Jsp
<%@ page contentType="text/html; charset=GB2312" %> <%@ page import="java.util.*,java.sql.*"%>
<%@ include file = "parameter.jsp" %>
<%
request.setCharacterEncoding("GB2312");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn
DriverManager.getConnection("jdbc:odbc:idsdby","sa",""); Statement stmt=conn.createStatement();
ResultSet rs=null,rs1=null;
rs=stmt.executeQuery("select * from ids_board");
///////////////////////// the varity init */
int intDisplay,newslength;
int typeid;
intDisplay = param[0];
newslength = param[1];
String htmltitle;
htmltitle = msg[0];
///////////////////* 得到横目录
String[] vtitle = new String[100];
String[] vlink = new String[100];
int vtitle_count = 0;
while(rs.next())
{ vlink[vtitle_count] = rs.getString("type_id");
vtitle[vtitle_count] = rs.getString("board_name"); vtitle_count++;
}
rs.close();
///////////////////变量定义
String board_name;
=
int board_num;
/////////////////////初始化页面参数值
%>
<%@ include file = "header1.jsp" %>
信息发布系统
<%@ include file = "header2.jsp" %>
<!-- this table is used to display the content -->
<table width="760" border="0" cellpadding="0" cellspacing="0" bordercolor="#ffffff" bgcolor="#ffffff">
<tr>
<td width="73%" height="207" valign="top" bordercolor="#FFFFFF" bgcolor="#FFFFFF" valign="top">
<!-- 栏目一标题显示 -->
<table width="100%" height="207" border="0" cellpadding="2" cellspacing="0" bordercolor="#000000" bgcolor="#FFFFFF">
<tr>
<td width="50%" style="border-right: 1 solid #66cc00">
<%rs= stmt.executeQuery("select * from ids_board where board_num='1' ");
%>
<!-- -栏目一信息显示区- -->
<table width="100%" height="207" border="0" cellpadding="0" cellspacing="1" bordercolor="#000000">
<tr>
<td width="68%" class="board_name" bgcolor="#e5fee5"><%=vtitle[0]%></td>
<td width="32%" bgcolor="#e5fee5"> <div align="center"><a href="more_news.jsp?board_num&board_name" target=_blank>更多...</a> </div>
</td>
</tr>
<%rs.close(); %>
<%rs= stmt.executeQuery("select * from ids_news where type_num='"+vlink[0]+"'");
int iii;
for (iii=0;iii<intDisplay;iii++) {
if(rs.next()) {
%>
<tr>
<td width="68%">
<IMG height=12 src="square.gif" width=12 border=0 valign="middle">
<a href="newsdetail.jsp?news_id=<%=rs.getString("news_id")%>" target=_blank><%=rs.getString("news_title")%></a>
</td>
<td width="32%"><span class="copyright">
[<%=rs.getString("news_time").substring(0,10)%>]</span>
</td>
</tr>
<%
}
else {
%>
<tr>
<td> </td>
<td> </td>
</tr>
<%
}
}
%>
</table>
<!-- 栏目一 end ------- -->
</td>
<%rs.close(); %>
<td width="50%">
<!--栏目二标题显示区-->
<%
rs= stmt.executeQuery("select * from ids_board where board_num='2'");
%>
<table width="100%" height="207" border="0" cellpadding="0" cellspacing="1" bordercolor="#000000">
<tr>
<td width="68%" class="board_name" bgcolor="#e5fee5"><%=vtitle[1]%></td>
<td width="32%" bgcolor="#e5fee5"><div align="center"><a href="more_news.jsp?type_id&board_name%>" target=_blank>更多...</a> </div> </td>
</tr>
<%rs.close(); %>
<%
rs= stmt.executeQuery("select * from ids_news where type_num='"+vlink[1]+"'");
for (iii=0;iii<intDisplay;iii++) {
if(rs.next()) {
%>
<tr>
<td width="68%">
<IMG
height=12 src="square.gif" width=12 border=0
valign="middle">
<a href="newsdetail.jsp?news_id=<%=rs.getString("news_id")%>" target=_blank><%=rs.getString("news_title")%></a>
</td>
<td width="32%"><span class="copyright">
[<%=rs.getString("news_time").substring(0,10)%>]</span>
</td>
</tr>
<%
}
else {
%>
<tr>
<td> </td>
<td> </td>
</tr>
<%
}
}
%>
</table>
<!-- 栏目二信息显示结束 -->
</td>
<td width="13%" height="207" valign="top">
<!----- 搜索 --- -->
<table width="98%" border="0"
background="bg.gif" bgcolor="#FFFFFF"
bordercolor="#FFFFFF"