马士兵 BBS2006 很适合新手学习

说明:本项目只使用JSP(HTML+JSP+Javascript),不涉及JavaBean。

马士兵 BBS2006 首个Web小项目(3)(练习最终版)

实现功能:(1)能够将已存入数据库中的帖子在网页ShowArticleTree.jsp上以树状结构展现出来(id号和title)
(2)点击任意帖子title上的链接,可以在帖子具体内容页ShowArticleDetail.jsp将该贴的详细信息展现出来
(3)能够回复帖子( Javascript对提交表单内容的检查(去空格,检查是否为空))
(4)能够删除帖子(递归方法实现)
(5)能够发表新帖(话题帖、主题帖)
(6)管理员后台登录,管理帖子(删除等)
(7)能够平板型展现话题帖(分页,很重要,要掌握)


说 明:这个小项目实现了BBS的增、删、回复等最基本的功能,没有多少实用价值,但里面的递归算法、分页等要掌握。纯JSP的项目现在基本上没有了,本次是 为了练习JSP而做的,重点应该放在后面的网上商城上(用JSP+JavaBean实现)。初步打算,做完那个后自己再加上Struts实现之。


补 充注意点:在用递归方法(跟数据库打交道)实现某一功能时,注意一定要通过方法的参数传一个连接conn进去。千万不能在递归方法中new新的conn, 否则有很大的弊端:该递归方法调用次数一旦比较多的话,就会产生很多的conn,极有可能因为超过数据库的连接个数极限而导致程序出错。并且因为是递归调 用,最后的关闭语句执行不到(只有最根上的那个连接会在整个递归调用过程执行完成的最后时刻被关闭),这样就导致很多的conn没有关闭,因此白白浪费数 据库的资源,而这一资源一向是比较宝贵的。
PS:该注意点来源于网上商城项目的经验教训,增加于2008年5月4日上午9:56。


-------------------------------------------------------------------------------------------------------------------------------------------------

(1)Login.jsp 管理员登录页

马老师从网上找的的登录页,修改的,太长,此处只列举对我们有用的3段:


<%
String action = request.getParameter("action");
// 管理员登陆验证,提交给自身jsp进行处理
if(action != null && "login".equals(action)) {
String username = request.getParameter("uname");
String password = request.getParameter("pwd");
if(username == null || !"admin".equals(username)) {
%>
<font color="red" size=5>username is not correct!</font>
<%
}else if(password == null || !"admin".equals(password)) {
%>
<font color="red" size=5>password is not correct!</font>
<%
}else {
// 登陆成功,通过session属性设置来控制是否已经登录
session.setAttribute("admin", "true");
// 登陆成功,转到帖子的树形展现页
response.sendRedirect("ShowArticleTree.jsp");
}
}
%>

提交给自身处理:
<FORM action="Login.jsp" method="post">
<input type="hidden" name="action" value="login">


登录用户名和密码:
<TR>
<TD>
<P class=bodyldarkblue><LABEL
for=uname>用户名:</LABEL></P></TD>
<TD><INPUT id=uname name=uname></TD></TR>
<TR>
<TD>
<P class=bodyldarkblue><LABEL
for=pwd>密&nbsp&nbsp码:</LABEL></P></TD>
<TD><INPUT id=pwd type=password
name=pwd></TD></TR>

-------------------------------------------------------------------------------------------------------------------------------------------------

(2)ShowArticleTree.jsp 所有帖子的树状展现


<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="gbk"%>
<%@ page import="java.sql.*" %>

<%
// 判断当前页面是否是从登陆页面正常登录过来的,从而决定是否展现删除功能
String admin = (String)session.getAttribute("admin");
if(admin != null && "true".equals(admin)) {
// 正常登录的,是管理员,展现删除功能
login = true;
}
%>


