垃圾的網上論壇
一個使用JSP+Servlet+JavaBean+DAO+JDBC+Oracle開發的垃圾的網上論壇
1.網上論壇需求分析
這裏主要實現網上論壇的兩個基本模塊,即登錄註冊模塊和留言板模塊。登錄註冊模塊主要包括用戶登錄、註冊、忘記密碼,留言板模塊主要包括髮表留言、回覆留言、修改留言、刪除留言、顯示留言等功能。
- 用例圖如圖1-1所示。
圖1-1 網上論壇用例圖
2.數據庫設計
2.1數據庫概念結構設計
通過對網上論壇中數據及數據處理過程的分析,抽象出用戶信息(user_info)、留言信息(guestbook)、回覆信息(reply)3個實體,ER圖如圖2-1所示。
圖2-1 網上論壇ER圖
2.2數據庫邏輯結構設計
根據網上論壇ER圖,設計出該系統的3個關係表,分別爲user_info(用戶信息)、guestbook(留言信息)、reply(回覆信息)。表結構及其約束情況見表2-2至表2-4。
- 表2-2 user_info表結構及其約束
-
表2-3 guestbook表結構及其約束
-
表2-4 reply表結構及其約束
-
表之間的關係圖見圖2-2:
圖2-2 表之間的關係圖
2.3序列設計
爲了方便產生留言的id、回覆的id,在數據庫中分別用下列序列產生相應編號。
- guestbook_id_seq:產生留言的id,起始值爲2019070400,步長爲1,不緩存,不循環。
- reply_id_seq:產生回覆的id,起始值爲2019070600,步長爲1,不緩存,不循環。
3.網上論壇數據庫實現
3.1表的創建
create table user_info (
user_name varchar2(20) primary key,
user_pwd varchar2(20) not null);
create table guestbook (
guestbook_id number(10, 0) primary key,
user_name varchar2(20) not null references user_info(user_name),
guestbook_title varchar2(100) not null,
guestbook_content varchar2(2000) not null,
guestbook_date date not null);
create table reply (
reply_id number(10, 0) primary key,
guestbook_id number(10, 0) not null references guestbook(guestbook_id),
host_user_name varchar2(20) not null references user_info(user_name),
guest_user_name varchar2(20) not null references user_info(user_name),
reply_content varchar2(100) not null,
reply_date date not null);
3.2序列的創建
create sequence guestbook_id_seq start with 2019070400 increment by 1 nocache;
create sequence reply_id_seq start with 2019070600 increment by 1 nocache;
4.網上論壇主界面設計
4.1登錄與註冊界面設計
用戶需要登錄過後纔可以使用發表留言等其他功能。用戶登錄界面如圖4-1所示。用戶在登錄之前需要先進行註冊,註冊界面如圖4-2所示。
圖4-1 用戶登錄界面
圖4-2 用戶註冊界面
4.2 發表留言界面設計
登錄成功後跳轉到發表留言頁面,在發表留言頁面輸入留言標題和內容,點擊發表按鈕,即可發表留言。發表留言界面如圖4-3所示。
圖4-3 發表留言界面
4.3查看留言界面設計
每一個用戶都可以查看到所有的留言,並且也可以回覆所有的留言,但是隻能修改和刪除自己發表的留言。查看留言部分界面如圖4-4所示。
圖4-4 查看留言界面
4.4修改留言界面設計
每個用戶在查看留言頁面可以看到在自己發表的留言的右上角有一個修改鏈接,點擊修改,可跳轉至修改留言界面,在原有內容上進行修改,點擊修改按鈕即可。每個用戶只能修改自己的留言,不是自己發表的留言不會出現修改鏈接,無法修改。修改留言界面如圖4-5所示。
圖4-5 修改留言界面
5.網上論壇主要功能實現
5.1網上論壇設計概述
本系統採用
JSP
+Servlet
+JavaBean
+DAO
+JDBC
+Oracle
+Bootstrap
+Layer
+HTML
+CSS
+
JavaScript
+EL
+JSTL
等技術開發,使用IntelliJ IDEA
、Tomcat
、Database Configuration Assistant
、sqldeveloper
、Chrome
、Sublime Text
等工具進行開發。
使用的開發環境以及開發工具的版本如表5-1所示。
-
表5-1 開發環境以及開發工具
表5-1 開發環境以及開發工具 -
架構圖如圖5-1所示:
圖5-1 架構圖
5.2系統目錄結構
- 系統的目錄結構如下:
//java代碼部分
.src
│ db.properties //連接數據庫的配置文件
│
├─beans
│ GuestBook.java //對應guestbook表,包含該表中字段的set和get方法
│ Reply.java //對應reply表,包含該表中字段的set和get方法
│ UserInfo.java //對應user_info表,包含表中字段的set和get方法
│
├─dao
│ GuestBook_dao.java //進行留言的增刪改查
│ Register_dao.java //添加用戶
│ Reply_dao.java //進行回覆的添加和查找顯示
│ SearchGuestBook_dao.java //通過guestbook_id查找留言,修改留言是用到
│
├─dbc
│ JdbcUtil.java //數據庫的連接和釋放資源工具
│
└─servlets
DeleteForumServlet.java //實現刪除留言操作
ForumServlet.java //實現發表留言操作
LoginServlet.java //實現登錄操作
LookForumServlet.java //實現查看留言操作
ModifyForumServlet.java //實現修改留言操作
RegisterServlet.java //實現註冊操作
ReplyForumServlet.java //實現回覆操作
ToModifyForumServlet.java //協助實現修改留言操作
//web部分的目錄結構
.web
│ forum.jsp //發表留言頁面
│ index.jsp //默認入口頁面、登錄頁面
│ look-forum.jsp //查看留言頁面
│ modify-forum.jsp //修改留言頁面
│ register.jsp //註冊頁面
│
├─css
│ forum.css //發表留言頁面css樣式
│ login.css //登錄、註冊頁面樣式
│
├─img
│ avatar.png //頭像
│ github.png //logo
│
├─layer //layer組件庫
│
│
└─WEB-INF
│ web.xml //Servlet的配置
│
└─lib
jstl.jar //jstl的jar包
standard.jar //jstl的jar包
5.3註冊功能實現
用戶在註冊頁面輸入用戶名和密碼、確認密碼後,點擊註冊按鈕,即可註冊。本系統中每個用戶的用戶名是唯一的,不能相同,在註冊時如果用戶名相同,會提示該用戶已註冊,用戶需要重新輸入用戶名。如果用戶名爲被註冊過,點擊註冊按鈕後會提示註冊成功,並跳轉至登錄頁面。
//RegisterServlet.java核心代碼:
conn = JdbcUtil.getConnection();
String checkRegisterSql = "select user_name from user_info where user_name = ?";
ps = conn.prepareStatement(checkRegisterSql);
ps.setString(1, username);
rs = ps.executeQuery();
if (!rs.next()) {
userInfo.setUsername(username);
userInfo.setUserpwd(userpwd);
register_dao.addUserInfo(userInfo);
toast = "註冊成功";
request.setAttribute("toast", toast);
request.getRequestDispatcher("index.jsp").forward(request, response);
} else {
toast = "該用戶名已註冊";
request.setAttribute("toast", toast);
request.getRequestDispatcher("register.jsp").forward(request, response);
}
// Register_dao.java核心代碼:
public class Register_dao {
public UserInfo addUserInfo(UserInfo userInfo) throws Exception {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JdbcUtil.getConnection();
String addUserInfoSql = "insert into user_info values(?, ?)";
ps = conn.prepareStatement(addUserInfoSql);
ps.setString(1, userInfo.getUsername());
ps.setString(2, userInfo.getUserpwd());
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return userInfo;
}
}
5.4登錄功能實現
用戶在登錄頁面輸入用戶名和密碼,點擊登錄按鈕,即可登錄。如果用戶名未註冊或用戶名和密碼不匹配會提示賬號或密碼錯誤,用戶需要重新輸入用戶名和密碼。如果用戶名和密碼均輸入正確並且匹配,會提示登錄成功,並跳轉至發表留言頁面。
//LoginServlet.java核心代碼:
conn = JdbcUtil.getConnection();
String checkLoginSql = "select user_name from user_info where user_name = ? and user_pwd = ?";
ps = conn.prepareStatement(checkLoginSql);
ps.setString(1, username);
ps.setString(2, userpwd);
rs = ps.executeQuery();
if (rs.next()) {
toast = "登錄成功";
request.setAttribute("toast", toast);
request.getRequestDispatcher("forum.jsp").forward(request, response);
} else {
toast = "賬號或密碼錯誤";
request.setAttribute("toast", toast);
request.getRequestDispatcher("index.jsp").forward(request, response);
}
5.5發表留言功能實現
用戶在發表留言頁面輸入留言標題和留言內容,點擊發表按鈕,即可發表留言。發表成功後會提示發表成功並跳轉至查看留言頁面。在發表留言頁面用戶也可以直接點擊查看留言,會跳轉至查看留言頁面。最新發布的留言會顯示在最上面。
//ForumServlet.java核心代碼:
GuestBook guestBook = new GuestBook();
guestBook.setGuestbook_title(guestBook_title);
guestBook.setGuestbook_content(guestBook_content);
guestBook.setUser_name(username);
GuestBook_dao guestBook_dao = new GuestBook_dao();
try {
guestBook_dao.addGuestBook(guestBook);
toast = "發表成功";
request.setAttribute("toast", toast);
request.getRequestDispatcher("LookForumServlet").forward(request, response);
} catch (Exception e) {
toast = "發表失敗";
request.setAttribute("toast", toast);
request.getRequestDispatcher("LookForumServlet").forward(request, response);
e.printStackTrace();
}
//GuestBook_dao.java添加留言核心代碼:
public GuestBook addGuestBook(GuestBook guestBook) throws Exception {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JdbcUtil.getConnection();
String addGuestBookSql = "insert into guestbook values(guestbook_id_seq.nextval, ?, ?, ?, SYSDATE)";
ps = conn.prepareStatement(addGuestBookSql);
ps.setString(1, guestBook.getUser_name());
ps.setString(2, guestBook.getGuestbook_title());
ps.setString(3, guestBook.getGuestbook_content());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.free(null, ps, conn);
}
return guestBook;
}
5.5查看留言功能實現
在查看留言頁面,用戶可以查看所有的留言和所有的回覆,並且可以回覆所有的留言,同時可以對自己發表的留言進行修改和刪除。在自己發表的留言的右上角會出現修改和刪除鏈接,點擊修改會跳轉到修改留言頁面,點擊刪除可刪除該留言。
//LookForumServlet.java核心代碼:
List<GuestBook> guestBookList;
guestBookList = guestBook_dao.lookGuestBook(guestBook);
Collections.reverse(guestBookList);
request.setAttribute("guestBookList", guestBookList);
List<Reply> replyList;
replyList = reply_dao.showReply();
request.setAttribute("replyList", replyList);
request.getRequestDispatcher("look-forum.jsp").forward(request, response);
//GuestBook_dao.java查看留言核心代碼:
public List<GuestBook> lookGuestBook(GuestBook guestBook) throws Exception {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<GuestBook> guestBookList = new ArrayList<GuestBook>();
try {
conn = JdbcUtil.getConnection();
String lookGuestBookSql = "select * from guestbook order by guestbook_id";
ps = conn.prepareStatement(lookGuestBookSql);
rs = ps.executeQuery();
while (rs.next()) {
GuestBook guestBook1 = new GuestBook();
guestBook1.setGuestbook_id(rs.getString(1));
guestBook1.setUser_name(rs.getString(2));
guestBook1.setGuestbook_title(rs.getString(3));
guestBook1.setGuestbook_content(rs.getString(4));
guestBook1.setGuestbook_date(rs.getString(5));
guestBookList.add(guestBook1);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.free(rs, ps, conn);
}
return guestBookList;
}
5.6修改留言功能實現
用戶在查看留言頁面可以在自己發表的留言的右上角看到一個修改的鏈接,點擊修改可跳轉至修改頁面,在修改頁面的標題和留言內容部分會直接顯示需要修改的留言的內容,用戶可以直接在原有的留言基礎山進行修改,不需要重新輸入原有的內容,修改後點擊修改按鈕即可修改,修改成功後會提示修改成功,並跳轉至查看留言頁面,修改留言時留言的時間不會被修改,仍會保持原有的時間,所以修改後的留言不會被顯示在最上面。
// ToModifyForumServlet.java核心代碼:
guestBook.setGuestbook_id(guestbook_id);
List<GuestBook> guestBookList;
guestBookList = searchGuestBook_dao.searchById(guestBook);
HttpSession session = request.getSession();
session.setAttribute("guestBook_id", guestbook_id);
session.setAttribute("username", guestBookList.get(0).getUser_name());
session.setAttribute("guestBook_title", guestBookList.get(0).getGuestbook_title());
session.setAttribute("guestBook_content", guestBookList.get(0).getGuestbook_content());
request.getRequestDispatcher("modify-forum.jsp").forward(request, response);
// SearchGuestBook_dao.java核心代碼:
public List<GuestBook> searchById(GuestBook guestBook) throws Exception {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<GuestBook> guestBookList = new ArrayList<>();
try {
conn = JdbcUtil.getConnection();
String lookGuestBookSql = "select * from guestbook where guestbook_id = ?";
ps = conn.prepareStatement(lookGuestBookSql);
ps.setString(1, guestBook.getGuestbook_id());
rs = ps.executeQuery();
while (rs.next()) {
GuestBook guestBook1 = new GuestBook();
guestBook1.setUser_name(rs.getString(2));
guestBook1.setGuestbook_title(rs.getString(3));
guestBook1.setGuestbook_content(rs.getString(4));
guestBookList.add(guestBook1);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.free(rs, ps, conn);
}
return guestBookList;
}
//ModifyForumServlet.java核心代碼:
GuestBook guestBook = new GuestBook();
guestBook.setGuestbook_id(guestBook_id);
guestBook.setGuestbook_title(guestBook_title);
guestBook.setGuestbook_content(guestBook_content);
guestBook.setUser_name(username);
GuestBook_dao guestBook_dao = new GuestBook_dao();
try {
guestBook_dao.modifyGuestBook(guestBook);
toast = "修改成功";
request.setAttribute("toast", toast);
request.getRequestDispatcher("LookForumServlet").forward(request, response);
} catch (Exception e) {
toast = "修改失敗";
request.setAttribute("toast", toast);
request.getRequestDispatcher("LookForumServlet").forward(request, response);
e.printStackTrace();
}
//GuestBook_dao.java修改留言核心代碼:
public void modifyGuestBook(GuestBook guestBook) throws Exception {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JdbcUtil.getConnection();
String modifyGuestBookSql = "update guestbook set guestbook_title=?, guestbook_content=? where guestbook_id=?";
ps = conn.prepareStatement(modifyGuestBookSql);
ps.setString(1, guestBook.getGuestbook_title());
ps.setString(2, guestBook.getGuestbook_content());
ps.setString(3, guestBook.getGuestbook_id());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.free(null, ps, conn);
}
}
5.7刪除留言功能實現
用戶在查看留言頁面可以看到自己發表的留言的右上角會有一個刪除鏈接,點擊刪除,即可刪除留言。刪除成功後會提示刪除成功,並刷新查看留言頁面。
//DeleteForumServlet.java核心代碼:
request.setCharacterEncoding("UTF-8");
String guestbook_id = request.getParameter("guestbook_id");
String toast;
GuestBook guestBook = new GuestBook();
GuestBook_dao guestBook_dao = new GuestBook_dao();
guestBook.setGuestbook_id(guestbook_id);
try {
guestBook_dao.deleteGuestBook(guestBook);
toast = "刪除成功";
request.setAttribute("toast", toast);
request.getRequestDispatcher("LookForumServlet").forward(request, response);
} catch (Exception e) {
e.printStackTrace();
}
//GuestBook_dao.java刪除留言核心代碼:
public void deleteGuestBook(GuestBook guestBook) throws Exception {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JdbcUtil.getConnection();
String deleteGuestBookSql = "delete from guestbook where guestbook_id = ?";
ps = conn.prepareStatement(deleteGuestBookSql);
ps.setString(1, guestBook.getGuestbook_id());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.free(null, ps, conn);
}
}
5.8回覆功能實現
在查看留言頁面,每一條留言的最下方會有一個回覆的輸入框和一個回覆按鈕,在回覆的輸入框內輸入內容後,點擊回覆按鈕,即可回覆該留言。回覆成功後,會提示回覆成功,並刷新查看留言頁面。
//ReplyForumServlet.java核心代碼:
guestBook.setGuestbook_id(guestBookId);
List<GuestBook> guestBookList = new ArrayList<>();
guestBookList = searchGuestBook_dao.searchById(guestBook);
reply.setGuestbook_id(guestBookId);
reply.setReply_content(replyText);
reply.setGuest_user_name(guestBookList.get(0).getUser_name()); //發留言的用戶名
reply.setHost_user_name(hostUsername); //執行回覆操作的用戶名
Reply_dao reply_dao = new Reply_dao();
try {
reply_dao.addReply(reply);
toast = "回覆成功";
request.setAttribute("toast", toast);
request.getRequestDispatcher("LookForumServlet").forward(request, response);
} catch (Exception e) {
toast = "回覆失敗";
request.setAttribute("toast", toast);
request.getRequestDispatcher("LookForumServlet").forward(request, response);
e.printStackTrace();
}
//Reply_dao.java添加回複覈心代碼:
public Reply addReply(Reply reply) throws Exception {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JdbcUtil.getConnection();
String addGuestBookSql = "insert into reply values(reply_id_seq.nextval, ?, ?, ?, ?, SYSDATE)";
ps = conn.prepareStatement(addGuestBookSql);
ps.setString(1, reply.getGuestbook_id());
ps.setString(2, reply.getHost_user_name());
ps.setString(3, reply.getGuest_user_name());
ps.setString(4, reply.getReply_content());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.free(null, ps, conn);
}
return reply;
}
//Reply_dao.java顯示回覆核心代碼:
public List<Reply> showReply() throws Exception {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<Reply> replyList = new ArrayList<>();
try {
conn = JdbcUtil.getConnection();
String showReplySql = "select * from reply order by guestbook_id,reply_date desc";
ps = conn.prepareStatement(showReplySql);
rs = ps.executeQuery();
while (rs.next()) {
Reply reply1 = new Reply();
reply1.setGuestbook_id(rs.getString(2));
reply1.setHost_user_name(rs.getString(3));
reply1.setGuest_user_name(rs.getString(4));
reply1.setReply_content(rs.getString(5));
reply1.setReply_date(rs.getString(6));
replyList.add(reply1);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtil.free(rs, ps, conn);
}
return replyList;
}
5.9連接數據庫工具實現
設計了一個專門用於連接數據庫和釋放連接資源的工具類,在該工具類的靜態初始化容器中的寫入獲取配置的代碼,該代碼在裝入類時執行,且只執行一次。
//JdbcUtil.java核心代碼:
static {
try {
properties.load(JdbcUtil.class.getClassLoader().getResourceAsStream("db.properties"));
driver = properties.getProperty("driver");
url = properties.getProperty("url");
user = properties.getProperty("username");
password = properties.getProperty("password");
Class.forName(driver);
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
//設計獲得連接對象的方法getConnection()
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
//設計釋放結果集、語句和連接的方法free()
public static void free(ResultSet rs, PreparedStatement ps, Connection conn) {
try {
if (rs != null) {
rs.close();
}
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
//db.properties配置數據庫連接信息
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521: guestbook
username=system
password=admin
項目源碼: https://github.com/lexiaoyuan/Online-Forum
項目的具體下載和運行見後續(二)(三)
創作不易,喜歡的話加個關注點個贊,謝謝謝謝謝謝!