jsp javabean servlet mysql 新闻管理系统

声明:此项目为本人学生作品,作者本人水平有限,难免在代码中留下错误,难免出现bug!!!!!请自行百度,有问题可以在评论区留言,博主学业繁忙,随缘回复,代码经过测试后上传,已经是完整版,仅供参考,在此特别感谢本人的刘老师提供指导与和我合作的同学

项目二:新闻中心管理系统

1、项目来源及背景

为了能够更加迅速地向客户传递有关企业的新闻以及相关行业中最新的发展现状,以便于引导客户选择企业的相关产品和服务,一般在商务系统的开发中,都会设置相应的新闻中心模块。该新闻中心应该能够及时提供最新的资讯,并且应该在显示某条新闻的同时,列出所有的相关新闻,以便于客户在最短的时间内获得最新最全的信息。

此外,考虑到新闻的时效性,新闻中心管理系统中一般都需要提供良好的维护页面,即中心管理人员可以借助后台维护管理的页面实现对新闻内容实时的更新维护。

2、系统需求分析

2.1 需求描述

新闻中心管理系统主要是为了实现商务网站动态新闻实时显示的系统。一个典型的新闻中心管理系统一般都会提供新闻标题分类显示、新闻详细内容显示等功能。同时也要为新闻中心后台管理的管理员提供对应的新闻信息维护及管理的功能,包括添加新的新闻、编辑修改新闻、删除新闻等功能。

根据企业商务新闻的基本要求,本系统需要完成如下的主要任务:

(1)新闻标题信息分类显示:在进入新闻中心主页时,应该能够根据数据库中存放的信息分类显示最新的新闻标题。例如可以显示所有最新的标题信息。每个新闻标题都应该提供对应的超链接,单击后,就可以跳转到有关该新闻详细内容的页面上,以便用户对这条新闻有更详细的了解。

(2)新闻详细内容及相关新闻列表显示:当单击某个新闻标题后,可以查看该新闻的详细内容。同时提供与该新闻相关的新闻标题信息的显示,以便于查询与该新闻相关的其他信息(扩展)。

(3)新闻中心后台管理功能:新闻中心的管理员可以根据企业的服务需要随时向数据库中添加最新的新闻标题及相关内容。还可以删除不再需要的新闻标题及内容,以及对原有新闻做必要的修改。

2.2 系统用况图

图1 管理员用例图

图2 浏览者用例图

图3 系统类图

3、系统总体设计

3.1 系统总体功能结构

图4 系统层次结构图

3.2 功能描述

浏览者可以看到所有新闻的标题,点击新闻标题超链接,可以在页面中显示新闻标题、新闻类型、新闻作者、新闻内容、新闻发布时间、及相关新闻的标题,通过点击相关新闻标题超链接,就可以查看该相关新闻的详细信息。

图5 新闻中心管理系统前台活动图

只有合法身份的管理员才可以进行后台管理,系统的3个子模块(添加新闻、修改新闻、删除新闻)在操作上是平行的,其内在关系通过后续数据库的设计和程序流程来控制。

4、系统详细设计

4.1 系统数据设计

新闻基本信息表(newsdetail)用来保存和新闻相关的基本信息,是显示和维护新闻数据的依据。表1所示列出了该表中所包含的字段的描述信息。

字段名

类型

长度

是否允许为空

是否为主键

说明

id

int

false

true

新闻记录编号

title

varchar

50

false

false

新闻标题

content

varchar

4000

false

false

新闻内容

author

varchar

50

false

false

作者信息

time

datatime

8

false

false

新闻时间

type

int

4

true

false

新闻类别

表1 新闻基本信息表

    后台管理员信息表(admin)记录了新闻中心管理员的相关信息,主要是登录系统后台时验证的依据。

表2 后台管理员信息表

字段名

类型

长度

是否允许为空

是否为主键

说明

adminid

int

false

true

自动编码

adminname

varchar

50

false

false

用户名

adminpass

varchar

50

false

false

用户密码

4.2 目录和包结构设计

以登录功能为例设置整个程序的包结构图

4.3 系统流程设计

以登录功能为例,文字描述、组件图描述

5、系统实现预览

5.1 前台

  在地址栏中输入地址进入新闻中心首页,在该页面中显示了所有的新闻,并给出了各个新闻的标题,且针对标题文字提供了相应的超链接,以便用户查看新闻

的具体内容。

图9 新闻中心首页

News_Center_Homepage

     在图中单击“所有新闻”链接后,会显示系统中的新闻,如图所示。

图10 新闻中心文件列表

News_Center File_List