<%!
// 将要输出的内容先保存在字符串str中,最后一次性输出
String str = "";
// 用login标志来判断当前用户是否是从登陆页面正常登录过来的
boolean login = false;
//使用递归来实现展现某一帖子的子帖(包含孙子帖等)
public void tree(Connection conn, int id, int level) {

// 前导字符串,通过缩进让各个帖子之间的关系看得更清楚
String preStr = "";
for(int i = 0; i < level; i++) {
preStr += "----";
}

Statement stmt = null;
ResultSet rs = null;

try {
stmt = conn.createStatement();
String sql = "select * from article2 where pid = " + id;
// 拿到当前帖的所有子帖
rs = stmt.executeQuery(sql);
String strDel = "";

while(rs.next()) {
// 将当前帖的一个子帖的信息存入str,这个子帖的title上有一个链接(指向该贴的详细内容)
if(login) {
// login为真,说明是管理员,可以展现删除功能的链接
strDel = "<td><a href='Delete.jsp?id=" + rs.getInt("id") + "&pid=" + rs.getInt("pid") + "'>" + "删除</a></td>";
}
str += "<tr><td>" + rs.getInt("id") + "</td><td>" +
preStr + "<a href='ShowArticleDetail.jsp?id=" + rs.getInt("id") + "'>" +
rs.getString("title") + "</a></td>" +
strDel +
"</tr>";
if(rs.getInt("isleaf") != 0) {
// 这个子帖还不是叶子节点,说明它下面还有子帖,继续调用tree方法往下进行展现
tree(conn,rs.getInt("id"),level+1);
}
}

} catch (SQLException e) {
System.out.println("执行SQL语句过程中出现了错误。。。");
e.printStackTrace();
} finally {
// 最后关闭资源(后打开的先关闭)
// 注意:此处不要关闭conn,否则后面就拿不到数据了
try {
if (rs != null) {
rs.close();
rs = null;
}
if (stmt != null) {
stmt.close();
stmt = null;
}
} catch (SQLException e) {
System.out.println("关闭资源时出现了错误。。。");
e.printStackTrace();
}
}
}
%>


<%
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost/bbs?user=root&password=mysql";
Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
// 获取话题帖(根帖)(主题帖的pid号为0)
String sql = "select * from article2 where pid = 0";
ResultSet rs = stmt.executeQuery(sql);
String strDel = "";

while(rs.next()) {
// 获取话题帖(根帖)的信息
if(login) {
strDel = "<td><a href='Delete.jsp?id=" + rs.getInt("id") + "&pid=" + rs.getInt("pid") + "'>" + "删除</a></td>";
}
str += "<tr><td>" + rs.getInt("id") + "</td><td>" +
"<a href='ShowArticleDetail.jsp?id=" + rs.getInt("id") + "'>" +
rs.getString("title") + "</a></td>" +
strDel +
"</tr>";
if(rs.getInt("isleaf") != 0) {
tree(conn,rs.getInt("id"),1);
}
}
// 最后关闭资源
rs.close();
stmt.close();
conn.close();
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>BBS首页</title>
</head>
<body>

<a href="Post.jsp">发表新帖</a> _fcksavedurl=""Post.jsp">发表新帖</a>" _fcksavedurl=""Post.jsp">发表新帖</a>" _fcksavedurl=""Post.jsp">发表新帖</a>" _fcksavedurl=""Post.jsp">发表新帖</a>" _fcksavedurl=""Post.jsp">发表新帖</a>" _fcksavedurl=""Post.jsp">发表新帖</a>" <a href="ShowArticleFlat.jsp">平板型展现</a>

<br><br>


<table border="1">
<tr><td>ID号</td><td>标题</td><td>操作</td></tr>
<%-- 将所有帖子以树状一次性展现出来 --%>
<%= str %>
</table>
<%-- 展现过后,要将str清空。否则,一旦继续刷新的话,会在原来基础上继续累加,页面上会重复显示帖子的信息 --%>
<%
str = "";
// 将login标志再设置回false,否则,只要管理员访问过该页面后,login标志就成true了,别的人即使不通过登陆也能直接使用删除功能了。
// 因为管理员的login信息是存在session中的,只要此次session没有断,即使管理员去访问了其他页面,他回来后还是能继续使用删除功能。
login = false;
%>
</body>

