要求:
创建新闻表,用户登录时,用servlet获取用户名密码,查询数据库是否存在,如果是正确的用户名密码,查询新闻表,将新闻数据传给JSP首页,JSP首页用EL表达式显示新闻标题列表。
实现效果:
登录界面:
登录失败:
登录成功,跳转到新闻界面
新闻列表界面:
实现思路:
1.项目结构:
java部分:
web部分:
其中test.css,test.html,test.js为登录主界面,具体实现可查看:记录第一次JavaWeb项目开发
其中yinglang为导入的新闻模板
2.数据库部分
新建News表:
create table News
(
idnews int,
category varchar(50),
title varchar(50),
content varchar(50),
author varchar(50),
newsdate date,
)
插入数据:
3.代码部分
1.DatabaseOperation
数据库相关
package Controller;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DatabaseOperation {
// 数据库连接
private Connection conn = null;
// 通过注入参数的方式使数据库访问更加安全
private PreparedStatement pstmt = null;
// 数据库返回的结果
private ResultSet rs = null;
public DatabaseOperation() {
Connection connection = null;
try {
// 注册驱动程序
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
this.conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databasename=NEWS_SYSTEM",
"sa", "123456");
} catch (Exception e) {
System.out.println(getCurrentTime() + ",构造函数处引发了异常:\n" + e.getMessage());
}
}
public static Connection getConnection() {
Connection connection = null;
try {
// 注册驱动程序
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
connection = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databasename=NEWS_SYSTEM",
"sa", "123456");
return connection;
} catch (Exception e) {
System.out.println(getCurrentTime() + ",构造函数处引发了异常:\n" + e.getMessage());
return null;
}
}
//select
public static ResultSet executeQuery(String SQL)
{
try
{
Connection conn=getConnection();
Statement stmt=conn.createStatement();
ResultSet rs=stmt.executeQuery(SQL);
return rs;
} catch (SQLException e) {
e.printStackTrace();
System.out.println("查询失败!");
System.out.println("-------------------------------");
return null;
}
}
/***
* 判断登录是否成功
* @param user 用户名
* @param password 密码
* @return 数据库查找结果
*/
public boolean login(String user, String password) {
String sql = "select * from users where name=? and pwd=?";
boolean exists = false;
try {
this.pstmt = conn.prepareStatement(sql);
this.pstmt.setString(1, user);
this.pstmt.setString(2, password);
this.rs = this.pstmt.executeQuery();
if (this.rs.next()) {
exists = true;
}
} catch (Exception e) {
System.out.println(getCurrentTime() + ",登录校验处引发了异常:\n" + e.getMessage());
}
return exists;
}
/***
* 更改数据库
* @param database 数据库名称
* @param user 用户名
* @param password 密码
*/
public void updateDatabase(String database, String user, String password) {
try {
this.conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databasename=" + database,
user, password);
} catch (Exception e) {
System.out.println(getCurrentTime() + ",更新数据库信息处引发了异常:\n" + e.getMessage());
}
}
/***
* 关闭数据库所有相关连接
*/
public void closeConnection() {
try {
if (this.conn != null) {
this.conn.close();
}
if (this.pstmt != null) {
this.pstmt.close();
}
if (this.rs != null) {
this.rs.close();
}
} catch (Exception e) {
System.out.println(getCurrentTime() + ",关闭数据库连接处引发了异常:\n" + e.getMessage());
}
}
/***
* 获取当前时间
* @return 当前时间
*/
public static String getCurrentTime() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
return sdf.format(date);
}
}
2.NewsService
提供News类的数据服务(目前只完善了查询所有新闻内容的函数)
package Service;
import Controller.DatabaseOperation;
import Entity.News;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
//提供News类的数据服务
public class NewsService {
public void AddNews(){
}
public void DeleteNews(){
}
public void UpdateNews(){
}
public List<News> QueryNews() throws SQLException {
String sql="Select * from news";
DatabaseOperation operation=new DatabaseOperation();
ResultSet rs= operation.executeQuery(sql);
List<News> lsNews=new ArrayList<News>();
while (rs.next())
{
News news=new News();
news.setIdnews(rs.getInt(1));
news.setCategory(rs.getString(2));
news.setTitle(rs.getString(3));
news.setContent(rs.getString(4));
news.setAuthor(rs.getString(5));
news.setNewsdate(rs.getDate(6));
lsNews.add(news);
}
return lsNews;
}
public void GetNews(){
}
}
3.ShowNewsListServlet
从NewsService中获取所需的数据,并将数据传递给ShowNewsList.jsp来显示
package Controller;
import Entity.News;
import Service.NewsService;
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 java.io.IOException;
import java.sql.SQLException;
import java.util.List;
@WebServlet(name = "Controller.ShowNewsListServlet")
public class ShowNewsListServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
NewsService newsService=new NewsService();
try {
List<News> lsNews=newsService.QueryNews();
request.setAttribute("lsNews",lsNews);
request.getRequestDispatcher("ShowNewsList.jsp").forward(request,response);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
4.News
用于映射数据库中的news表
package Entity;
import java.sql.Date;
public class News {
private int idnews;
private String category;
private String title;
private String content;
private String author;
private Date newsdate;
public int getIdnews() {
return idnews;
}
public void setIdnews(int idnews) {
this.idnews = idnews;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
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 Date getNewsdate() {
return newsdate;
}
public void setNewsdate(Date newsdate) {
this.newsdate = newsdate;
}
}
5.Users
用于映射数据库中的users表
6.ShowNewsList.jsp
增加循环的代码,其中的lsNews数据就是在ShowNewsListServlet通过服务获取到并传递给该jsp文件的数据
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:forEach var="n" items="${lsNews}" >
<tr>
<td width="10%">${
n.idnews}</td>
<td width="30%">${
n.title}</td>
<td width="20%">${
n.content} </td>
<td width="15%">${
n.author}</td>
<td width="10%">${
n.newsdate}</td>
<td width="15%">
<a href="editServlet?newid=${n.idnews}" class="bj_btn">编辑</a>
<a href="viewServlet?newid=${n.idnews}" class="sj_btn">查看</a>
<a href="deleteServlet?newid=${n.idnews}" class="del_btn">删除</a>
</td>
</tr>
</c:forEach>
需要导入jar包
7.web.xml
配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>Controller.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ShowNewsListServlet</servlet-name>
<servlet-class>Controller.ShowNewsListServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ShowNewsListServlet</servlet-name>
<url-pattern>/yinglang/ShowNewsListServlet</url-pattern>
</servlet-mapping>
<!--设置会话超时为一分钟-->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
</web-app>