单击文件标题可以查看新闻的具体内容,如图所示。

图11 查看新闻详细信息

News_Details

单击“搜索新闻”可以进行新闻的搜索,如图所示。

  图12 新闻搜索

                                                        News_Serach

输入要查询的关键字后单击“搜索新闻”即可列出新闻列表,单击新闻标题可以查看新闻内容。

5.2 后台

    点击“后台管理”超链接进入后台管理界面。在进入新闻管理主页后,首先要管理员输入账号密码后,就可以查看新闻、添加新闻、编辑新闻以及删除新闻。

图13 管理员登录界面

login

登录成功后,单击“所有新闻”链接可以查看所有新闻,如图所示。

图14 查看所有新闻

    View_All_News

单击每篇新闻的标题即可查看新闻的详细内容。

点击“编辑”链接,可以对该新闻进行修改,如图所示。

图15 编辑新闻界面

Edit_News

新闻编辑完毕后,单击“编辑提交”即可完成新闻编辑。

点击“删除”链接,可以删除该新闻。

点击“添加新闻”链接,可以添加新闻,如图所示。

图16 添加新闻界面

Add_News

本文将按照图示,展示代码

代码如下:

Bean
Admin.java

package Bean;

public class Admin {
	private int adminid;
	private String adminname;
	private String adminpass;
	public int getAdminid() {
		return adminid;
	}
	public void setAdminid(int adminid) {
		this.adminid = adminid;
	}
	public String getAdminname() {
		return adminname;
	}
	public void setAdminname(String adminname) {
		this.adminname = adminname;
	}
	public String getAdminpass() {
		return adminpass;
	}
	public void setAdminpass(String adminpass) {
		this.adminpass = adminpass;
	}
	
}

NewsDetail.java

package Bean;

public class NewsDetail {
	private int id;
	private String title;
	private String content;
	private String author;
	private String time;
	private int type;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getTime() {
		return time;
	}
	public void setTime(String time) {
		this.time = time;
	}
	public int getType() {
		return type;
	}
	public void setType(int type) {
		this.type = type;
	}
	
}

Util(数据库连接)

Conn.java