</html>


-------------------------------------------------------------------------------------------------------------------------------------------------

(3)ShowArticleFlat.jsp 根帖的平板型展现(分页实现)

根据总记录数和每页显示记录数来计算总页数的两种方法:
①int totalPages = (totalRecords + pageSize -1) / pageSize ;(逢pageSize进1)
②int totalPages = totalRecords % pageSize == 0 ? totalRecords / pageSize : totalRecords / pageSize + 1;


<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="gbk"%>
<%@ page import="java.sql.*"%>

<%
// 每页3条记录
int pageSize = 3;
String strPageNo = request.getParameter("pageNo");
int pageNo = 0;
// 以下是对第几页的页码值进行判断处理,提高健壮性
if (strPageNo == null || "".equals(strPageNo)) {
pageNo = 1;
} else {
try {
pageNo = Integer.parseInt(strPageNo);
} catch (NumberFormatException e) {
pageNo = 1;
}
if (pageNo <= 0) {
pageNo = 1;
}
}

Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost/bbs?user=root&password=mysql";
Connection conn = DriverManager.getConnection(url);
Statement stmtCount = conn.createStatement();
// 查询出文章表中共有多少篇话题帖(主题帖)
String sqlCount = "select count(*) from article2 where pid = 0";
ResultSet rsCount = stmtCount.executeQuery(sqlCount);
rsCount.next();
int totalRecords = rsCount.getInt(1);
// 计算总页数
int totalPages = totalRecords % pageSize == 0 ? totalRecords / pageSize : totalRecords / pageSize + 1;
// 保证当前页号不能超过总页数
if(pageNo > totalPages) {
pageNo = totalPages;
}
// 计算从数据库中读取记录的起始位置
int startPos = (pageNo - 1) * pageSize;
Statement stmt = conn.createStatement();
// 将数据库中所有主题帖按时间逆序排列,从中抽取出startPos位置开始的pageSize条记录,显示到页面上
String sql = "select * from article2 where pid = 0 order by pdate desc limit " + startPos + "," + pageSize;
ResultSet rs = stmt.executeQuery(sql);
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>BBS平板型展现</title>
</head>
<body>

<a href="Post.jsp">发表新帖</a> <a href="ShowArticleTree.jsp">树型展现</a>
<br>
<br>

<%-- 平板展现第i页的话题帖信息 --%>
<table border="1">
<tr>
<td>ID</td>
<td align="center">标题</td>
<td>发表时间</td>
</tr>
<%
while (rs.next()) {
%>
<tr>
<td><%=rs.getInt("id")%></td>
<td><%=rs.getString("title")%></td>
<td><%=rs.getTimestamp("pdate").toLocaleString()%></td>
</tr>
<%
}

//最后关闭资源
rs.close();
stmt.close();
conn.close();
%>
</table>

<br>
总共<%=totalPages%>页 第<%=pageNo%>页

<br><br>

<a href="ShowArticleFlat.jsp?pageNo=<%= pageNo-1 %>">上一页</a>
<a href="ShowArticleFlat.jsp?pageNo=<%= pageNo+1 %>">下一页</a>
<a href="ShowArticleFlat.jsp?pageNo=1">首页</a>
<a href="ShowArticleFlat.jsp?pageNo=<%= totalPages %>">尾页</a>

<br><br><br>
自己选择页码:
<form name="selectForm" action="ShowArticleFlat.jsp">
<select name="pageNo" onchange="document.selectForm.submit()">
<%
for(int i = 1 ; i <= totalPages; i++) {
%>
<option value=<%=i%> <%=(i == pageNo) ? "selected" : "" %>> 第<%=i%>页</option>
<%
}
%>
</select>
</form>

<br>
自己输入页码:
<form name="inputForm" action="ShowArticleFlat.jsp">
<input type="text" size="4" name="pageNo" value=<%=pageNo%> />
<input type="submit" value="跳转" />
</form>

