练习1、创建新闻系统数据库
练习2、实现管理员登录验证
练习3、显示新闻列表
练习4、显示新闻主题列表
练习5、添加新闻主题
练习6、实现发布新闻
项目实现步骤:
1、创建数据库与表
(1)用户表user结构
(2)栏目表topic结构
(3)新闻表news结构
(4)评论表comment结构
数据库脚本news.sql下载链接:https://pan.baidu.com/s/1L8LNh5_tgFGPke6gR-lQ5w 提取码:gc0q
2、创建Web项目DataSourceDemo
3、在WEB-INF目录里创建lib目录,添加MySQL数据库驱动程序jar包
4、在web目录里创建META-INF子目录,在里面创建数据源配置文件context.xml
5、在src里创建net.cw.dbutil包,在里面创建ConnectionManager类
package net.cw.dbutil;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
/**
* 功能:数据库连接管理器
* 作者:cw
* 日期:2019年11月7日
*/
public class ConnectionManager {
/**
* 私有化构造方法,拒绝实例化
*/
private ConnectionManager() {
}
/**
* 获取数据库连接静态方法
*
* @return 数据库连接
*/
public static Connection getConnection() {
// 定义数据库连接
Connection conn = null;
try {
// 初始化上下文
Context ctx = new InitialContext();
// 在数据库连接池莉查询获取数据源
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/news");
// 通过数据源获取数据库连接
conn = ds.getConnection();
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
// 返回数据库连接
return conn;
}
public static void main(String[] args) {
Connection conn = getConnection();
if (conn != null) {
System.out.println("恭喜,数据库连接成功!");
} else {
System.out.println("遗憾,数据库连接失败!");
}
}
}
6、在web目录里修改首页文件index.jsp
7、在web目录里创建login.jsp页面,实现管理员登录
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<h3 style="text-align: center">用户登录</h3>
<form action="do_login.jsp" method="post">
<table border="1" cellpadding="10" style="margin: 0px auto">
<tr>
<td align="center">用户名</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td align="center">密 码</td>
<td><input type="password" name="password"/></td>
</tr>
<tr align="center">
<td colspan="2">
<input type="submit" value="登录"/>
<input type="reset" value="重置"/>
</td>
</tr>
</table>
</form>
<%
String errMsg = (String) session.getAttribute("errMsg");
if (errMsg != null) {
out.println("<p style='text-align: center; color: red'>" + new String(errMsg.getBytes("ISO-8859-1"), "utf-8") + "</p>");
}
%>
</body>
</html>
8、在web目录里创建do_login.jsp页面,验证登录
<%@ page import="java.sql.*" %>
<%@ page import="java.net.URLEncoder" %>
<%
// 设置请求对象字符编码
request.setCharacterEncoding("utf-8");
// 获取表单提交的数据
String username = request.getParameter("username");
String password = request.getParameter("password");
// 设置连接数据库的参数值
final String DRIVER = "com.mysql.jdbc.Driver";
final String URL = "jdbc:mysql://localhost:3306/news";
final String USER = "root";
final String PASSWORD = "1";
try {
// 安装数据库驱动程序
Class.forName(DRIVER);
// 获取数据库连接
Connection conn = DriverManager.getConnection(URL + "?useUnicode=true&characterEncoding=utf8", USER, PASSWORD);
// 定义SQL字符串
String strSQL = "select * from t_user where username = ? and password = ?";
// 创建预备语句对象
PreparedStatement pstmt = conn.prepareStatement(strSQL);
// 设置占位符的值
pstmt.setString(1, username);
pstmt.setString(2, password);
// 执行SQL查询,返回结果集
ResultSet rs = pstmt.executeQuery();
// 判断结果集是否有记录
if (rs.next()) {
// 清除session里可能存在的属性值
if (session.getAttribute("errMsg") != null) {
session.removeAttribute("errMsg");
}
// 采用重定向,跳转到登录成功页面
response.sendRedirect("success.jsp?username=" + URLEncoder.encode(username, "utf-8"));
} else {
// 设置session属性值
session.setAttribute("errMsg", "用户名或密码错误,请重新登录");
// 采用重定向,跳转到登录页面
response.sendRedirect("login.jsp");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
%>
9、在web目录里创建topic_list.jsp页面,显示新闻主题列表
<%@ page import="java.sql.Connection" %>
<%@ page import="net.cw.dbutil.ConnectionManager" %>
<%@ page import="java.sql.Statement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>新闻栏目列表</title>
</head>
<body>
<%
// 获取数据库连接
Connection conn = ConnectionManager.getConnection();
// 定义SQL字符串
String strSQL = "select * from topic";
// 创建语句对象
Statement stmt = conn.createStatement();
// 执行SQL查询,返回结果集
ResultSet rs = stmt.executeQuery(strSQL);
out.println("<table border='1' cellpadding='10'>" +
"<tr><td width='50' align='center'><b>编号</b></td><td width='100' align='center'><b>栏目</b></td></tr>");
// 遍历结果集,分行显示在页面
while (rs.next()) {
out.println("<tr><td align='center'>" + rs.getInt("tid") + "</td><td align='center'>" + rs.getString("tname") + "</td></tr>");
}
out.println("</table>");
%>
</body>
</html>
10、在web目录里创建news.jsp页面,显示新闻列表
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="net.cw.dbutil.ConnectionManager" %>
<%@ page import="java.sql.Statement" %>
<%@ page import="java.sql.ResultSet" %>
<html>
<head>
<title>新闻列表</title>
</head>
<body>
<%
// 获取数据库连接
Connection conn = ConnectionManager.getConnection();
// 定义SQL字符串
String strSQL = "select * from news";
// 创建语句对象
Statement stmt = conn.createStatement();
// 执行SQL查询,返回结果集
ResultSet rs = stmt.executeQuery(strSQL);
out.println("<table border='1' cellpadding='10'>" +
"<tr><td width='50' align='center'><b>编号</b></td><td width='100' align='center'><b>标题</b></td>" +
"<td width='100' align='center'><b>作者</b></td><td width='100' align='center'>" +
"<b>评论</b></td><td width='100' align='center'><b>摘要</b></td></tr>");
// 遍历结果集,分行显示在页面
while (rs.next()) {
out.println("<tr><td align='center'>" + rs.getInt("nid")
+"</td><td align='center'>" + rs.getString("ntitle")
+"</td><td align='center'>" + rs.getString("nauthor")
+"</td><td align='center'>" + rs.getString("ncontent")
+"</td><td align='center'>" + rs.getString("nsummary")
+ "</td></tr>");
}
out.println("</table>");
%>
</body>
</html>
启动服务器,查看运行效果