package Util;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class Conn {
	final String DB_URL = "jdbc:mysql://localhost:3306/jdbc?serverTimezone=GMT%2B8&useSSL=false";
    final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
    final String USER = "root";
    final String PASS = "123456";

    public Connection cn = null;
    public PreparedStatement pr = null;
    public ResultSet rs = null;

    public Conn() {

        try {
            Class.forName(JDBC_DRIVER);
            cn = DriverManager.getConnection(DB_URL,USER,PASS);
        }catch (Exception e){
            e.printStackTrace();
        }

    }

    public void close(){
        try {
            if (cn!=null)
                cn.close();
            if (pr!=null)
                pr.close();
            if (rs!=null)
                rs.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

}

DAO层

AllDao.java

package Dao;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import Bean.NewsDetail;
import Util.Conn;

public class AllDao {
	//搜索全部 将u其内部结果集合成一个列表
	 public List<NewsDetail> getAllArticles() {
	        List<NewsDetail> ndl = new ArrayList<>();
	        Conn cn = new Conn();
	        String sql = "SELECT id,title,content,author,time,type FROM newsdetail";
	        try {
	            cn.pr =cn.cn.prepareStatement(sql);
	            cn.rs = cn.pr.executeQuery();
	            while (cn.rs.next()) {
	            	NewsDetail nd = new NewsDetail();
	            	nd.setId(cn.rs.getInt("id"));
	            	nd.setTitle(cn.rs.getString("title"));
	            	nd.setContent(cn.rs.getString("content"));
	            	nd.setAuthor(cn.rs.getString("author"));
	            	nd.setTime(cn.rs.getString("time"));
	            	nd.setType(cn.rs.getInt("type"));
	            	//!!!!!将JavaBean里面的结果赋值到list,然后servlet再把结果以setAttribute方法展示
	            	ndl.add(nd);
	            }
	        } catch (SQLException e) {
	            e.printStackTrace();
	        } finally {
	            cn.close();
	        }
	        return ndl;
	    }
	 //模糊搜索
	  public List<NewsDetail> searchArticlesByTitle(String title) {
	        List<NewsDetail> ndl = new ArrayList<>();
	        Conn cn = new Conn();
	        // 构建模糊搜索的SQL语句,注意这里要对传入的title参数进行必要的SQL注入防范(此处仅为简单示例,实际可使用预编译等更安全的方式)
	        String sql = "SELECT * FROM newsdetail WHERE title LIKE '%" + title + "%'";
	        try {
	            cn.pr = cn.cn.prepareStatement(sql);
	            cn.rs = cn.pr.executeQuery();
	            while (cn.rs.next()) {
	                NewsDetail nd = new NewsDetail();
	                nd.setTitle(cn.rs.getString("title"));
	                nd.setAuthor(cn.rs.getString("author"));
	                nd.setTime(cn.rs.getString("time"));
	                nd.setType(cn.rs.getInt("type"));
	                ndl.add(nd);
	            }
	        } catch (SQLException e) {
	            e.printStackTrace();
	        } finally {
	            cn.close();
	        }
	        return ndl;
	  }
	  
	  // 新增的插入文章数据到newsdetail表的方法
	    public int insertArticle(String title, String content, int type, String author) {
	        Conn cn = new Conn();
	        // 注意这里的SQL语句插入数据时,要根据你的数据库表结构来确定各字段顺序以及是否有必填字段等情况,这里假设按照title、content、type、author顺序插入
	        String sql = "INSERT INTO newsdetail (title, content, type, author) VALUES (?,?,?,?)";
	        int rowsAffected = 0;
	        try {
	            cn.pr = cn.cn.prepareStatement(sql);
	            cn.pr.setString(1, title);
	            cn.pr.setString(2, content);
	            cn.pr.setInt(3, type);
	            cn.pr.setString(4, author);
	            rowsAffected = cn.pr.executeUpdate();
	        } catch (SQLException e) {
	            e.printStackTrace();
	        } finally {
	            cn.close();
	        }
	        return rowsAffected;
	    }
	    //View_All_News.jsp用于列出所有
	    public List<NewsDetail> getAllView() {
	        List<NewsDetail> ndl = new ArrayList<>();
	        Conn cn = new Conn();
	        String sql = "SELECT title,type,author,time FROM newsdetail";
	        try {
	            cn.pr =cn.cn.prepareStatement(sql);
	            cn.rs = cn.pr.executeQuery();
	            while (cn.rs.next()) {
	            	NewsDetail nd = new NewsDetail();
	            	nd.setTitle(cn.rs.getString("title"));
	            	nd.setType(cn.rs.getInt("type"));
	            	nd.setAuthor(cn.rs.getString("author"));
	            	nd.setTime(cn.rs.getString("time"));
	            	ndl.add(nd);
	            }
	        } catch (SQLException e) {
	            e.printStackTrace();
	        } finally {
	            cn.close();
	        }
	        return ndl;
	    }
	    // 新增的删除方法,根据新闻标题删除对应记录
	    public int deleteByTitle(String title) {
	        int affectedRows = 0;
	        Conn cn = new Conn();
	        String sql = "delete from newsdetail where title =?";
	        try {
	            // 使用预定义语句(PreparedStatement)来防止SQL注入,更安全且便于参数传递
	            cn.pr = cn.cn.prepareStatement(sql);
	            // 设置SQL语句中占位符(?)对应的参数值,这里就是要删除的新闻标题
	            cn.pr.setString(1, title);
	            // 执行删除操作,返回受影响的行数,即成功删除了几条记录
	            affectedRows = cn.pr.executeUpdate();
	        } catch (SQLException e) {
	            e.printStackTrace();
	        } finally {
	            cn.close();
	        }
	        return affectedRows;
	    }
	    
	 // 新增的查询方法,根据新闻标题查询对应记录
	    public List<NewsDetail> getNewsDetailByTitle(String title) {
	        List<NewsDetail> resultList = new ArrayList<>();
	        Conn cn = new Conn();
	        String sql = "select title, author, type, time,content from newsdetail where title =?";
	        try {
	            // 使用预定义语句(PreparedStatement)来防止SQL注入,更安全且便于参数传递
	            cn.pr = cn.cn.prepareStatement(sql);
	            // 设置SQL语句中占位符(?)对应的参数值,这里就是要查询的新闻标题
	            cn.pr.setString(1, title);
	            // 执行查询操作,获取结果集
	            cn.rs = cn.pr.executeQuery();
	            while (cn.rs.next()) {
	                NewsDetail nd = new NewsDetail();
	                nd.setTitle(cn.rs.getString("title"));
	                nd.setAuthor(cn.rs.getString("author"));
	                nd.setType(cn.rs.getInt("type"));
	                nd.setTime(cn.rs.getString("time"));
	                nd.setContent(cn.rs.getString("content"));
	                resultList.add(nd);
	            }
	        } catch (SQLException e) {
	            e.printStackTrace();
	        } finally {
	            cn.close();
	        }
	        return resultList;
	    }
	    // 新增的更新方法,用于更新新闻记录
	    public int updateNewsDetail(NewsDetail nd) {
	        int affectedRows = 0;
	        Conn cn = new Conn();
	        // 构建更新的SQL语句,更新指定新闻记录的多个字段(title、author、type、time、content)
	        String sql = "UPDATE newsdetail SET title =?, author =?, type =?, time =?, content =? WHERE title =?";
	        try {
	            // 使用预定义语句(PreparedStatement)来防止SQL注入,更安全且便于参数传递
	            cn.pr = cn.cn.prepareStatement(sql);
	            // 设置要更新的各个字段的值,顺序要与SQL语句中的占位符顺序对应
	            cn.pr.setString(1, nd.getTitle());
	            cn.pr.setString(2, nd.getAuthor());
	            cn.pr.setInt(3, nd.getType());
	            cn.pr.setString(4, nd.getTime());
	            cn.pr.setString(5, nd.getContent());
	            // 设置更新条件,这里以新闻标题作为更新的筛选条件(可根据实际情况调整为其他唯一标识字段,如id等)
	            cn.pr.setString(6, nd.getTitle());
	            // 执行更新操作,返回受影响的行数,即成功更新了几条记录
	            affectedRows = cn.pr.executeUpdate();
	        } catch (SQLException e) {
	            e.printStackTrace();
	        } finally {
	            cn.close();
	        }
	        return affectedRows;
	    }
	    //新增查询方法
	    public List<NewsDetail> detail(String title) {
	        List<NewsDetail> resultList = new ArrayList<>();
	        Conn cn = new Conn();
	        String sql = "select title, content, author, time, type from newsdetail where title =?";
	        try {
	            cn.pr = cn.cn.prepareStatement(sql);
	            cn.pr.setString(1, title);
	            // 执行查询操作,获取结果集
	            var rs = cn.pr.executeQuery();
	            while (rs.next()) {
	                // 从结果集中获取每一列的数据,并创建NewsDetail对象,添加到结果列表中
	            	 NewsDetail nd = new NewsDetail();
		                nd.setTitle(rs.getString("title"));
		                nd.setAuthor(rs.getString("author"));
		                nd.setType(rs.getInt("type"));
		                nd.setTime(rs.getString("time"));
		                nd.setContent(rs.getString("content"));
		                resultList.add(nd);
	            }
	        } catch (SQLException e) {
	            e.printStackTrace();
	        } finally {
	            cn.close();
	        }
	        return resultList;
	    }
}

Admin.java

package Dao;

import Bean.Admin;
import Util.Conn;

public class AdminDao {
	 Conn cn = new Conn();
	    Admin am = new Admin();
	   
	    public Admin checkLogin(String adminname, String adminpass) {
	        try {
	        	 // SQL查询语句,用于根据用户名、密码和角色查询用户信息
	            String sql = "select * from user where adminname=? and adminpass=?";
	            // 创建预编译语句对象
	            cn.pr = cn.cn.prepareStatement(sql);
	            //cn指  Conn cn = new Conn();
	            //cn.pr指调用  Conn类的public Connection cn = null; 的变量
	            // 设置参数,对应SQL语句中的?占位符
	            cn.pr.setString(1, adminname);
	            cn.pr.setString(2, adminpass);
	            // 执行查询操作,获取结果集
	            cn.rs = cn.pr.executeQuery();
	           
	            if (cn.rs.next()) {
	                // 如果有匹配的记录,则将结果集中的数据设置到User对象中
	                am.setAdminname(cn.rs.getString("adminname"));
	                am.setAdminpass(cn.rs.getString("adminpass"));

	            }
	            // 关闭相关资源,避免资源泄漏
	            cn.close();
	            return am;
	        } catch (Exception e) {
	            e.printStackTrace();
	            return null;
	        }
	    }
}

页面

News_Center_Homepage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>新闻中心首页</title>
<link rel="stylesheet" type="text/css" href="News_Center_Homepage.css">
</head>
<body>
<h1>新闻管理系统</h1>
<div>
<a class="" href="${pageContext.request.contextPath }/HomepageServlet">所有新闻</a>
<a class="" href="News_Serach.jsp">搜索新闻</a>
<a class="" href="login.jsp">后台管理</a>
</div>
</body>
</html>

News_Center_Homepage.css

h1 
{text-align:center;
color:orange}
div{
margin:0 auto;
text-align:center;
}

HomepageServlet.java

package Servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import Bean.NewsDetail;
import Dao.AllDao;

/**
 * Servlet implementation class HomepageServlet
 */
@WebServlet("/HomepageServlet")
public class HomepageServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HomepageServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;chartset=utf-8");
        //加载驱动
		 AllDao ad = new AllDao();
            //调用方法
	        List<NewsDetail> nd = ad.getAllArticles();
            //setAttribute传参
	        request.setAttribute("temp", nd);
	        request.getRequestDispatcher("/News_Center_File_List.jsp").forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

News_Center File_List.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>新闻中心文件列表</title>
 <link rel="stylesheet" type="text/css" href="News_Center_File_List.css"> 
</head>
<body> 
    <jsp:include page="News_Center_Homepage.jsp"/>
  <table border="1">
        <tr>
            <th>ID</th>
            <th>Title</th>
            <th>Content</th>
            <th>Author</th>
            <th>Time</th>
            <th>Type</th>
        </tr>
        <c:forEach items="${temp}" var="temp">
            <tr>
                <td>${temp.id}</td>
                <td><a href="${pageContext.request.contextPath }/DetailServlet?title=${temp.title}">${temp.title}</a></td>
                <td>${temp.content}</td>
                <td>${temp.author}</td>
                <td>${temp.time}</td>
                <td>${temp.type}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

News_Center File_List.css

table {
    margin: 0 auto; /* 这行代码可以让块级元素(表格在这里属于块级元素)在水平方向上居中,即左右外边距自动分配,从而实现表格在页面中水平居中 */
}

DetailServlet.java

package Servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import Bean.NewsDetail;
import Dao.AllDao;

/**
 * Servlet implementation class DetailServlet
 */
@WebServlet("/DetailServlet")
public class DetailServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DetailServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=utf-8");
		AllDao ad =new AllDao();
		String title=request.getParameter("title");
		  List<NewsDetail> nd = ad.detail(title);
		  request.setAttribute("temp3", nd);
	        request.getRequestDispatcher("/News_Details.jsp").forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

News_Details.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
         <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>新闻详细信息</title>
     <link rel="stylesheet" type="text/css" href="News_Details.css"> 
</head>
<body>
<jsp:include page="News_Center_Homepage.jsp"/>
 <table style="text-align:center">
<!--         //request.setAttribute方法,将数组赋值给temp,注意setAttribute两个参数 键值对 -->
        <c:forEach items="${temp3}" var="temp3">
 <tr>
 	<td>新闻标题</td>
 	<td>${temp3.title}</td>
 </tr>
  <tr>
 	<td>新闻类型</td>
 	<td>${temp3.type}</td>
 </tr>
  <tr>
 	<td>新闻作者</td>
 	<td>${temp3.author}</td>
 </tr>
  <tr>
 	<td>新闻内容</td>
	 <td>${temp3.content}</td>
 </tr>
  <tr>
 	<td>发布时间</td>
 	<td>${temp3.time}</td>
 </tr>
        </c:forEach>
    </table>
</body>
</html>

News_Details.css

table {
    margin: 0 auto; /* 这行代码可以让块级元素(表格在这里属于块级元素)在水平方向上居中,即左右外边距自动分配,从而实现表格在页面中水平居中 */
}

 News_Serach.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>新闻搜索</title>
 <link rel="stylesheet" type="text/css" href="News_Serach.css"> 
</head>
<body>
   <jsp:include page="News_Center_Homepage.jsp"/>
    <br>
    <div style="text-align:center">
<form action="${pageContext.request.contextPath }/SerachServlet" method="get">
欢迎
关键字:<input type="text" name="title">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="submit" value="提交">
</form>
<!-- 使用session将param获取的title存储,然后用setAttribute -->
<p>您搜索的关键字是${sessionScope.temp1 }</p><br>
<p>搜索结果如下:</p>
 <table border="1" style="text-align:center">
        <tr>
            <th>Title</th>
            <th>Author</th>
            <th>Time</th>
        </tr>
<!--         //request.setAttribute方法,将数组赋值给temp,注意setAttribute两个参数 键值对 -->
        <c:forEach items="${temp}" var="temp">
            <tr>
                <td><a href="${pageContext.request.contextPath }/DetailServlet?title=${temp.title}">${temp.title}</a></td>
                <td>${temp.author}</td>
                <td>${temp.time}</td>
            </tr>
        </c:forEach>
    </table>
    </div>
</body>
</html>

News_Serach.css

table {
    margin: 0 auto; /* 这行代码可以让块级元素(表格在这里属于块级元素)在水平方向上居中,即左右外边距自动分配,从而实现表格在页面中水平居中 */
}

SerachServlet.java

package Servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import Bean.NewsDetail;
import Dao.AllDao;

/**
 * Servlet implementation class SerachServlet
 */
@WebServlet("/SerachServlet")
public class SerachServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public SerachServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;chartset=utf-8");
		AllDao ad =new AllDao();
		String title=request.getParameter("title");
		HttpSession session = request.getSession();
		  List<NewsDetail> nd = ad.searchArticlesByTitle(title);
		  session.setAttribute("temp1", title);
		  request.setAttribute("temp", nd);
	        request.getRequestDispatcher("/News_Serach.jsp").forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
<link rel="stylesheet" type="text/css" href="login.css">
</head>
<body>
  <jsp:include page="News_Center_Homepage.jsp"/>
<form action="${pageContext.request.contextPath }/LoginServlet" method="post">
<!-- 转发到LoginServlet.java进行处理,method为post方法 -->
<div class="box">
    <h2>登录</h2>
    <div class="ch1">
      <label>账号</label>
      <input type="text" class="text" name="adminname"/>
    </div>
    <div class="ch2">
      <label>密码</label>
      <input type="password" class="password" name="adminpass"/>${errerMsg}
		<!--       ${errerMsg}表达式语言,request.setAttribute("errerMsg", "登录失败"); -->
    </div>
    <div class="ch">
        <input type="submit" value="提交">&nbsp;&nbsp;<input type="reset" value="重置">
        <!-- type="submit"一定要写submit!!!!! -->
    </div>
  </div>
</form>
</body>
</html>

login.css

body {
    background-color: pink;
}

.box {
    text-align: center;
}

LoginServlet.java

package Servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import Bean.Admin;
import Dao.AdminDao;
import Util.Conn;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//加载驱动
				response.setContentType("text/html;chartset=utf-8");
		        Conn cn = new Conn();
		        Admin am = new Admin();
		        AdminDao ad=new AdminDao();
		        //传递参数 设置session
		        String adminname=request.getParameter("adminname");
		        String adminpass=request.getParameter("adminpass");
		        // 可以在后续的请求处理中通过这个键来获取用户对象
		        HttpSession session = request.getSession();
		        ad.checkLogin(adminname, adminpass);
		        //表达式语言,传参到前端
		        request.getSession().setAttribute("temp", ad);
				if (adminname!=null&&adminpass!=null) {	
					request.setAttribute("message", "登录成功");
						request.getRequestDispatcher("Success.jsp").forward(request,response);
					
				} else {
					//此判断作为登录失败,跳转到login.jsp
					request.getRequestDispatcher("login.jsp").forward(request,response);
					request.setAttribute("errerMsg", "登录失败");

				}
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(request, response);
	}



}