</body>

</html>


-------------------------------------------------------------------------------------------------------------------------------------------------

(4)ShowArticleDetail.jsp 展现一篇帖子的具体内容


<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="gbk"%>
<%@ page import="java.sql.*" %>

<%
// 将ShowArticle.jsp页面传过来的id号拿到
String strId = request.getParameter("id");
int id = Integer.parseInt(strId);

Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost/bbs?user=root&password=mysql";
Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
// 取得当前id号对应的帖子的所有信息
String sql = "select * from article2 where id = " + id;
ResultSet rs = stmt.executeQuery(sql);

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>帖子的具体内容</title>
</head>
<body>

<%
while(rs.next()) {
%>
<table border="1">
<tr>
<td>ID</td>
<td><%= rs.getInt("id") %></td>
</tr>
<tr>
<td>Title</td>
<td><%= rs.getString("title") %></td>
</tr>
<tr>
<td>Content</td>
<td><%= rs.getString("cont") %></td>
</tr>
</table>
<%-- 增加回复的链接 --%>
<a href="Reply.jsp?id=<%= rs.getInt("id") %>&rootid=<%= rs.getInt("rootid") %>">回复</a>
<%
}
rs.close();
stmt.close();
conn.close();
%>

<%-- 增加回到首页的链接 --%>
<a href="ShowArticleTree.jsp">回到首页</a>

</body>
</html>

-------------------------------------------------------------------------------------------------------------------------------------------------

(5)Reply.jsp 回帖(( Javascript对提交表单内容的检查(去空格,检查是否为空)))

<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="gbk"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%
int id = Integer.parseInt(request.getParameter("id"));
int rootid = Integer.parseInt(request.getParameter("rootid"));
%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>回帖</title>

<%-- 关于javascript代码外面加上<!---->的解释:1.假如当前浏览器支持javascript,则执行这段代码 --%>
<%-- 2.假如当前浏览器不支持javascript,则看成HTNL注释而不执行,从而不会对整个页面程序的执行产生影响 --%>

<script language="javascript">
<!--
// javascript去空格函数
// 去掉字符串的头空格(左空格)
function LTrim(str){
var i;
for(i=0;i<str.length; i++) {
if(str.charAt(i)!=" ") break;
}
str = str.substring(i,str.length);
return str;
}

// 去掉字符串的尾空格(右空格)
function RTrim(str){
var i;
for(i=str.length-1;i>=0;i--){
if(str.charAt(i)!=" ") break;
}
str = str.substring(0,i+1);
return str;
}

// 去掉字符串的头尾空格(左右空格)
function Trim(str){
return LTrim(RTrim(str));
}

// 提交表单的检查
function check() {
// 检查用户是否则在标题栏中输入了内容
if(Trim(document.reply.title.value) == "") {
alert("please intput the title!");
document.reply.title.focus();
return false;
}
// 检查用户是否则在内容栏中输入了内容
if(Trim(document.reply.cont.value) == "") {
alert("plsease input the content!");
document.reply.cont.focus();
return false;
}
return true;
}
-->
</script>

</head>
<body>

<%-- 将待回复帖子的id号和根帖号rootid传给ReployOK.jsp页面 --%>
<%-- onsubmit="return check()"用来对用户是否输入了标题和内容进行验证 --%>
<form name="reply" method="post" action="ReployOK.jsp" onsubmit="return check()">
<input type="hidden" name="id" value="<%= id %>">
<input type="hidden" name="rootid" value="<%= rootid %>">
<table border="1">
<tr>
<td>
标题<input type="text" name="title" size="80">
</td>
</tr>
<tr>
<td>
内容<textarea rows="12" cols="80" name="cont"></textarea>>
</td>
</tr>
<tr>
<td>
<input type="submit" value="提交">
</td>
</tr>
</table>
</form>

<a href="ShowArticleTree.jsp">回到首页</a>

</body>
</html>

-------------------------------------------------------------------------------------------------------------------------------------------------

