企业级 JAVAⅡ课程设计文档
广州大学华软软件学院
2012 年第六学期
《企业级 JAVAⅡ》课程设计
题 目:新闻网、新闻网信息管理系统
专 业:网络应用软件开发
班 级:IB01
组 长:邓理安
组 员:方泓清
递交日期:2012 年 6 月 4 日
企业级 JAVAⅡ课程设计文档
目录
新闻网信息管理系统(后台) ............................................................................................................................- 1 -
一、系统执行原理 ................................................................................................................................................- 2 -
二、系统功能需求 ................................................................................................................................................- 2 -
1、 系统功能描述 ........................................................................................................................................- 2 -
三、数据库设计 ....................................................................................................................................................- 4 -
1、数据库使用 MY SQL。 2、相关各数据库表: ..............................................................................- 4 -
1、公共模块设计与实现 ..................................................................................................................................- 5 -
2.系统各功能模块设计与实现 .................................................................................................................- 一三 -
新闻联播新闻网(前台) ..................................................................................................................................- 29 -
一、系统执行原理 ..............................................................................................................................................- 29 -
二、系统功能需求 ..............................................................................................................................................- 30 -
三、数据库设计 ..................................................................................................................................................- 31 -
1、数据库使用 MY SQL。 2、相关各数据库表: ............................................................................- 31 -
四、系统实现 ......................................................................................................................................................- 33 -
1、公共模块设计与实现 ................................................................................................................................- 33 -
系统各功能模块设计与实现 ..........................................................................................................................- 38 -
五、附录 ..............................................................................................................................................................- 60 -
新闻网信息管理系统(后台)
上课班级:IB01 学号:0940111147 姓名:方泓清
学号:0940111145 姓名:邓理安
一、系统执行原理
1.客户机将 HTTP 请求发送给 Web 服务器
服务器将该请求转发给
3.在 中的 action 的 type 实现 spring 的请求代理
4.在 spring 的配置文件中对 action 类进行注入
类中注入 sevice,service 中注入 dao,当服务器启动时,spring 对类自动设置。
6.执行顺序从 action --->service----->dao,然后返回。
将响应发送给 Web 服务器
服务器将响应转发给客户机
二、系统功能需求
1、 系统功能描述
角色:管理员
功能描述:
(1)身份验证功能:管理员只有成功登录后才可进入系统管理新闻以及相关信息。
其流程图如图 1-1-1 所示:
图 1-1-1
(2)管理员:可增加、修改、删除、查询新闻信息;可修改密码、增加管理员。
其流程图如图 1-1-2 所示:
图 1-1-2
三、数据库设计
1、数据库使用 MY SQL。
2、相关各数据库表:
①管理员表 admin(如图 1-2-1)
图 1-2-1
①新闻信息表 news(如图 2-2)
图 1-2-2
四、系统实现
1、公共模块设计与实现
Ⅱ(位于 NewsManage/WebRoot/WEB-INF 目录下)用于管理数据库连接、Hibernate
的 sessionFactory、事务管理以及 struts2 的 action。
<?xml version="" encoding="UTF-8"?>
<beans xmlns="
xmlns:xsi="
xsi:schemaLocation="
<!-- 定义c3p0数据源 -->
<bean id="dataSource" class=""
destroy-method="close">
<!-- 指定连接数据库驱动 -->
<property name="driverClass" value="" />
<!-- 指定连接数据库url -->
<property name="jdbcUrl"
value="jdbc:mysql://localhost:3306/newsmanage?useUnicode=true&characterEncoding=utf-8" />
<property name="user" value="root" />
<property name="password" value="57661一五69" />
</bean>
<!-- 定义Hibernate的sessionFactory -->
<bean id="sessionFactory"
class="">
<!-- 依赖注入上面所配置的数据源 -->
<property name="dataSource" ref="dataSource" />
<!-- 使用mappingResource属性列出全部映射文件 -->
<property name="mappingResources">
<list>
<value>com/sise/s2sh/po/</value>
<value>com/sise/s2sh/po/</value>
</list>
</property>
<!-- 配置Hibernate的sessionFactory的属性 -->
<property name="hibernateProperties">
<props>
<!-- 指定使用方言 -->
<prop key="">
</prop>
<!-- 是否在控制台输出hql语句 -->
<prop key="show_sql">true</prop>
<prop key="">update</prop>
<prop key="_size">20</prop>
</props>
</property>
</bean>
<!-- 定义事务管理 -->
<bean id="transactionManager"
class="">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 定义事务管理拦截器 -->
<bean id="transactionInterceptor"
class="">
<property name="transactionManager" ref="transactionManager" />
<property name="transactionAttributes">
<props>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 定义代理自动管理事务 -->
<bean id="ProxyCreator"
class="">
<!-- 指定需要Spring管理事务的Bean -->
<property name="beanNames">
<list>
<value>adminService</value>
<value>newsService</value>
</list>
</property>
<!-- 调用事务管理拦截器 -->
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
<!-- 配置HibernateTemplate -->
<bean id="hibernateTemplate" class="">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 依赖注入 -->
<bean id="adminService" class="">
<property name="adminDao" ref="adminDao" />
</bean>
<bean id="newsService" class="">
<property name="newsDao" ref="newsDao" />
</bean>
<bean id="adminDao" class="">
<property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>
<bean id="newsDao" class="">
<property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>
<bean id="login" class="">
<property name="adminService" ref="adminService" />
</bean>
<bean id="newnews" class="">
<property name="newsService" ref="newsService" />
</bean>
<bean id="findNews" class="">
<property name="newsService" ref="newsService" />
</bean>
<bean id="findRangeNews" class="">
<property name="newsService" ref="newsService" />
</bean>
<bean id="firstPage" class="">
<property name="newsService" ref="newsService" />
</bean>
<bean id="previousOrNextPage" class="">
<property name="newsService" ref="newsService" />
</bean>
<bean id="lastPage" class="">
<property name="newsService" ref="newsService" />
</bean>
<bean id="findOneNews" class="">
<property name="newsService" ref="newsService" />
</bean>
<bean id="updateNews" class="">
<property name="newsService" ref="newsService" />
</bean>
<bean id="deleteOneNews" class="">
<property name="newsService" ref="newsService" />
</bean>
<bean id="changepwd" class="">
<property name="adminService" ref="adminService" />
</bean>
<bean id="createadmin" class="">
<property name="adminService" ref="adminService" />
</bean>
<bean id="logout" class="" />
</beans>
Ⅱ(位于 NewsManage/src 目录下)用于管理应用中的 action 映射,以及 action 包含的 result
定义等。主要配置 struts 项目的一些全局属性,用户和响应 action 之间的对应关系,以及配置 action 中可
能用到的参数、处理结果返回页面,还有拦截器的配置等。
<?xml version="" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration
"
<struts>
<include file="" />
<constant name="一八" value="UTF-8" />
<constant name="一八" value="Messages" />
<package name="default" extends="struts-default">
<!-- 自定义拦截器 -->
<interceptors>
<interceptor name="SessionInterceptor"
class="" />
</interceptors>
<global-results>
<result name="loginPage">/</result>
</global-results>
<action name="loginValidate" class="">
<result name="input">/</result>
<result type="chain">login</result>
</action>
<action name="login" class="login">
<result>/</result>
<result name="error">/</result>
</action>
<action name="newnewsValidate" class="">
<result name="input">/newsSystem/newsManage/</result>
<result type="chain">newNews</result>
<interceptor-ref name="defaultStack" />
<interceptor-ref name="SessionInterceptor" />
</action>
<action name="newNews" class="newnews">
<result name="success" type="redirect"></result>
<result name="addnewsError">/newsSystem/newsManage/</result>
<result name="">/newsSystem/newsManage/</result>
<!-- 限制页面重复提交 -->
<interceptor-ref name="defaultStack" />
<interceptor-ref name="tokenSession" />
<interceptor-ref name="SessionInterceptor" />
</action>
<action name="findNews" class="findNews">
<result>/newsSystem/newsManage/</result>
<interceptor-ref name="defaultStack" />
<interceptor-ref name="SessionInterceptor" />
</action>
<action name="findRangeNews" class="findRangeNews">
<result>/newsSystem/newsManage/</result>
<interceptor-ref name="defaultStack" />
<interceptor-ref name="SessionInterceptor" />
</action>
<action name="firstPage" class="firstPage">
<result>/newsSystem/newsManage/</result>
<interceptor-ref name="defaultStack" />
<interceptor-ref name="SessionInterceptor" />
</action>
<action name="previousOrNextPage" class="previousOrNextPage">
<result>/newsSystem/newsManage/</result>
<interceptor-ref name="defaultStack" />
<interceptor-ref name="SessionInterceptor" />
</action>
<action name="lastPage" class="lastPage">
<result>/newsSystem/newsManage/</result>
<interceptor-ref name="defaultStack" />
<interceptor-ref name="SessionInterceptor" />
</action>
<action name="findOneNews" class="findOneNews">
<result>/newsSystem/newsManage/</result>
<interceptor-ref name="defaultStack" />
<interceptor-ref name="SessionInterceptor" />
</action>
<action name="showOneNews" class="findOneNews">
<result>/newsSystem/newsManage/</result>
<interceptor-ref name="defaultStack" />
<interceptor-ref name="SessionInterceptor" />
</action>
<action name="updatenewsValidate"
class="">
<result name="input">/newsSystem/newsManage/</result>
<result type="chain">updateNews</result>
<interceptor-ref name="defaultStack" />
<interceptor-ref name="SessionInterceptor" />
</action>
<action name="updateNews" class="updateNews">
<result name="success" type="redirect"></result>
<result name="">/newsSystem/newsManage/</result>
<!-- 限制页面重复提交 -->
<interceptor-ref name="defaultStack" />
<interceptor-ref name="tokenSession" />
<interceptor-ref name="SessionInterceptor" />
</action>
<action name="deleteOneNews" class="deleteOneNews">
<result name="success" type="redirect"></result>
<result name="deletenewserror" type="chain">findNews</result>
<interceptor-ref name="defaultStack" />
<interceptor-ref name="SessionInterceptor" />
</action>
<action name="changepwdValidate"
class="">
<result name="input">/newsSystem/adminManage/</result>
<result type="chain">changepwd</result>
<interceptor-ref name="defaultStack" />
<interceptor-ref name="SessionInterceptor" />
</action>
<action name="changepwd" class="changepwd">
<result name="success">
/newsSystem/adminManage/
</result>
<result name="pwderror">/newsSystem/adminManage/</result>
<interceptor-ref name="defaultStack" />
<interceptor-ref name="SessionInterceptor" />
</action>
<action name="createadminValidate"
class="">
<result name="input">/newsSystem/adminManage/</result>
<result type="chain">createadmin</result>
<interceptor-ref name="defaultStack" />
<interceptor-ref name="SessionInterceptor" />
</action>
<action name="createadmin" class="createadmin">
<result>/newsSystem/adminManage/</result>
<result name="createAdminError">/newsSystem/adminManage/</result>
<interceptor-ref name="defaultStack" />
<interceptor-ref name="tokenSession" />
<interceptor-ref name="SessionInterceptor" />
</action>
<action name="logout" class="logout">
<result type="redirect">/</result>
</action>
</package>
</struts>
Ⅱ(位于 NewsManage/WebRoot/WEB-INF 目录下)web 容器的配置文件。用于指定应用程序
的开始页面、注册和指定任何应用程序的过滤器 filter、监听器 listener、指定应用上下文初始参数的名/值、
为 servlet 注册和创建 URL 等。
<?xml version="" encoding="UTF-8"?>
<web-app version="" xmlns="
xmlns:xsi="
xsi:schemaLocation="
<welcome-file-list>
<welcome-file>/</welcome-file>
</welcome-file-list>
<listener>
<listener-class></listener-class>
</listener>
<filter>
<filter-name>struts2</filter-name>
<filter-class></filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>safecode</servlet-name>
<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>safecode</servlet-name>
<url-pattern>/safecode</url-pattern>
</servlet-mapping>
</web-app>
2.系统各功能模块设计与实现
Ⅱ登录功能
·管理员访问登录页面()进入登录界面并输入用户名、密码和验证码,由系
统进行
判断(首先判断验证码是否正确,若正确则进一步判断用户名和密码,否则提示相应信
息),如果为合法用户则进入系统界面,否则提示相应信息。登录同时将保存当前管理员信
息到 session 对象中,如果管理员直接访问系统主页面()将获取不到用户名,此
时会跳转回登录页面并提示相应信息。
·运行界面如图 1-3-1:
图 1-3-1
·关键代码如下:
xOverride
public String execute() throws Exception {
HttpSession session = ().getSession();
if (("rand") == null) {
return ERROR;
}
// 获得图形校验码
String sf = (String) ("rand");
// 如果图形校验码正确,判断帐号、密码是否正确
if ((safecode)) {
Admin admin = (name, password);
if (admin == null) {
addActionError(getText("loginerror"));
return ERROR;
} else {
// 将admin信息存入session
("admin", admin);
("name", ());
("previousLogintime", ());
// 获得当前系统时间并格式化,存入管理员登录时间
Date date = ().getTime();
SimpleDateFormat formatter = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
String dateString = (date);
(dateString);
// 更新管理员登录时间信息
(admin);
return SUCCESS;
}
} else {
addActionError(getText("codeerror"));
return ERROR;
}
}
其中,各表单域均有对应的表单验证,后台使用 struts2 表单验证框架。验证返回信息统一由
项目 src 目录下的 保存。
Ⅱ系统主页面
·管理员通过登录进入系统,运行界面如图 1-3-2:
图 1-3-2
系统界面分上、下、左、右四个部分。右上方显示登录折系统管理员用户名以及上次登录时
间,在安全方面有一定作用。右上角为退出按钮,可安全退出系统。左方为选择列表栏,可选择相应模块
进行管理。右方为欢迎界面,显示一些基本信息。
·关键代码如下:(实现管理员用户名以及上次登录时间代码请看上方登录功能代码)
显 示 管 理 员 、 管 理 员 上 次 登 录 时 间 关 键 代 码 : ( 详 细 代 码 请 查 看 项 目
NewsManage/WebRoot/)
<td width="74%" height="38" class="admin_txt">
欢迎!
<b><s:property value="#" /> </b> 您上次登录时间:
<s:property value="#" />
</td>
安 全 退 出 系 统 关 键 代 码 : ( 详 细 代 码 请 查 看 项 目
NewsManage/src/
public String execute() throws Exception {
HttpSession session = ().getSession();
();
return SUCCESS;
}
Ⅱ管理员管理模块(修改密码)
·选择管理员管理—修改密码,运行界面如图 1-3-3:
图 1-3-3
·关键代码如下:
实 现 功 能 关 键 代 码 ( 详 细 代 码 请 查 看 项 目
NewsManage/src/ 和 NewsManage/src/
/)
public String execute() throws Exception {
HttpSession session = ().getSession();
//从session获得当前登录管理员信息
Admin admin = (Admin)("admin");
//判断旧密码是否正确
if (().equals(password)) {
(newpwd1);
//更新管理员密码信息
(admin);
return SUCCESS;
}else
addActionError(getText("oldpswerror"));
return PWDERROR;
}
public void changepwd(Admin admin) {
("password", admin);
}
此模块同样拥有由 struts2 表单验证框架实现的表单验证,只有在旧密码输入正确,两次输
入的新密码相同时修改密码操作才能成功。
Ⅱ管理员管理模块(创建新管理员)
·选择管理员管理—新管理员,运行界面如图 1-3-4:
图 1-3-4
·关键代码如下:
实 现 功 能 关 键 代 码 ( 详 细 代 码 请 查 看 项 目
NewsManage/src/ 和 NewsManage/src/
/)
public String execute() throws Exception {
//通过用户名查找管理员信息
Admin a = (name);
//如果不为空,说明已经存在
if (a != null) {
addActionError(getText("adminexist"));
return CREATEADMINERROR;
} else {
Date date = ().getTime();
SimpleDateFormat formatter = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
String dateString = (date);
Admin admin = new Admin();
(name);
(newpwd1);
(dateString);
(admin);
return SUCCESS;
}
}
xSuppressWarnings("unchecked")
public Admin findAdminByName(String name) {
String sql = "from Admin as admin where =?";
List<Admin> list = (sql, name);
if (list != null && () > 0)
return (0);
else
return null;
}
public void addAdmin(Admin admin) {
(admin);
}
此模块同样拥有由 struts2 表单验证框架实现的表单验证,只有在各表单域输入内容符合要
求时新建管理员操作才能成功。如果管理员已经存在,则操作无效。通过查找指定管理员用户名,如果不
为空说明新建的管理员暂未存在,此时操作可进行。
Ⅱ新闻常规管理模块(新增新闻)
·选择新闻常规管理—新增新闻,运行界面如图 1-3-5:
图 1-3-5
·关键代码如下:
实 现 功 能 关 键 代 码 ( 详 细 代 码 请 查 看 项 目
NewsManage/src/ 和 NewsManage/src/
/)
private static final String ADDNEWSERROR = "addnewsError";
xSuppressWarnings("unchecked")
public String execute() throws Exception {
HttpSession session = ().getSession();
// 获得当前系统时间并格式化,存入创建新闻时间
Date date = ().getTime();
News news = new News();
(title);
(source);
(content);
(type);
(((Admin) ("admin")).getName());
_time(date);
List list = (news);
if (list != null) {
addActionError(getText("newsexist"));
return ADDNEWSERROR;
} else {
(news);
return SUCCESS;
}
}
xSuppressWarnings("unchecked")
public List<News> findNewsByTitle(News news) {
String title = ();
String hql = "from News as news where like '%" + title
+ "%'";
List<News> list = (hql);
if (() > 0 && list != null) {
return list;
} else
return null;
}
public void addNews(News news) {
(news);
}
此模块同样拥有由 struts2 表单验证框架实现的表单验证,只有在各表单域输入内容符合要
求时新建管理员操作才能成功。如果新闻已经存在,则新增失败并返回 newsexist 提示信息。此功能实现
方法:存入数据库前查找数据库中新闻标题为输入标题的新闻并返回结果赋给 list,再进行判断。若 list 不
为空则新闻存在,反之则将新闻数据插入数据库。
Ⅱ新闻常规管理模块(新闻管理)
此模块包含以下功能:1、按时间范围查询新闻;2、按新闻类型查询新闻;3 按时间范围和
新闻类型查询新闻;4、修改指定新闻;5、删除指定新闻;6、查看新闻详细信息;7 翻页
功能;8 添加新闻链接。
·选择新闻常规管理—新闻管理,运行界面如图 1-3-6:
图 1-3-6
·关键代码如下:
显 示 所 有 新 闻 功 能 实 现 的 关 键 代 码 ( 详 细 代 码 请 查 看 项 目
NewsManage/src/ 和 NewsManage/src/
/)
public String execute() throws Exception {
List<News> list = new ArrayList();
//查出所有新闻信息并赋给list
paging = new Paging();
int count = (paging, null);
previousPage = false;
//记录数少于等于10时
if (count <= 10) {
nextPage = false;
} else {
nextPage = true;
}
list = (count);
list2 = new ArrayList();
for (int i = 0; i < (); i++) {
NewsInfo nInfo = new NewsInfo();
// 根据新闻信息中的type值,显示新闻类型
if ((i).getType() == 1) {
("国内新闻");
} else if ((i).getType() == 2) {
("国际新闻");
} else if ((i).getType() == 3) {
("军事新闻");
} else if ((i).getType() == 4) {
("财经新闻");
} else if ((i).getType() == 5) {
("体育新闻");
} else if ((i).getType() == 6) {
("汽车新闻");
} else if ((i).getType() == 7) {
("房产新闻");
} else if ((i).getType() == 8) {
("娱乐新闻");
} else if ((i).getType() == 9) {
("时尚新闻");
} else if ((i).getType() == 10) {
("游戏新闻");
} else {
("其它新闻");
}
((i).getNewsId());
((i).getTitle());
((i).getSource());
((i).getContent());
((i).getAdminName());
_time((i).getIssue_time());
// 将查找出的新闻信息封装到list2
(nInfo);
}
setList2(list2);
return SUCCESS;
}
public List<News> findNews(Integer count) {
if (count >= 10) {
count = 10;
}
List<News> news = ("from News").subList(0, count);
return news;
}
·选择时间范围以及新闻类型查询指定范围内新闻信息(查询开始至 2012-06-03 且类别为国内
新闻的新闻信息),运行界面如图 1-3-7:
图 1-3-7
·关键代码如下:
显 示 指 定 范 围 新 闻 功 能 实 现 的 关 键 代 码 ( 详 细 代 码 请 查 看 项 目
NewsManage/src/
public String execute() throws Exception {
//HttpSession session = ().getSession();
List<News> list = new ArrayList();
NewsRoot newsRoot = new NewsRoot();
paging = new Paging();
Date date = endDate;
if (endDate != null) {
long temp_1 = ();
long temp_2 = (1 * 24 * 3600 * 1000 - 1);
date = new Date((temp_1 + temp_2));
}
(beginDate);
(date);
(type);
//("newsRange", newsRoot);
int count = (paging, newsRoot);
previousPage = false;
if (count <= 10) { //记录数小于等于10时
nextPage = false;
} else {
nextPage = true;
}
// 查出所有新闻信息并赋给list
list = (newsRoot, count);
list2 = new ArrayList();
if (list == null) {
return SUCCESS;
} else {
for (int i = 0; i < (); i++) {
NewsInfo nInfo = new NewsInfo();
// 根据新闻信息中的type值,显示新闻类型
if ((i).getType() == 1) {
("国内新闻");
} else if ((i).getType() == 2) {
("国际新闻");
} else if ((i).getType() == 3) {
("军事新闻");
} else if ((i).getType() == 4) {
("财经新闻");
} else if ((i).getType() == 5) {
("体育新闻");
} else if ((i).getType() == 6) {
("汽车新闻");
} else if ((i).getType() == 7) {
("房产新闻");
} else if ((i).getType() == 8) {
("娱乐新闻");
} else if ((i).getType() == 9) {
("时尚新闻");
} else if ((i).getType() == 10) {
("游戏新闻");
} else {
("其它新闻");
}
((i).getNewsId());
((i).getTitle());
((i).getSource());
((i).getContent());
((i).getAdminName());
_time((i).getIssue_time());
// 将查找出的新闻信息封装到list2
(nInfo);
}
setList2(list2);
return SUCCESS;
}
}
·点击任何新闻的修改链接,对新闻进行修改。运行界面如图 1-3-8:
图 1-3-8
·关键代码如下:
修 改 指 定 新 闻 功 能 实 现 的 关 键 代 码 ( 详 细 代 码 请 查 看 项 目
NewsManage/src/
public String execute() throws Exception {
HttpSession session = ().getSession();
// 从session中获取新闻信息
News news = (News) ("news");
// 如果页面请求中的新闻信息与数据库中的信息相同,则不做操作
if (().equals(title) && ().equals(source)
&& ().equals(content)
&& ().equals(type)) {
("新闻未更改,不更新...");
return SUCCESS;
} else {
// 否则,将页面请求中信息更新到数据库
(title);
(source);
(content);
(type);
(news);
("新闻有更改,已更新...");
return SUCCESS;
}
}
此模块同样拥有由 struts2 表单验证框架实现的表单验证。提交之后进行表单域的验证,之
后再写入数据库。按返回按钮可返回上一步。
·点击任何新闻的删除链接,可删除新闻。运行界面如图 1-3-9:
图 1-3-9
·关键代码如下:
删 除 指 定 新 闻 功 能 实 现 的 关 键 代 码 ( 详 细 代 码 请 查 看 项 目
NewsManage/src/
private static final String DELETENEWSERROR = "deletenewsError";
xOverride
public String execute() throws Exception {
News news = new News();
(newsId);
News news2 = (newsId);
if (news2 != null) {
(news2);
return SUCCESS;
}
addActionError(getText("deletenewsFail"));
return DELETENEWSERROR;
}
·点击新闻的标题或操作栏目下的新闻详细,可查看新闻详细信息。运行界面如图 1-3-10:
图 1-3-10
此功能的返回按钮可实现返回跳转到此页面前的新闻信息页面。
·关键代码如下:
查 看 指 定 新 闻 详 细 信 息 功 能 实 现 的 关 键 代 码 ( 详 细 代 码 请 查 看 项 目
NewsManage/src/
public String execute() throws Exception {
News news2 = (newsId);
HttpSession session = ().getSession();
("news", news2);
return SUCCESS;
}
·点击新闻管理页面中的的首页、上一页、下一页、尾页、第…页可实现翻页。运行界面如图
1-3-11:
图 1-3-11
此功能实现翻页:如果当前页为第 1 页,则不显示首页与上一页的超链接;如果当前页为
最后一页,则不显示尾页和下一页的超链接;只有不为首页和尾页的时候才会显示所有翻页超链接。同时,
实现页数、当前页的结果。
·关键代码如下:
翻 页 功 能 实 现 的 关 键 代 码 ( 详 细 代 码 请 查 看 项 目
NewsManage/src/ 、 、
)以下以 为例:
public String execute() throws Exception {
List<News> list = new ArrayList();
paging = new Paging();
xSuppressWarnings("unused")
int count = (paging, null);
(currentPage);
list = (paging, null);
if (currentPage <= 1) {
previousPage = false;
nextPage = true;
} else if(currentPage >= ()) {
previousPage = true;
nextPage = false;
} else {
previousPage = true;
nextPage = true;
}
list2 = new ArrayList();
if (list == null) {
return SUCCESS;
} else {
for (int i = 0; i < (); i++) {
NewsInfo nInfo = new NewsInfo();
// 根据新闻信息中的type值,显示新闻类型
if ((i).getType() == 1) {
("国内新闻");
} else if ((i).getType() == 2) {
("国际新闻");
} else if ((i).getType() == 3) {
("军事新闻");
} else if ((i).getType() == 4) {
("财经新闻");
} else if ((i).getType() == 5) {
("体育新闻");
} else if ((i).getType() == 6) {
("汽车新闻");
} else if ((i).getType() == 7) {
("房产新闻");
} else if ((i).getType() == 8) {
("娱乐新闻");
} else if ((i).getType() == 9) {
("时尚新闻");
} else if ((i).getType() == 10) {
("游戏新闻");
} else {
("其它新闻");
}
((i).getNewsId());
((i).getTitle());
((i).getSource());
((i).getContent());
((i).getAdminName());
_time((i).getIssue_time());
// 将查找出的新闻信息封装到list2
(nInfo);
}
setList2(list2);
return SUCCESS;
}
}
int count = ((
"select count(*) from News").get(0).toString());
(count);
return count;
xSuppressWarnings("unchecked")
public List<News> PreviousOrNextPage(Paging paging, NewsRoot newsRoot) {
String hql;
List<News> list;
int current = ();
int total = ();
int count = ();
if (current < total) {
hql = "from News";
list = (hql).subList(((current - 1) * 10),
(((current - 1) * 10) + 10));
} else {
hql = "from News";
list = (hql).subList(((current - 1) * 10),
count);
}
if (() > 0 && list != null) {
return list;
} else {
return null;
}
}
此功能通过查询数据库所有新闻记录数并返回进行计算,再进行判断来确定是否为首页、
尾页并正确显示结果。
新闻联播新闻网(前台)
上课班级:IB01 学号:0940111145 姓名:邓理安
学号:0940111147 姓名:方泓清
一、系统执行原理
1.客户机将 HTTP 请求发送给 Web 服务器
服务器将该请求转发给
3.在 中的 action 的 type 实现 spring 的请求代理
4.在 spring 的配置文件中对 action 类进行注入
类中注入 sevice,service 中注入 dao,当服务器启动时,spring 对类自动设置。
6.执行顺序从 action --->service----->dao,然后返回。
将响应发送给 Web 服务器
服务器将响应转发给客户机
二、系统功能需求
1、系统功能描述
角色:游客、会员
功能描述:
(1)游客权限和功能:游客可浏览网站所有信息,包括新闻、新闻评论等。也可注册成为会员。
会员注册流程如图 2-1-1 所示:
图 2-1-1
(2)会员权限和功能:会员拥有游客所具有的权限,也可对新闻进行评论,发送和删除留言。
同时可管理个人信息。会员登录流程如图 2-1-2 所示:
图 2-1-2
三、数据库设计
1、数据库使用 MY SQL。
2、相关各数据库表:
Ⅱ用户表 user(如图 2-2-1)
图 2-2-1
Ⅱ评论表 comment(如图 2-2-2)
图 2-2-2
Ⅱ留言表 message(如图 2-2-3)
图 2-2-3
Ⅱ新闻类型说明表(如图 2-2-4)
图 2-2-4
四、系统实现
1、公共模块设计与实现
Ⅱ(位于 NEWS/src 目录下)用于管理数据库连接、Hibernate 的 sessionFactory、
以及 struts2 的 action。
<?xml version="" encoding="UTF-8"?>
<beans xmlns="
xmlns:xsi=" xmlns:p="
xsi:schemaLocation="
<!-- 配置数据源 :C3P0连接池-->
<bean id="dataSource"
class="" destroy-method="close">
<property name="driverClass" value="" />
<property name="jdbcUrl"
value="jdbc:mysql://localhost:3306/newsmanage?useUnicode=true&characterEncoding=utf-8" />
<property name="user" value="root" />
<property name="password" value="57661一五69" />
<!--当连接池中的连接用完时,C3P0一次性创建新连接的数目 -->
<property name="acquireIncrement" value="10"/>
<!--定义在从数据库获取新连接失败后重复尝试获取的次数,默认为30 -->
<property name="acquireRetryAttempts" value="100"/>
<!--连接池中保留的最大连接数。默认为一五-->
<property name="maxPoolSize" value="40"></property>
<property name="minPoolSize" value="1"></property>
<!--初始化创建的连接数,应在minPoolSize与maxPoolSize之间取值。默认为3 -->
<property name="initialPoolSize" value="1"></property>
<!--最大空闲时间,超过空闲时间的连接将被丢弃。为0或负数则不丢弃。默认为0 -->
<property name="maxIdleTime" value="20"></property>
</bean>
<bean id="sessionFactory"
class="">
<!-- 依赖注入上面所配置的数据源 -->
<property name="dataSource" ref="dataSource" />
<!-- 使用mappingResource属性列出全部映射文件 -->
<property name="mappingResources">
<list>
<value>com/sise/news/s2sh/po/</value>
<value>com/sise/news/s2sh/po/</value>
<value>com/sise/news/s2sh/po/</value>
<value>com/sise/news/s2sh/po/</value>
<value>com/sise/news/s2sh/po/</value>
</list>
</property>
<!-- 配置Hibernate的sessionFactory的属性 -->
<property name="hibernateProperties">
<props>
<prop key=""></prop>
<prop key="">update</prop>
<prop key="_sql">true</prop>
<prop key="_sql">true</prop>
</props>
</property>
</bean>
<!-- 配置HibernateTemplate -->
<bean id="hibernateTemplate" class="">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置User持久化类的DAO Bean -->
<bean id="userDao" class="">
<property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>
<bean id="userService" class="">
<property name="userDao" ref="userDao" />
</bean>
<!-- 定义动作Bean 用户UserAction-->
<bean id="userAction" class="">
<property name="userService" ref="userService" />
</bean>
<!-- 配置Message持久化类的DAO Bean -->
<bean id="messageDao" class="">
<property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>
<bean id="messageService" class="">
<property name="messageDao" ref="messageDao" />
</bean>
<!-- 定义动作Bean 用户MessageAction-->
<bean id="messageAction" class="">
<property name="messageService" ref="messageService" />
</bean>
<!-- 配置News持久化类的DAO Bean -->
<bean id="newsDao" class="">
<property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>
<bean id="newsService" class="">
<property name="newsDao" ref="newsDao" />
</bean>
<!-- 定义动作Bean 用户NewsAction-->
<bean id="newsAction" class="">
<property name="newsService" ref="newsService" />
</bean>
<!-- 配置Search持久化类的DAO Bean -->
<bean id="searchDao" class="">
<property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>
<bean id="searchService" class="">
<property name="searchDao" ref="searchDao" />
</bean>
<!-- 定义动作Bean 用户NewsAction-->
<bean id="searchAction" class="">
<property name="searchService" ref="searchService" />
</bean>
</beans>
Ⅱ(位于 NEWS/src 目录下)用于管理应用中的 action 映射,以及 action 包含的 result 定义等。
主要配置 struts 项目的一些全局属性,用户和响应 action 之间的对应关系,以及配置 action 中可能用到的
参数、处理结果返回页面,还有拦截器的配置等。
<?xml version="" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration
"
<struts>
<constant name="一八" value="gb2312" />
<!-- action对象由spring负责创建 -->
<constant name="" value="spring" />
<package name="NEWS" namespace="/action" extends="struts-default">
<!-- 定义拦截器 -->
<interceptors>
<interceptor name="myInterceptor"
class="" />
</interceptors>
<!-- 将上述拦截器设定为默认拦截器:直接使用拦截器拦截所有Action -->
<!-- default-interceptor-ref name="myStack"/-->
<!-- 用户信息 -->
<action name="user_*" class="userAction" method="{1}">
<result name="login">/</result>
<result name="loginsuccess" type="redirect">${nextURL}</result>
<result name="remove" type="redirect">${lastURL}</result>
<result name="regfailure">/Reg/</result>
<result name="regsuccess">/Reg/</result>
<result name="oldpassword">/UserCenter/</result>
<result name="setnewpassword">/UserCenter/</result>
<result name="passwordsafe">/UserCenter/</result>
<result name="basicinformation">/UserCenter/</result>
<result name="findPaasword">/UserCenter/</result>
</action>
<!-- 评论、留言 -->
<action name="message_*" class="messageAction" method="{1}">
<result name="redcomment">/NEWS/</result>
<result name="commentsuccess" type="redirectAction">message_redcomment</result>
<result name="commentfailure" type="redirect">${commentErrorURL}</result>
<result name="success">/NEWS/</result>
<result name="message">/NEWS/</result>
<result name="removemessage" type="redirectAction">message_jumpMessage</result>
<!-- 在动作中应用拦截器 -->
<interceptor-ref name="myInterceptor">
<param name="includeMethods">Addcomment</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
<!-- 读取新闻-->
<action name="news_*" class="newsAction" method="{1}">
<result name="allnews">/</result>
<result name="anews">/NEWS/</result>
<result name="asamekind">/NEWS/</result>
<result name="success">/NEWS/</result>
</action>
<!-- 搜索新闻-->
<action name="search_*" class="searchAction" method="{1}">
<result>/NEWS/</result>
</action>
<!-- 验证码 -->
<action name="AuthImg2" class=""
method="authImgAction">
<result name="authimg">/authImg</result>
</action>
</package>
</struts>
Ⅱ(位于 NEWS/WebRoot/WEB-INF 目录下)web 容器的配置文件。用于指定应用程序的开始
页面、注册和指定任何应用程序的过滤器 filter、监听器 listener、指定应用上下文初始参数的名/值、为 servlet
注册和创建 URL 等。
<?xml version="" encoding="UTF-8"?>
<web-app version="" xmlns="
xmlns:xsi="
xsi:schemaLocation="
<welcome-file-list>
<welcome-file></welcome-file>
</welcome-file-list>
<!-- 配置servlet(验证码) -->
<servlet>
<servlet-name>authImg</servlet-name>
<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>authImg</servlet-name>
<url-pattern>/authImg</url-pattern>
</servlet-mapping>
<!-- 配置struts2的代码 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置spring时生成的代码 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:</param-value>
</context-param>
<listener>
<listener-class></listener-class>
</listener>
</web-app>
系统各功能模块设计与实现
Ⅱ浏览网站功能
·用户(游客/会员)访问新闻网主页(:8080/NEWS/),进入新闻联播网站。
网站最上方是常规网站信息,包括时间、天气、搜索栏等。网站导航有各类型新闻,
可直
接转到相应页面。导航下为登录、注册、留言以及其它超链。网站主体为各类型新
闻的模
块,用于区分各类型新闻。
接。
·运行界面如图 2-3-1:
图 2-3-1
·关键代码如下:
读取所有新闻功能关键代码(详细代码请查看项目 NEWS/src/
/)
/**
* 读取新闻所有评论
*
* xparam newss类(传title、issue_time、news_id)
* xmethod getAllNewsTitle:获取所有新闻的题目
* xmethod getSumTitleByType:通过类型Type获取同类型新闻题目的总和(0:返回1条;1:返回8条;2:返回
10条;3:返回20条)
*/
public String getAllNews() {
HttpSession session = ().getSession();
newss0=new ArrayList<Object[]>();//焦点新闻
for(int i=1;i<=11;i++){
Object[] obj=(i);
if(obj!=null){
(obj);
}
if(()>=8){break;}//大于等于8条数据,停止读取
}
("newss0", newss0);
newss1=(1,(1,2));//国内
newss2=(2,(2,2));//国际
newss3=(3,(3,2));//军事
newss4=(4,(4,2));//财经
newss6=(6,(6,2));//汽车
newss7=(7,(7,2));//房产
newss8=(8,(8,3));//娱乐
newss9=(9,(9,2));//时尚
return "allnews";
}
·点击新闻的标题可查看新闻详细信息。运行界面如图 2-3-2:
图 2-3-2
·点击导航栏的新闻类型可查看分类新闻。运行界面如图 2-3-3:
图 2-3-3
·关键代码如下:
读取同类型新闻功能关键代码(详细代码请查看项目 NEWS/src/
/ 和 NEWS/src/ /)
/**
* 读取一条新闻信息
*
* xparam news类(获取整条新闻所有信息)
* xmethod getNewsByNewsId:通过news_id获取一条新闻
* xparam news_id:新闻ID
*/
public String getNewsByNewsId() {
news=(_id());
sumComment=(_id());
type=type2[()];
return "anews";
}
/**
* 读取同类型新闻信息(标题)
* xparam newss类(传title、issue_time、news_id)
* xmethod getAllNewsTitle:获取所有新闻的题目
* xmethod getSumTitleByType:通过类型Type获取同类型新闻题目的总和(1:返回8条;2:返回10条;3:返
回20条)
* xparam news_id:新闻ID
*/
public String getNewsTitleByType() {
introduction=(());
pagination=(());
newss12=((),((),3
));
type=type2[()];
if(()<=20){
nextPage=false;
}else{
nextPage=true;
}
pageUp=false;
return "asamekind";
}
/**
* 读取新闻所有标题
* 国内、国际、军事、财经、汽车、房产、娱乐、时尚
* xparam (传title、issue_time、news_id)
* xreturn List<Object[]>
*/
public List<Object[]> getAllNewsTitle(int type, int sum) {
String hql = "select news_id,title,issue_time from News where type=? order by issue_time desc";
List<Object[]> list = (hql, type).subList(0, sum);
for(Object[] obj:list){
obj[1]=((String)obj[1], type);//新标题重新封装
}
return list;
}
分类新闻的页面对读取出来的新闻进行分页操作(如图 2-3-3),拥有翻页功能。
Ⅱ新闻搜索功能
·用户(游客/会员)访问新闻网主页(:8080/NEWS/),进入新闻联播网站。
网站上方的搜索栏可实现新闻的搜索,输入关键字即可。
·运行界面如图 2-3-4:
图 2-3-4
·关键代码如下:
实 现 功 能 关 键 代 码 ( 详 细 代 码 请 查 看 项 目 NEWS/src/
/ 和 NEWS/src/ /)
public String Search(){
("搜索:"+keyWord);
newss = (keyWord);
pagination=(keyWord);//总页数、当前页数
if(()<=20){
nextPage=false;
}else{
nextPage=true;
}
pageUp=false;
return SUCCESS;
}
/**
* 标题搜索
* xparam keyWord:搜索关键字
* xreturn List<Object[]>
*/
public List<Object[]> Search(String keyWord) {
String hql = "select news_id,title,issue_time from News where title like ? order by issue_time desc";
List<Object[]> list = (hql, "%"+keyWord+"%");
return list;
}
Ⅱ会员注册功能
·游客可根据需要进行网站会员注册,按导航栏下方的注册链接可转到注册页面。
·运行界面如图 2-3-5:
图 2-3-5
·关键代码如下:
实现功能关键代码(详细代码请查看项目 NEWS/src/ /)
/**
* 用户注册
*
* xparam user类
* (传username、password、sex、personPhoto、email)
* xparam message
* (返回页面的值)
* xreturn String类型数据
*/
public String reg() {
HttpSession session = ().getSession();
if ((()).equals((String) session
.getAttribute("randomImageStr"))) {
(user);
("注册表验证码:"
+ ("randomImageStr"));// 区分不同页面的验证码
// 添加成功时,清空session中(randomImageStr)值,防止用户倒退重复添加
("randomImageStr");
msg = ();
return "regsuccess";
} else {
msg = "0";
return "regfailure";
}
}
此模块拥有表单验证功能,只有在信息输入符合要求时注册操作才能成功。
Ⅱ会员登录功能
·会员可根据需要进行登录,登录后可对新闻进行评论,发送留言等。
·运行界面如图 2-3-6:
图 2-3-6
·关键代码如下:
实现功能关键代码(详细代码请查看项目 NEWS/src/ /
和 NEWS/src/ /)
/**
* 登陆验证
*
* xparam user类
* (传username、password)
* xparam personPhoto
* (登陆成功:设置session值)
* xparam SUsername
* (登陆成功:设置session值)
* xparam message
* (登陆失败:返回页面的值)
* xreturn String类型数据
*/
public String login() {
user = (user);
if (user != null) {
("登陆路径:" + nextURL);
ActionContext content = ();
Map session = ();
("SUser", user);
login = false;
msg = null;
return "loginsuccess";
} else {
login = true;
msg = "输入的用户名或密码错误!";
return "login";
}
}
public User login(User user) {
String hql = "from User where username =:name and password =:pwd";
String[] paramName = new String[] { "name", "pwd" };
String[] value = new String[] { (), () };
List<User> list = (hql, paramName,
value);
if (null == list || () == 0) {
return null; // 用户名不存在
} else {
return (0);
}
}
Ⅱ会员注销功能
·会员注销操作,登录后才出现注销链接。
·运行界面如图 2-3-7:
图 2-3-7
·关键代码如下:
实现功能关键代码(详细代码请查看项目 NEWS/src/ /)
/**
* 注销用户名
*
* xparam session
* (用clear()消除所有session值)
* xreturn String类型数据
*/
public String remove() {
("注销路径:" + lastURL);
ActionContext content = ();
Map session = ();
();
HttpSession session2 = ().getSession();
();
return "remove";
}
Ⅱ查看个人信息功能
·会员登录后,在导航栏下方有个人中心的链接,点击可进入个人中心。里面有个人基本信
息、修改密码、密码保护、权限查询、注销账号等功能。
·运行界面如图 2-3-8(1-4):
图 2-3-8-1
图 2-3-8-2
图 2-3-8-3
图 2-3-8-4
·关键代码如下:
实现功能关键代码(详细代码请查看项目 NEWS/src/ /
和 NEWS/src/ /)
/**
* 修改密码:步骤一(比较旧密码)
*
* xparam session
* (put 写入session值;用remove()消除所有session值)
* xreturn String类型数据
*/
public String getOldPassWord() {
ActionContext content = ();
Map session = ();
user = (User) ("SUser");
if ((())) {
("SOldPassword", "success");
oldpassword = null;// 清除残留值防止被恶意使用
} else {
("SOldPassword");
msg = "密码错误,请重新输入!";
}
return "oldpassword";
}
/**
* 修改密码:步骤二(更新新密码)
*
* xparam session
* (get 获取session值;用clear()消除所有session值)
* xreturn String类型数据
*/
public String setNewPassWord() {
ActionContext content = ();
Map session = ();
user = (User) ("SUser");
(newpassword);
(user);
();// 修改密码后需要重新登陆
msg = "密码更新成功!新密码:" + newpassword + " ,请重新登陆!";
return "setnewpassword";
}
/**
* 密码保护
*
* xparam session
* (get 获取session值)
* xreturn String类型数据
*/
public String setPasswordSafe() {
ActionContext content = ();
Map session = ();
user = (User) ("SUser");
(safeproblem);
(safeanswer);
(email);
(user);
();// 重新登陆获取新数据
return "passwordsafe";
}
/**
* 用户基本信息
*
* xparam session
* (get 获取session值)
* xreturn String类型数据
*/
public String setBasicInformation() {
ActionContext content = ();
Map session = ();
user = (User) ("SUser");
if (("男")) {
(0);
} else {
(1);
}
(qq);
(tel);
(user);
();// 重新登陆获取新数据
return "basicinformation";
}
/**
* 跳转页面:寻找密码页面
*
* xreturn
*/
public String findPassword() {
HttpSession session = ().getSession();
String findpass = (String) ("FindPassword");
if (findpass == null) {
("FindPassword", "0");// 首页:选择:密保、邮箱
} else if ((findpass) == 1) {// 密保步骤一
Object[] obj = (());
if (obj != null && obj[2] != null) {
((Integer) obj[2]);
("FindPassword", "2");// 密保步骤二
} else {
("SFPmsg", "您没有设置密保!请使用‘邮箱发送密码’功能");
}
} else if ((findpass) == 2) {
Object[] obj = (());
if (().equals((String) obj[3])) {
("FindPassword", "3");// 密保步骤三
("Findpass", obj[0]);// 返回密码
} else {
("SFPmsg", "输入的密保答案错误!");
}
}
return "findPaasword";
}
/**
* 更新用户信息
*
* xparam (传User)
*
*/
public void updateUser(User user) {
(user);
}
/**
* 寻找密码返回用户名(密保问题、密保答案、密码)
*
* xparam username
* xreturn
*/
public Object[] findUserByUsername(String username) {
String hql = "select password,email,safeproblem,safeanswer from User where username=?";
List<Object[]> list = (hql, username);
if (() > 0) {
return (0);
} else {
return null;
}
}
同样,此模块拥有表单验证功能,只有在信息输入符合要求时注册操作才能成功。
Ⅱ会员留言功能
·会员登录后,在导航栏下方有留言的链接,点击可进留言页面。会员留言后在历史留言下
方显示留言,留言后面有删除留言的链接,点击可删除留言。
·运行界面如图 2-3-9:
图 2-3-9
·关键代码如下:
实 现 功 能 关 键 代 码 ( 详 细 代 码 请 查 看 项 目 NEWS/src/
/ 和 NEWS/src/ /)
/**
* 读取留言(每个用户)
* xparam username
*/
public void redMessage() {
HttpSession session = ().getSession();
user=(User) ("SUser");
message2=(());
("SMessage");//清除值
("SMessage", message2);//赋值
pagination=(());//总页数、当前页数
(1);
if(()<=5){
nextPage=false;
}else{
nextPage=true;
}
pageUp=false;
}
/**
* 添加留言
*
* xparam comment类(传message、time、newsId)
* xreturn String类型数据
*/
public String addMessage() {
HttpSession session = ().getSession();
if ((()).equals((String) ("randomImageStr"))) {
(message);
("留言验证码:"+ ("randomImageStr"));// 区分不同页面的
验证码
// 添加成功时,清空session中(randomImageStr)值,防止用户倒退重复添加
("randomImageStr");
message=null;
("Smsg", "0");//验证码正确
();//添加后更新数据
} else {
("Smsg", "1");//验证码错误
}
return "message";
}
/**
* 删除留言
*
* xparam comment类(传message、time、newsId)
* xreturn String类型数据
*/
public String removeMessage() {
HttpSession session = ().getSession();
(message);
("Smsg", "2");//删除成功
return "removemessage";
}
留言模块同样拥有表单验证功能,只有在信息输入符合要求时注册操作才能成功。
ⅡⅡⅡⅡⅡⅡ会员评论新闻功能
·会员登录后,可对网站所有新闻进行评论,也可查看新闻所有评论。评论栏显示新闻历史
评论数,包含查看所有评论的超链接。
·运行界面如图 2-3-10:
图 2-3-10
·关键代码如下:
实 现 功 能 关 键 代 码 ( 详 细 代 码 请 查 看 项 目 NEWS/src/
/ 和 NEWS/src/ /)
/**
* 对新闻添加评论
*
* xparam comment类(传message、time、newsId)
* xreturn String类型数据
*/
public String Addcomment() {
HttpSession session = ().getSession();
if ((()).equals((String) ("randomImageStr"))) {
(comment);
("评论验证码:"+ ("randomImageStr"));// 区分不同页面的
验证码
// 添加成功时,清空session中(randomImageStr)值,防止用户倒退重复添加
("randomImageStr");
("Smsg", "0");//验证码正确
(null);//清空值
return "commentsuccess";
} else {
("Smsg", "1");//验证码错误
return "commentfailure";
}
}
/**
*读取新闻所有评论,显示5条
*
* xparam comment类(传message、time、newsId)
* xreturn String类型数据
*/
public String redcomment() {
pagination=(_id());
comment2=(_id());
news=(_id());
type=type2[()];
if(()<=5){//记录少于等于5条时
nextPage=false;
}else{
nextPage=true;
}
pageUp=false;
return "redcomment";
}
/**
* 保存用户对新闻的评论
*
* xparam Message类(传message、time、newsId)
*
*/
public void saveComment(Comment comment) {
(comment);
}
/**
* 读取新闻所有评论,显示前5条
*
* xparam Comment类(传message、time、newsId)
*
*/
public List<Comment> redALLComment(int news_id) {
Pagination P=(news_id);
int result=5;//评论条数大于等于5
if(()<5){result=();}//评论条数小于5
String hql = "from Comment where news_id=? order by time desc";
List<Comment> comment = (hql,news_id).subList(0, result);
return comment;
}
五、附录
系统代码
与 电 子 文 档
都已上传至
。文件名为:新闻网- 新闻网信息管理系统_邓理安(组长)_方泓清
2025 年 10 月 16 日星期四 19:22:04
:2219:22: 时 22 分 7 时 22 分
4 秒 Oct. 16, 2516 October 20257:22:04 PM19:22:04