Success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>后台管理系统</title>
     <link rel="stylesheet" type="text/css" href="Success.css"> 
</head>
<body>
<h1>新闻管理系统</h1>
<div class='1' >
<a href="${pageContext.request.contextPath }/View_all_News_Servlet">所有新闻</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="Add_News.jsp">添加新闻</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="login.jsp">系统登录</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="#">新闻主页</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

<p style="text-align: center;">${message}</p>
</div>
</body>
</html>

Success.css

h1 
{text-align:center;
color:orange}
div{
margin:0 auto;
text-align:center;
}

View_all_News_Servlet.java

package Servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import Bean.NewsDetail;
import Dao.AllDao;

/**
 * Servlet implementation class View_all_News_Servlet
 */
@WebServlet("/View_all_News_Servlet")
public class View_all_News_Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public View_all_News_Servlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;chartset=utf-8");
		 AllDao ad = new AllDao();
	        List<NewsDetail> nd = ad.getAllView();
	        request.setAttribute("temp", nd);
	        request.getRequestDispatcher("/View_All_News.jsp").forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

View_All_News.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
        <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>查看所有新闻</title>
     <link rel="stylesheet" type="text/css" href="View_All_News.css"> 
</head>
<body>
        <jsp:include page="Success.jsp"/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 <table class="res-table" style="margin: auto">
			<caption>所有新闻列表</caption>
            <tr class="res-tr">
                <td>新闻标题</td>
                <td>新闻作者</td>
                <td>新闻分类</td>
                <td>发布时间</td>
                <td>是否编辑</td>
                <td>是否移除</td>
            </tr>
           <!--  //表达式语言 用于遍历  -->
            <c:forEach items="${temp}" var="temp">
                <tr>
                    <td>${temp.title}</td>
                    <td>${temp.author}</td>
                    <td>${temp.type}</td>
                    <td>${temp.time}</td>
                    <td>
                        <form action="${pageContext.request.contextPath }/NewsChangeServlet1" method="get">
                            <input type="hidden" name="title" value="${temp.title}">
                            <!-- 使用hidden参数 在request中携带参数title -->
                            <input type="submit" value="编辑">
                        </form>
                    </td>
                    <td>
                        <form action="${pageContext.request.contextPath }/NewsChangeServlet" method="get">
                            <input type="hidden" name="title" value="${temp.title}">
                            <input type="submit" value="删除">
                        </form>
                    </td>
                </tr>
            </c:forEach>
        </table>
