1第11章JSP实现网站新闻管理系统编程2主要内容1.新闻管理系统总体设计2.系统数据库设计3.系统基本框架4.各功能模块的设计与实现5.部署和发布系统31.新闻管理系统总体设计越来越多的B/S(浏览器/服务器)模式的数据库应用系统如电子商务、大型网站等都有一个子系统——新闻管理系统。本章介绍的实例构建了一个新闻发布系统,用户可以通过浏览器访问系统、查看新闻。对于系统的管理也是通过浏览器来完成的。它具有操作方便、快捷的优点。41、系统功能及模块浏览新闻:用户能够通过浏览器查看新闻,如果有许多条新闻,要求可以分页显示。新闻的录入(发布):要求是通过浏览器来完成,并且可以编辑新闻的格式。新闻的修改:要求通过浏览器来完成。删除新闻:根据需要,可以删除新闻。系统验证:对系统进行管理前,必须经过登录系统验证。用户不必登录即可随便查看新闻,系统管理员必须要经过身份验证才能管理系统。5系统功能模块系统包括如下模块:新闻浏览主页面、新闻浏览最终页面、系统管理主页面、发布新闻模块、修改新闻模块、删除新闻模块。62、系统实现方案对于开发一个数据库应用系统来说,首先需要选择数据库体系结构。一般说来,有两种数据库体系结构:C/S(Client/Server,客户端/服务器)结构和B/S(Browse/Server,浏览器/服务器)结构。C/S结构有两种模型,即两层模型和三层模型。在两层模型中,数据位于服务器端,客户应用程序则运行在客户机上,而业务逻辑放在客户或服务器上。三层结构是由客户应用程序(Client)、服务器管理程序(Server)和中间件(Middleware)三个部分组成。7客户应用程序是系统中用户与数据进行交互的部件。服务器程序负责有效地管理系统资源,如管理一个数据库等,其主要工作是当多个客户并发地请求服务器上的资源时,对这些资源进行最优化管理。中间件负责连接客户应用程序与服务器管理程序,协同完成一个任务,以满足用户查询管理数据的要求。例如,使用VB、PB、Delphi、VC++应用程序开发工具开发的数据库应用系统通常就是C/S结构。B/S结构一种以Web技术为基础的新型的数据库体系结构,它把传统C/S结构中的服务器部分分解为一个数据服务器与一个或多个应用服务器(Web服务器),从而构成一个三层结构的客户服务器体系结构。8B/S结构的数据库应用系统最大的好处就是实现了客户端的零安装,因为操作系统一般自带了网页浏览器,如IE(InternetExplorer),而B/S结构数据库应用系统的客户端使用的就是网页浏览器。例如,使用ASP、PHP、JSP技术开发的数据库应用系统通常就是B/S结构。本系统是通过网页浏览器进行访问的,所以本系统采用B/S结构,使用JSP技术,JSP服务器采用Tomcat5.0,后台数据库管理系统采用SQLServer2000。92.系统数据库设计对于数据库应用系统来说,设计数据库是非常重要的,也是首要的工作。一般先设计系统数据库,然后才开始设计应用程序。1、数据库需求分析根据本系统功能要求,新闻管理系统需要以下数据项。新闻资料新闻标题、新闻内容、发布日期、发布人。用户密码资料用户名、密码、是否为管理员、姓名。102、数据表设计本系统共设计两个表,分别为新闻文章表和用户表。其结构如下所示:11接下来创建数据库和数据表。①创建数据库使用【企业管理器】来创建本系统数据库,将数据库命名为“newsmanage”。②创建数据表12使用【企业管理器】来创建表article和userpassword。③数据库初始化数据库和数据表创建之后,就需要初始化数据库。因为在使用新闻管理系统时,需要登录到管理页面,进行发布新闻等管理操作,这就需要一个管理员用户,所以要在用户表userpassword中添加一条记录。如果读者对SQL语句比较熟悉,可以在【查询分析器】中编写SQL语句并执行,完成上述所有操作。133.系统基本框架新闻管理系统的功能是用户可以通过浏览器查看新闻,管理员也是通过浏览器发布和管理新闻。系统基本结构图14为了重复使用代码,可以将许多页面都使用的公共代码放在一个JSP文件中,当其他文件需要调用这些代码时,使用jsp:include操作标记将其包含进来。系统程序目录结构图15规划完系统的基本框架,下面就开始设计与实现每个子模块。首先是公共模块,因为公共模块是其他模块都需要的。然后可以按照系统操作的流程,逐步设计与实现其他子模块。1、公共模块设计公共模块是将系统其他页面中重复使用的代码集合起来,成为一个或多个文件,这样,要使用重复的代码时,只需要将公共模块包含进来就可以了。这样做的最大好处是减少JSP文件的代码,使JSP文件的程序脚本清晰简洁。4.各功能模块的设计与实现16common.jsp包含其他JSP文件中需要导入的Java类和包。JSP编译指令page指令定义了JSP文件的全局属性,其语法如下:%@pageattribute=value%当attribute属性为import={package.class|package.*}…时,表示导入的Java类或包的列表。这些导入包作用于脚本片断、表达式和声明。由于“java.lang.*”、“javax.servlet.*”、“javax.servlet.jsp.*”、“javax.servlet.http.*”在JSP编译时已经导入,所以不需要再指明了。17connectdb.jsp主要用来连接数据库以及声明相关变量,程序清单见书。分析如下:①JSP连接数据库需要两个步骤:首先要装载驱动程序,然后是打开一个数据库连接。装载驱动程序比较简单,只需要一行代码,如下面代码装载了SQLServer2000JDBC驱动程序Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver);其中com.microsoft.jdbc.sqlserver.SQLServerDriver为程序使用的JDBC驱动程序的类名。18装载了驱动程序以后,就可以用它来建立与数据库管理系统的连接。使用如下代码建立连接:Connectioncon=DriverManager.getConnection(url,sa,123);代码中需要提供URL,URL用来提供数据库服务器所在的位置,包括使用JDBC协议、服务器主机地址、数据库名等。上述代码一旦成功与数据库连接,则返回一个Connection对象con,以后对数据库进行操作都是基于con对象的。19②当需要发送和查询命令到数据库时,应该先通过Connection对象的createStatement()方法实例化一个Statement对象,代码如下:Statementsmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);③代码中声明了一个ResultSet实例rs。JDBC使用ResultSet对象来返回查询结构。对象rs将在包含“connectdb.jsp”的JSP文件中使用。④定义了一个String对象sql,用来放置SQL语句。⑤变量Title是一个全局变量,将在包含“connectdb.jsp”的JSP文件中使用,可以参考后面的JSP文件。20check.jsp用来判断是否以系统管理员的身份登录系统,防止非法用户登录到系统管理后台对系统进行破坏,其程序代码如下:%if((String)session.getValue(Enter)!=true){Stringerrmsg=error2;response.sendRedirect(login.jsp?errmsg=+errmsg);}%21程序代码中使用了会话(session)对象。会话对象类似于普遍应用程序中的全局变量。在一个Web应用程序中,当一个用户访问该应用程序时,这个会话对象使这个用户在该Web应用的所有页面共享数据。通常,我们喜欢使用会话对象在Web应用的所有页面中共享信息。可以使用putValue()和getValue()方法来保存和读取会话对象中的数据。上段代码中通过读取会话对象中的数据Enter是否为True来判断系统管理员是否登录。系统管理员在成功登录后会将Enter数据保存为True,可以参看文件“chklogin.jsp”的程序清单。22codefilter.jsp用于对新闻文章的内容进行格式转换,即在一般格式与HTML格式之间转换,如一般格式的回车换行,在HTML格式中就是一个br标记等。程序清单见书。style.cssCSS是CascadingStyleSheets(层叠样式表)的简称,通常人们把它称为样式表。在网页中使用CSS技术,可以统一应用同一种格式,简化格式设置工作,增强网页的可维护能力。对于一个大型的Web应用,通常将CSS样式定义在CSS文件中,“style.css”文件就是这样一个文件。232、【新闻浏览】主界面新闻浏览主页面“index.jsp”是用户浏览新闻的主页面,该页面的作用是将所有的新闻标题以列表形式显示出来。程序清单见书,分析如下:①程序首先将incoming目录中的“common.jsp”和“connect.jsp”包含进来。因为incomming与上述程序文件“index.jsp”在同一个目录,将这两个文件包含进来。②本页面的标题(title…/title标记)采用变量title的值,这个变量是在“connectidb.jsp”文件中定义并赋值的。读者请注意,本系统的所有界面都要使用这个变量值作为标题。24③设置如下查询的SQL语句:sql=SELECT*FROMarticle;sql是一个字符串变量,在“connectdb.jsp”文件中已经声明了,同样地,变量con、smt、rs也是在“connectdb.jsp”文件中声明的。然后通过如下语句提交并执行:rs=smt.executeQuery(sql);ResultSet实例rs用来保存SQL语句返回的结果集。④ResultSet类提供了许多方法用来操作数据。最常用的是next()和getXXX()这两个方法。25④ResultSet类提供了许多方法用来操作数据。最常用的是next()和getXXX()这两个方法。next()方法用来将记录的游标移动到下一条记录,使下一条记录变为当前行。由于游标在初始化时是在ResultSet对象第一条记录的前面,所以,第一次调用next方法就使游标移动到第一条记录,并使这一条记录作为当前行。getXXX()方法用于得到每一列的值,其中,XXX表示这一列的数据类型。26⑤用户单击相应的新闻标题,就可以打开新闻浏览最终页面“article.jsp”,代码如下:ahref=article.jsp?id=%=rs.getInt(ID)%target=_blank%=rs.getString(TITLE)%/a27⑥程序使用如下语句linkhref=incoming/style.cssrel=stylesheettype=text/css就可将前面定义的样式表包含进来,style.css文件存放在incoming目录下,这样就可以在“index.jsp”中使用样式表。新闻浏览主页面283、新闻浏览最终页面“article.jsp”的任务就是接受主页面传入的新闻ID,然后以此ID在数据库新闻文章表article中查找符合条件的记录,然后取出新闻标题、新闻内容等信息,并显示在“article.jsp”页面上。新闻浏览最终页面294、管理员登录系统新闻管理系统的后台管理用来发布、修改、删除新闻。拥有相应权限的管理员才能管理系统,所以新闻管理系统需要管理员登录系统。登录系统主要包括两个JSP文件:“login.jsp”和“chklogin.jsp”。login.jsp主要用来让管理员输入用户名和密码。程序