新闻信息发布平台
摘要
【摘要】
随着计算机科学的发展,数据库技术在Internet中的应用越来越广泛,为广大网络用户提供了更加周到和人性化的服务。个性化已逐渐成为当今Web应用的潮流。利用JSP技术开发的网站新闻管理系统,实现了网站新闻的动态管理,因为可以用来动态发布新闻信息,所以使得对信息的管理更加及时、高效,提高了工作效率。
【关键词】Struts组建编程模型、ActionForm的说明、样式层、持久层、服务层、控制层。
目录
摘要 (1)
0 引言 (3)
1 系统分析 (4)
1.1 需求分析 (4)
1.2 可行性分析 (4)
2 总体设计 (4)
2.1 项目规划 (4)
2.2 系统功能结构图 (4)
3 系统设计 (5)
3.1 设计目标 (5)
3.2 开发及运行环境 (5)
3.3 逻辑结构设计 (5)
4 网站总体架构 (5)
4.1 文件布局 ................................................................................... 错误!未定义书签。
4.2 网站首页的运行结果 (5)
4.2 类的分布 (7)
5 网站后台主要功能模块设计 (7)
5.1 后台登录模块设计 (7)
5.2 总管理员设置模块设计 (11)
5.3 更改总管理员密码模块设计 ................................................... 错误!未定义书签。
5.4 新闻信息管理 ........................................................................... 错误!未定义书签。
5.5 总结 (22)
6 网站前台主要功能模块设计 (22)
6.1 今日新闻的显示 (22)
6.2 输入新闻的关键字查找新闻 (25)
6.3 新闻人物的查看和投票 ........................................................... 错误!未定义书签。
7 小结 (26)
附录一参考文献.................................................................................... 错误!未定义书签。附录二数据表 (27)
附录三文件架构图 (29)
0 引言
Internet的蓬勃发展,使新闻的传播方式发生了巨大的变化,传统的信息传播媒体电视、广播、报纸已经不再是人们茶余饭后的主要精神甜点,人们更多的开始关注网络新闻。由于互联网所容纳的信息量大、内容丰富、信息及时、准确,更有相关信息的全面的介绍与比较,大大地方便了人们的阅读,因此在短短几年的时间里,互联网便济身于众多媒体之间,并具有相当一部分媒体人群。借此东风,新闻网也迅速发展起来,它内容丰富,涉及到商业、工业、农业、银行、财政、教育、娱乐、信息等各个产业,信息量大,不仅有实事新闻,还有相关的行业信息,同时新闻网具有互联网所具备的一切特性。在全球网络化、信息化的今天,新闻网迅速发展,大大地丰富了人们的生活,不知不觉中,它已经成为人们生活中不可或缺的重要组成部分。
1 系统分析
1.1 需求分析
通过相关调查,要求网站具有以下功能; 通过网络,展示各行业新闻及相关信息。 提供新闻搜索功能。
设置新闻人物投票功能,并统计投票数量。 支持其他网站的友情链接。 为后台管理提供管理入口。
1.2 可行性分析
新闻发布系统后台对新闻作了详细的分类,前台以分类形式显示新闻的详细信息,满足了人们浏览新闻网时分类查看新闻信息的要求,同时提供新闻信息查询功能,方便浏览者查找相关的新闻信息。新闻网后台则通过对总管理员设置和管理员添加等模块对网站管理员进行管理,保证了网站的安全性。
2 总体设计
2.1 项目规划
新闻网是一个功能完善的新闻类网站,由客户前台新闻浏览和后台新闻管理两大部分组成。
前台功能模块
前台主要包括新闻分类、显示新闻详细信息、新闻信息查询、新闻人物投票、友情链接、提供后台登录口。
后台管理模块
后台主要包括后台总管理员设置及密码修改、添加管理员、管理员信息设置、新闻类型管理、新闻详细类型管理、新闻信息管理、链接管理、新闻人物管理、退出后台。
2.2 系统功能结构图
新闻发布系统前台功能结构,如图1所示。
图1 新闻网前台功能结构图
新闻网后台功能结构,如图2所示。
新闻网前台功能结构
新闻分类
新闻详细信息
新闻信息查询
新闻人物投票
友情链接
后台登录口
图2 新闻网后台功能结构图
3 系统设计
3.1 设计目标
本网站是根据各行业新闻信息分类进行开发设计的,主要实现如下目标: 分类展示各行业新闻。 显示新闻的详细信息。 设置新闻搜索功能模块。
设置新闻人物投票及投票数统计功能。 提供其他网站的友情链接。
3.2 开发及运行环境
硬件平台:
CPU :P41.8GHz ; 内存:256MB 以上。 软件平台:
操作系统:Windows 2000; 数据库:SQL Server 2000;
开发工具包:JDK Version1.4.1; Web 服务器:Tomcat ;
浏览器:IE5.0,推荐使用IE6.0; 分辨率:最佳效果1024*768像素。
3.3 逻辑结构设计
本系统数据库采用SQL server 2000数据库,系统数据库名称为db_news 。数据库db_news 中包含7张表。关于数据库中的数据表请参见附录B
4 网站总体架构
4.1 网站首页的运行结果
网站前台首页的运行结果如图5所示。
新闻网后台功能结构
总管理员设置
总管理员修改密码
添加管理员
管理员信息设置
新闻类型管理
新闻详细类型管理
新闻信息管理
新闻人物管理
链接管理
退出后台
图5 网站前台首页运行结果
网站框架图说明如下:
表`1 网站前台首页页面说明 区域 名称 说明
对应文件 1 网站导航 主要展示网站的旗帜广告和站内导航条
typeNewWatch.do 2 功能模块 主要用于显示导航模块中的功能 linkSelect.do
3
内容显示
主要用于显示功能模块中的内容
dateNews.do?type=今日新闻
网站后台首页的运行结果如图6所示。
图6 网站后台首页运行结果
网站后台首页中的各部分说明如表2所示。
表2 网站后台首页页面说明 区域 名称 说明
对应文件 1
网站导航
主要展示网站的旗帜广告和站内导航条
typeTopAction.do
1
2 3
2
1
3
2 功能模块 主要用于显示导航模块中的功能 left_main.jsp 3
内容显示
主要用于显示功能模块中的内容
right_main.jsp
4.2 类的分布
新闻发布系统是利用Struts 框架实现的,新闻发布系统中类的分布如图7所示。
图7 类的分布
类存放的文件夹功能如表3所示。
表3 类存放的文件夹功能列表
名称
功能
持久层(dao 文件夹) 各种方法(增加、删除、修改和查询)的实现
样式层(domain 文件夹) 所存放的类是Actionform 类,在类中必须要继承ActionForm (也就是entends ActionForm )
服务层(server 文件夹) 存放的dao 层功能的业务的类 控制层(webtier 文件夹) 存放在jsp 页面中存在的方法实现的类
工具层(tool 文件夹)
类名为JDBConnection.java (连接数据库的功能)、类名为Chinese.java (字符级转换的类)、类名为SessionLib (用来存在session 变量)
5 网站后台主要功能模块设计
5.1 后台登录模块设计
在新闻发布系统中,后台管理员分为两种:一个是普通管理员,他可以对新闻类型进行
定义,也可以发布新闻、设置投票人数及网站链接;另一个是总管理员,他除了可操作以上功能外,还可以对普通管理员进行设置,总管理员和普通管理员都能通过后台登录页面登录后台。
在前台单击“进入后台”超链接,即可进入到后台登录页面,如图8所示。
持久层 样式层 前台控制层 服务层 后台控制层
工具层
图8 后台登录页面
1.样式层的类
具体代码如下
/*******************************
ManagerActionForm.java***************************/
package com.victor.domain;
import org.apache.struts.action.*;
public class ManagerActionForm extends ActionForm {
private Integer managerID; //在数据库中的流水号
private String managerIssueDate; //管理员添加日期
private String managerMark; //管理员的标示
private String managerName; //管理员帐号
private String managerPassword; //管理员密码
private String managerRealName; //管理员的真实姓名
private String managerType; //管理员的权限
public ManagerActionForm() {
this.managerID = new Integer( -1);
this.managerIssueDate = "";
this.managerMark = "";
this.managerName = "";
this.managerPassword = "";
this.managerRealName = "";
this.managerType = "";
}
public Integer getManagerID() {
return managerID;
}
public void setManagerID(Integer managerID) {
this.managerID = managerID;
}
………………………………………………….
2.持久层的方法
验证输入的内容是否正确有很多方法,笔者采用的是利用sql语句的方法进行验证输入账
号和密码。对输入的账号及密码判断是否正确。
利用接口类的方法实现的代码如下:
/*********************************
ManagerDao.java*******************************/
public interface ManagerDao {
public ManagerActionForm managerCheck(ManagerActionForm managerActionForm)
}
实现接口的方法的代码如下:
/*******************************
ManagerDaoImpl.java*****************************/
//核对普通管理员帐号和密码
public class ManagerDaoImpl implements ManagerDao { //实现接口类中的方法用implements加上接口类名
public ManagerActionForm managerCheck(ManagerActionForm managerActionForm) { ManagerActionForm manager = null; 定义一个Object型的数据,初使化为null
JDBConnection connection = new JDBConnection(); //连接数据库的方法
String sql = "select * from tb_manager where Name='" +
managerActionForm.getManagerName() + "'";
try {
ResultSet rs = connection.executeQuery(sql); // 把sql语句传到JDBConnection类中去
while (rs.next()) {
manager = new ManagerActionForm();
manager.setManagerPassword(rs.getString(3)); //查找过所需要的字段数据
}
}
catch (SQLException ex) {
}
connection.close();
return manager; //把对象返回到方法中去
}
}
3.服务层的方法
利用接口类的方法实现的代码如下:
/********************************
ManagerFacade.java*****************************/
public interface ManagerFacade {
public ManagerActionForm managerCheck(ManagerActionForm managerActionForm)
}
实现接口的方法的代码如下:
/*******************************
ManagerFacadeImpl.java**************************/
public class ManagerFacadeImpl implements ManagerFacade { //实现接口类的方法用implements
private ManagerDao managerDao;
public ManagerFacadeImpl() {
this.managerDao = new ManagerDaoImpl(); //实现dao类的方法。
}
public ManagerActionForm managerCheck(ManagerActionForm managerActionForm) { return this.managerDao.managerCheck(managerActionForm); //调用持久层的方法}
}
4.管理员登陆控制层的方法
/****************************
ManagerCheckAction.java****************************/
package com.victor.webtier.managerAction;
//核对帐号和密码
public class ManagerCheckAction extends Action {
private ManagerFacade managerFacade;
public ManagerCheckAction() {
this.managerFacade = new ManagerFacadeImpl();
}
public ActionForward perform(ActionMapping actionMapping, ActionForm actionForm,
HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) {
Chinese chinese = new Chinese();
ManagerActionForm managerActionForm = (ManagerActionForm) actionForm;
managerActionForm.setManagerName(chinese.str(httpServletRequest.
getParameter("managerName")));
ManagerActionForm manager = this.managerFacade.managerCheck(managerActionForm);
//通过对象调用方法
if (manager == null) {
return actionMapping.findForward("managerWrong");//通过manager是空值的话,返回错误页面。
}
else if
(!manager.getManagerPassword().equals(httpServletRequest.getParameter( "managerPassWord"))) {
return actionMapping.findForward("managerWrong");//查找的值与在jsp页面中的值不一致,返回错误页面。
}
return actionMapping.findForward("managerRight"); //查找的值与在jsp页面中的值一致,返回正确页面。
}}
5.struts-config.xml中的配置
在这里主要配置formBean和action动作指向的jsp页面。代码如下:
/********************************
struts-config.xml*********************************/
type="com.victor.webtier.managerAction.ManagerCheckAction" validate="true" scope="request" path="/managerCheckAction">
6.管理员登陆jsp页面的说明
/*********************************
managerCheck.jsp*********************************/
管理员登陆
5.2 总管理员设置模块设计
总管理员在数据库中是惟一的,总管理员的信息在页面中不会显示出来,在此页面中只能修改自己的密码及对普通管理员进行设置。
用户单击“总管理员设置”超链接,进入总管理员设置页面。系统首先对用户输入的账户和密码进行核对。因为并不是所有的管理员都能够有这个权利,所以在SQL语句中应体现惟一性的条件,样式层所要调用的类是ActionForm,跟用户登录时调用的actionForm是同一个类,在这里就不做介绍了。
1.总管理员的登录操作
登录方法主要用于系统管理员进行系统维护时,作为登录后台时密码验证之用。在用户输入用户账号和密码之后,调用该方法即可验证该用户是否合法。单击“总管理员设置”超链接,进入到总管理员设置页面,实现此超链接的jsp代码如下:
/***********************************
left_main.jsp*********************************/
总管理员页面的运行结果如图9所示。
图9 总管理员页面运行结果
总管理员页面所对应的jsp页面代码如下:
/*********************************
adminPassword.jsp******************************/
在上面的jsp页面代码中,action触发的是adminAction.do的方法,它与后台登录的方法相似,只是调用的SQL语句不同。
在持久层中查询总管理员的方法的代码如下:
接口类的方法:
/*********************************
ManagerDao.java*********************************/
public ManagerActionForm adminCheck(ManagerActionForm managerActionForm)
实现接口类的方法:
/***********************************
ManagerDaoImpl.java***************************/
public ManagerActionForm adminCheck(ManagerActionForm managerActionForm) {
ManagerActionForm manager = null; //初始化对象
JDBConnection connection = new JDBConnection();
String sql = "select * from tb_manager where Name='" +
managerActionForm.getManagerName() + "' and mark='" +
managerActionForm.getManagerMark() + "'";
try {
ResultSet rs = connection.executeQuery(sql); //执行查找的方法
while (rs.next()) {
manager = new ManagerActionForm();
manager.setManagerPassword(rs.getString(3)); //取出查询的密码
}
}
catch (SQLException ex) {
}
connection.close(); //关闭数据库
return manager;
}
在服务层中实现持久层的方法如下:
接口类的方法:
/*******************************
ManagerFacade.java******************************/
public interface ManagerFacade {
public ManagerActionForm adminCheck(ManagerActionForm managerActionForm);
}
实现接口类的方法:
/*******************************
ManagerFacadeIm.java****************************/
public class ManagerFacadeImpl implements ManagerFacade {
private ManagerDao managerDao;
public ManagerFacadeImpl() {
this.managerDao = new ManagerDaoImpl();
}
public ManagerActionForm adminCheck(ManagerActionForm managerActionForm) {
return this.managerDao.adminCheck(managerActionForm); //调用持久层的方法}
}
具体在控制层的代码如下:
/*******************************
ManagerDaoImpl.jsp******************************/
package com.victor.webtier.managerAction;
import org.apache.struts.action.*;
import javax.servlet.http.*;
import com.victor.domain.ManagerActionForm;
import com.victor.service.ManagerFacade;
import com.victor.service.ManagerFacadeImpl;
//核对总管理员帐号和密码
public class AdminCheckAction
extends Action {
private ManagerFacade managerFacade;
public AdminCheckAction() {
this.managerFacade = new ManagerFacadeImpl();
}
public ActionForward perform(ActionMapping actionMapping, ActionForm actionForm,
HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
ManagerActionForm managerActionForm = (ManagerActionForm) actionForm;
managerActionForm.setManagerName(httpServletRequest.getParameter("Name"));//从页面上取值
managerActionForm.setManagerMark("总管理员"); //取固定的名称
ManagerActionForm manager = this.managerFacade.adminCheck(managerActionForm);
if (manager == null) { //if判断,做比较
return actionMapping.findForward("adminWrong");
}
else if
(!manager.getManagerPassword().equals(httpServletRequest.getParameter("adminPassWord"))) { return actionMapping.findForward("adminWrong");
}
return actionMapping.findForward("adminRight");
}
}
上面的类文件中加载了ManagerActionForm类,这个类是属于ActionForm类,相当于JavaBean,在这里主要实现进行取值和赋值的功能。
struts-config.xml的配置的代码如下:
/*********************************
struts-config.xml********************************/
type="com.victor.webtier.managerAction.AdminCheckAction" validate="true" scope="request" path="/adminAction">
如果用户输入的总管理员的账户和密码不正确,此时jsp页面中将提示用户密码不正确。实现此功能的jsp代码如下:
/******************************
adminPasswordFail .jsp******************************/
<%@ page contentType="text/html; charset=GBK" %>
密码不正确
2秒种后从新输入密码
2.对管理员的查询操作
总管理员登录成功后,系统将对除了总管理员以外的所有普通管理员进行查询操作。此时页面运行结果如图10所示。
图10 总管理员查询功能
持久层的查询代码如下:
接口类的代码:
/********************************
ManagerDao.java*********************************/
package com.victor.dao;
import java.util.List;
import com.victor.domain.ManagerActionForm;
public interface ManagerDao {
public List managerSelect(ManagerActionForm managerActionForm); //在接口类的查询方法方法
}
实现接口类的代码:
/*******************************
ManagerDaoImpl.java******************************/
//查出所有的管理员
public List managerSelect(ManagerActionForm managerActionForm) {
JDBConnection connection = new JDBConnection(); //调用连接数据库的方法
List list = new ArrayList(); //定义一个List容器的对象,去实现ArrayList()中的方法
String sql = "select * from tb_manager where mark='" +
managerActionForm.getManagerMark() + "'"; //有条件的查询语句try {
ResultSet rs = connection.executeQuery(sql); //调用JDBConnection查询的方法
while (rs.next()) {
ManagerActionForm manager = new ManagerActionForm();
manager.setManagerID(Integer.valueOf(rs.getString(1)));
manager.setManagerName(rs.getString(2));
manager.setManagerPassword(rs.getString(3));
manager.setManagerRealName(rs.getString(4));
manager.setManagerIssueDate(rs.getString(5));
manager.setManagerMark(rs.getString(6));
list.add(manager); //l利用对象list的add()方法把查出来的数据放在List容器中
}
connection.close(); //关闭数据库
}
catch (SQLException ex) {
}
return list; //返回值要与方法的类型要一致
}
调用类的方法如图11所示:
图11 调用的方法
服务层的查询代码如下:
接口类的代码:
/*********************************
ManagerFacade.java****************************/
public interface ManagerFacade {
public List managerSelect(ManagerActionForm managerActionForm);
}
实现接口类的代码:
/********************************
ManagerFacade.java*****************************/
public class ManagerFacadeImpl implements ManagerFacade {
private ManagerDao managerDao;
public ManagerFacadeImpl() {
this.managerDao = new ManagerDaoImpl();
}
public List managerSelect(ManagerActionForm managerActionForm) {
return this.managerDao.managerSelect(managerActionForm); //利用对象managerDao调用持久层的方法
}
}
控制层实现的代码如下:
/*********************************ManagerFacade.java************************** **/
package com.victor.webtier.managerAction;
import org.apache.struts.action.*;
import javax.servlet.http.*;
import com.victor.domain.ManagerActionForm;
import com.victor.service.ManagerFacade;
import com.victor.service.ManagerFacadeImpl;
import java.io.UnsupportedEncodingException; //加载所需要的类//总管理员全部查看信息
public class AdminSelectAction extends Action {
private ManagerFacade managerFacade;
public AdminSelectAction() {
this.managerFacade = new ManagerFacadeImpl();
}
public ActionForward perform(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
ManagerActionForm managerActionForm = (ManagerActionForm) actionForm;
managerActionForm.setManagerMark("普通管理员");
httpServletRequest.setAttribute("listAdminSelect",managerFacade.managerSelect(managerActionF orm));
return actionMapping.findForward("adminSelectAction");
}
}
struts-config.xml的配置:
/*******************************
struts-config.xml*********************************/
type="com.victor.webtier.managerAction.AdminSelectAction" validate="true" scope="request" path="/adminSelectAction"> path="/jsp/managerBack/aManager/adminSelect.jsp" />
管理员查询jsp代码的实现:
/**********************************adminSelect.jsp***************************** **/
<%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.List"%>
<%@ page import="java.sql.*"%>
<%@ page import="com.victor.domain.ManagerActionForm"%>
function projectDelete(date){
if(confirm("是否删除这一组数据吗?"))
window.location="adminDeleteAction.do?managerID="+date;
}
<%List adminList=(List)request.getAttribute("listAdminSelect");%>
查看全部信息
数据库ID | 帐号 | 真实姓名 | 注册时间 | 管理员类别 | 操作 |
<%=managerActionForm.getManagerID()%> | <%=managerActionForm.getManagerName()%> | <%=managerActionForm.getManagerRealName()%> | <%=managerActionForm.getManagerIssueDate()%> | <%=managerActionForm.getManagerMark()%> | href="adminSelectOneAction.do?ID=<%=managerActionForm.getManagerID()%>">修改 除 |
通过以上的代码就能够实现对所有的管理员的查询功能。总管理员除了具备查询功能外,还可以修改及删除管理员的信息。
3.修改之前的条件查询操作
在执行修改之前首先是对要修改的数据进行查询。样式层所要调用的类是ActionForm,与用户登录调用的actionForm是同一个类,在这里就不做介绍了,实现的过程如下。
具体在持久层的条件查询代码如下:
接口类的方法的代码:
/**************************** ManagerDao.java ********************************/ public interface ManagerDao {
public List adminSelectOne(ManagerActionForm managerActionForm);
)
实现接口类的方法的代码:
/**************************** ManagerDaoImpl.java
*********************************/
//总管理员的单独查找,查找的内容在下一页中显示
public List adminSelectOne(ManagerActionForm managerActionForm) {
ManagerActionForm manager = null;
List list = new ArrayList();
JDBConnection connection = new JDBConnection();
String sql = "select * from tb_manager where ID='" +
managerActionForm.getManagerID() + "'"; //以数据库中的流
水号为条件进行查询
ResultSet rs = connection.executeQuery(sql); //执行查询的方法
try {
while (rs.next()) {
manager = new ManagerActionForm();
manager.setManagerID(Integer.valueOf(rs.getString(1)));
manager.setManagerName(rs.getString(2));
manager.setManagerPassword(rs.getString(3));
manager.setManagerRealName(rs.getString(4));
manager.setManagerIssueDate(rs.getString(5));
manager.setManagerMark(rs.getString(6));
list.add(manager);
}
}
catch (SQLException ex) {
}