</body>
</html>

View_All_News.css

/* 使表格水平居中 */
.res-table {
    margin: 0 auto;
    border-collapse: collapse; /* 合并表格边框 */
}

/* 表格单元格内文字水平和垂直居中 */
.res-table td {
    text-align: center;
    vertical-align: middle;
    padding: 8px 12px; /* 可选:设置单元格内边距,使内容看起来更舒适 */
}

/* 表头文字加粗(可选) */
.res-tr td {
    font-weight: bold;
}

NewsChangeServlet1.java

package Servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import Bean.NewsDetail;
import Dao.AllDao;

/**
 * Servlet implementation class NewsChangeServlet1
 */
@WebServlet("/NewsChangeServlet1")
public class NewsChangeServlet1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public NewsChangeServlet1() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=utf-8");
		 // 1. 获取从JSP页面传递过来的标题参数
        String title = request.getParameter("title");
        // 2. 创建DAO层对象,调用查询方法获取对应新闻详情记录
        AllDao ad = new AllDao();
        List<NewsDetail> nd = ad.getNewsDetailByTitle(title);
        if (nd == null || nd.isEmpty()) {
            // 如果没有查询到对应记录,进行相应提示,比如重定向到某个提示页面
        	  response.getWriter().write("请检查输入!");
        	  response.getWriter().write("111");
            return;
        }
        request.setAttribute("temp2", nd);
        // 4. 转发请求到编辑页面edit.jsp,让用户可以进行编辑操作
        request.getRequestDispatcher("/Edit_News.jsp").forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