(6).ReployOK.jsp 回帖成功页


<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="gbk"%>
<%@ page import="java.sql.*"%>

<%
// 解决从前一页(回帖页)传过来的信息中文乱码的问题
request.setCharacterEncoding("gbk");

// 将回帖信息(id、rootid、title、cont)拿到
int id = Integer.parseInt(request.getParameter("id"));
int rootid = Integer.parseInt(request.getParameter("rootid"));
String title = request.getParameter("title");
String cont = request.getParameter("cont");

// 回帖内容里有换行(\n),将其转化成HTML中的换行标志<br>
cont = cont.replaceAll("\n","<br>");

Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost/bbs?user=root&password=mysql";
Connection conn = DriverManager.getConnection(url);

// 对数据库的关联操作(插入和更新),需要使用transaction
conn.setAutoCommit(false);

String sql = "insert into article2 values(null,?,?,?,?,now(),0)";
PreparedStatement preStmt = conn.prepareStatement(sql);
Statement stmt = conn.createStatement();

preStmt.setInt(1,id);
preStmt.setInt(2,rootid);
preStmt.setString(3,title);
preStmt.setString(4,cont);

// 将回帖信息插入数据库
preStmt.executeUpdate();

// 更新被回复的那篇帖子为非叶子帖(这句话只有在原来那篇帖子是叶子帖时才起作用)
// (假如那篇帖子有可能原来下面就已经有回帖了,这句话就相当于,没有进行任何操作)
stmt.executeUpdate("update article2 set isleaf = 1 where id = " + id);

conn.commit();
conn.setAutoCommit(true);

// 最后释放资源
stmt.close();
preStmt.close();
conn.close();

// 直接进行重定向,回到帖子的树状展现页面
//response.sendRedirect("ShowArticleTree.jsp");

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>回帖成功</title>
</head>
<body>

<font color="blue" size="7">
OK!回帖成功!
</font>

<br>
<a href="ShowArticleTree.jsp">回到首页</a>

</body>
</html>

-------------------------------------------------------------------------------------------------------------------------------------------------

(7).Delete.jsp 删除帖子

<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="gbk"%>
<%@ page import="java.sql.*" %>

<%!
// 递归方法删除子帖树
public void del(Connection conn, int id) {

Statement stmt = null;
ResultSet rs = null;

try {
stmt = conn.createStatement();
String sql = "select * from article2 where pid = " + id;
// 拿到当前帖的所有子帖
rs = stmt.executeQuery(sql);
while(rs.next()) {
// 先删除当前帖的各个子帖
del(conn,rs.getInt("id"));
}
// 再删除当前帖
stmt.executeUpdate("delete from article2 where id = " + id);
} catch (SQLException e) {
System.out.println("执行删帖过程中出现了错误。。。");
e.printStackTrace();
} finally {
// 最后关闭资源(后打开的先关闭)
// 注意:此处不要关闭conn,否则后面就拿不到数据了
try {
if (rs != null) {
rs.close();
rs = null;
}
if (stmt != null) {
stmt.close();
stmt = null;
}
} catch (SQLException e) {
System.out.println("关闭资源时出现了错误。。。");
e.printStackTrace();
}
}
}
%>

<%
//判断当前页面是否是从登陆页面正常登录过来,从而决定是否能执行删除功能
String admin = (String)session.getAttribute("admin");
if(admin == null || !"true".equals(admin)) {
out.println("你不是管理员吧?!无法执行删除功能。。。");
return;
}
%>


<%
// 拿到待删除帖的id号和它的父帖号
int id = Integer.parseInt(request.getParameter("id"));
// 之所以要将待删除帖的父帖号拿过来,是因为删除该帖后,可能会对父帖有影响
//(假如该父帖原先就只有这一个子帖(被删除的这个帖子),那就必须把父帖的非叶子性改成叶子性)
int pid = Integer.parseInt(request.getParameter("pid"));


Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost/bbs?user=root&password=mysql";
Connection conn = DriverManager.getConnection(url);