NewsChangeServlet.java

package Servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import Dao.AllDao;

/**
 * Servlet implementation class NewsChangeServlet
 */
@WebServlet("/NewsChangeServlet")
public class NewsChangeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public NewsChangeServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;chartset=utf-8");
		 // 1. 获取从JSP页面传递过来的标题参数
        String title = request.getParameter("title");
        // 2. 创建DAO层对象,用于调用删除方法
        AllDao ad = new AllDao();
        // 3. 调用DAO层的deleteByTitle方法执行删除操作,并获取受影响的行数
        int affectedRows = ad.deleteByTitle(title);
        if (affectedRows > 0) {
        	request.setAttribute("message", "删除成功");
            // 如果受影响行数大于0,说明有记录被成功删除,可进行相应的成功提示等操作,比如重定向到某个页面展示操作成功信息
        	request.getRequestDispatcher("/Success.jsp").forward(request, response);
        } else {
            // 如果受影响行数为0,说明没有找到匹配的记录进行删除,同样可以进行相应的提示操作,比如重定向到某个页面展示未找到记录的提示信息
        	response.getWriter().write("请检查!");
        }
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

Edit_News.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
            <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>编辑新闻</title>
     <link rel="stylesheet" type="text/css" href="Edit_News.css"> 
</head>
<body>
<form action="${pageContext.request.contextPath}/Edit_News_Servlet" method="post">
<table class="res-table" style="margin: auto" >
			<!-- //获取后端传来的值 -->
            <c:forEach items="${temp2}" var="temp2">
	<tr>
		<td>新闻标题</td>
		<td><input type="text" name="title" value="${temp2.title}"></td>
	</tr>
	<tr>
		<td>新闻作者</td>
		<td><input type="text" name="author" value="${temp2.author}"></td>
	</tr>
	<tr>
		<td>新闻分类</td>
		<td><input type="text" name="type" value="${temp2.type}"></td>
	</tr>
	<tr>
		<td>发布时间</td>
		 <td><input type="text" name="time" value="${temp2.time}"></td>
	</tr>
	<tr>
		<td>新闻内容</td>
		<td><textarea name="content" cols="35" rows="15">${temp2.content}</textarea></td>
	</tr>
            </c:forEach>
            <tr>
            <td>操作</td>
            <td><input type="submit" value="更新"></td>
            </tr>
        </table>
</form>
</body>
</html>

Edit_News.css(空)

Edit_News_Servlet.java

package Servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import Bean.NewsDetail;
import Dao.AllDao;

/**
 * Servlet implementation class Edit_News_Servlet
 */
@WebServlet("/Edit_News_Servlet")
public class Edit_News_Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Edit_News_Servlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;chartset=utf-8");
		// 1. 从请求中获取要更新的新闻记录各字段参数值
        String title = request.getParameter("title");
        String author = request.getParameter("author");
        String typeStr = request.getParameter("type");
        int type=Integer.parseInt(typeStr);
        String time = request.getParameter("time");
        String content = request.getParameter("content");
        // 对获取到的参数进行必要的校验,这里简单判断非空,实际中可根据具体业务需求增加更详细的校验逻辑
        if (title == null || title.isEmpty() || author == null || author.isEmpty() || typeStr == null || typeStr.isEmpty()
                || time == null || time.isEmpty() || content == null || content.isEmpty()) {
            // 如果参数有空值,返回错误提示信息给客户端,告知参数不能为空
            response.getWriter().write("更新的参数不能为空,请检查输入!");
            return;
        }
        // 2. 创建NewsDetail对象,将获取到的参数值封装进去
        NewsDetail nd = new NewsDetail();
        nd.setTitle(title);
        nd.setAuthor(author);
        nd.setType(type);
        nd.setTime(time);
        nd.setContent(content);

        // 3. 创建DAO层对象,用于调用更新方法
        AllDao ad = new AllDao();
        // 调用DAO层的updateNewsDetail方法执行更新操作,并获取受影响的行数
        int affectedRows = ad.updateNewsDetail(nd);