// 事务处理
conn.setAutoCommit(false);

// 删除该贴及其下的所有子帖(包括子帖的子帖等)
del(conn,id);

// 判断该贴的父帖情况(除去这个被删的子帖,是否还有其他子帖),设置是否为叶子帖
Statement stmt = conn.createStatement();
// 将被删除贴的父帖现在所有的子帖的个数拿到
ResultSet rs = stmt.executeQuery("select count(*) from article2 where pid = " + pid);
rs.next();
int num = rs.getInt(1);

// 被删除贴的父帖现在没有其他子帖,将该父帖的isleaf设置为0(叶子帖)
if(num <= 0) {
Statement stmtUpdate = conn.createStatement();
String sql = "update article2 set isleaf = 0 where id = " + pid;
stmtUpdate.executeUpdate(sql);
stmtUpdate.close();
}

conn.commit();
// 恢复现场
conn.setAutoCommit(true);

// 最后释放资源
rs.close();
stmt.close();
conn.close();

// 直接重定向到帖子的树状展现页
//response.sendRedirect("ShowArticleTree.jsp");

%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>删帖成功</title>
</head>
<body>

<font color="red" size="7">
OK!删除成功!
</font>

<br>
<a href="ShowArticleTree.jsp">回到首页</a>

</body>
</html>

-------------------------------------------------------------------------------------------------------------------------------------------------

(8)Post.jsp 发表新的主题帖

<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@ page import="java.sql.*" %>

<%-- 本页是自己输入内容,提交给自己处理,这种用法现在已经很少用了。此处纯粹是为了练习一下这个用法 --%>
<%-- 现在的发表新主题功能有个潜在bug,就是空信息也能提交,可以参考Reply.jsp和ReployOK.jsp的内容进行修正 --%>

<%
//解决从本页传过来的新帖信息中文乱码的问题
request.setCharacterEncoding("gbk");

String action = request.getParameter("action");

if(action != null && "post".equals(action)) {

String title = request.getParameter("title");
String cont = request.getParameter("cont");

Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost/bbs?user=root&password=mysql";
Connection conn = DriverManager.getConnection(url);

// 对数据库的关联操作(插入和更新),需要使用transaction,保证一致性
conn.setAutoCommit(false);

// 话题贴的rootid号为0
String sql = "insert into article2 values(null,0,?,?,?,now(),0)";
PreparedStatement preStmt = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
Statement stmt = conn.createStatement();

// 话题帖的根帖号rootid是和id号一致的,但这时候还无法知道id号,先在rootid处插上-1,等待下面的更新修正
preStmt.setInt(1,-1);
preStmt.setString(2,title);
preStmt.setString(3,cont);

// 将回帖信息插入数据库
preStmt.executeUpdate();

// Retrieves any auto-generated keys created as a result of executing this Statement object.
ResultSet rsKeys = preStmt.getGeneratedKeys();
rsKeys.next();
// 获取自动生成的id号
int key = rsKeys.getInt(1);
rsKeys.close();

// 更新话题帖的rootid
stmt.executeUpdate("update article2 set rootid = " + key + " where id = " + key);

conn.commit();
conn.setAutoCommit(true);

// 最后释放资源
stmt.close();
preStmt.close();
conn.close();

// 直接进行重定向,回到帖子的树状展现页面
response.sendRedirect("ShowArticleTree.jsp");
}

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>发表新主题</title>
</head>
<body>

<form method="post" action="Post.jsp">
<input type="hidden" name="action" value="post">
<table border="1">
<tr>
<td>
标题<input type="text" name="title" size="80">
</td>
</tr>
<tr>
<td>
内容<textarea rows="12" cols="80" name="cont"></textarea>>
</td>
</tr>
<tr>
<td>
<input type="submit" value="提交">
</td>
</tr>
</table>
</form>

<br>
<a href="ShowArticleTree.jsp">回到首页</a>

</body>
</html>

你可能感兴趣的:(JavaScript,sql,jsp,mysql,jdbc)