System.out.print(affectedRows);
        if (affectedRows > 0) {
        	request.setAttribute("message", "更新成功");
            // 如果受影响行数大于0,说明有记录被成功更新,可进行相应的成功提示等操作,比如重定向到某个页面展示操作成功信息
            response.sendRedirect(request.getContextPath() + "/Success.jsp");
        } else {
            // 如果受影响行数为0,说明没有找到匹配的记录进行更新,同样可以进行相应的提示操作,比如重定向到某个页面展示未找到记录的提示信息
        	response.getWriter().write("请检查输入!");
        }
    }
}

Add_News.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>添加新闻</title>
<link rel="stylesheet" type="text/css" href="Add_News.css"> 
</head>
<body>
        <jsp:include page="Success.jsp"/>
<form action="${pageContext.request.contextPath }/Add_NewsServlet" method="post">
<table align="center">
<tr>
    <!-- 文本输入框 -->
    <td>新闻标题</td>
    <td><input type="text" name="title"></td>
</tr>
<tr>
    <!-- 文本输入框 -->
    <td>新闻内容</td>
    <td><input type="text" name="content"></td>
</tr>
<tr>
    <!-- 文本输入框 -->
    <td>新闻类型</td>
    <td><textarea name="type" cols="35" rows="15"></textarea></td>
</tr>
<tr>
    <!-- 文本输入框 -->
    <td>新闻作者</td>
    <td><input type="text" name="author"></td>
</tr>
<tr>
    <td>操作</td>
    <td><input type="submit" value="添加">
    <!-- 重置按钮 -->
    <input type="reset" value="取消">
    </td></tr>
</table>
</form>
</body>
</html>

Add_News.css

/* 让表格水平居中 */
table {
    margin: 0 auto;
}

/* 设置文本输入框的宽度 */
input[type="text"] {
    width: 300px;
}

/* 设置文本域的列数和行数 */
textarea {
    cols: 35;
    rows: 15;
}

Add_News.java

package Servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import Dao.AllDao;

/**
 * Servlet implementation class Add_NewsServlet
 */
@WebServlet("/Add_NewsServlet")
public class Add_NewsServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Add_NewsServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		AllDao ad = new AllDao();
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        // 从前端页面的表单中获取提交的数据
        String title = request.getParameter("title");
        String content = request.getParameter("content");
        String typeStr = request.getParameter("type");
        int type=Integer.parseInt(typeStr);
        String author = request.getParameter("author");
        int rowsAffected = ad.insertArticle(title,content,type,author);
        if (rowsAffected > 0) {
        	request.setAttribute("message", "添加成功");
            // 如果插入成功,返回成功提示信息给前端页面
        	 request.getRequestDispatcher("/Success.jsp").forward(request, response);        
        } else {
            // 如果插入失败,返回失败提示信息给前端页面
            response.getWriter().println("文章插入失败,请检查数据是否正确!");
        }
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(request, response);
	}

}