马士兵BBS.docx
- 文档编号:9246214
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:29
- 大小:23.58KB
马士兵BBS.docx
《马士兵BBS.docx》由会员分享,可在线阅读,更多相关《马士兵BBS.docx(29页珍藏版)》请在冰豆网上搜索。
马士兵BBS
马士兵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段:
<%
Stringaction=request.getParameter("action");
//管理员登陆验证,提交给自身jsp进行处理
if(action!
=null&&"login".equals(action)){
Stringusername=request.getParameter("uname");
Stringpassword=request.getParameter("pwd");
if(username==null||!
"admin".equals(username)){
%>
<%
}elseif(password==null||!
"admin".equals(password)){
%>
<%
}else{
//登陆成功,通过session属性设置来控制是否已经登录
session.setAttribute("admin","true");
//登陆成功,转到帖子的树形展现页
response.sendRedirect("ShowArticleTree.jsp");
}
}
%>
提交给自身处理:
登录用户名和密码:
name=pwd>
----------------------------------------------------------------------------------------------------------------------
(2)ShowArticleTree.jsp所有帖子的树状展现
<%@pagelanguage="java"contentType="text/html;charset=gbk"
pageEncoding="gbk"%>
<%@pageimport="java.sql.*"%>
<%
//判断当前页面是否是从登陆页面正常登录过来的,从而决定是否展现删除功能
Stringadmin=(String)session.getAttribute("admin");
if(admin!
=null&&"true".equals(admin)){
//正常登录的,是管理员,展现删除功能
login=true;
}
%>
<%!
//将要输出的内容先保存在字符串str中,最后一次性输出
Stringstr="";
//用login标志来判断当前用户是否是从登陆页面正常登录过来的
booleanlogin=false;
//使用递归来实现展现某一帖子的子帖(包含孙子帖等)
publicvoidtree(Connectionconn,intid,intlevel){
//前导字符串,通过缩进让各个帖子之间的关系看得更清楚
StringpreStr="";
for(inti=0;i preStr+="----"; } Statementstmt=null; ResultSetrs=null; try{ stmt=conn.createStatement(); Stringsql="select*fromarticle2wherepid="+id; //拿到当前帖的所有子帖 rs=stmt.executeQuery(sql); StringstrDel=""; while(rs.next()){ //将当前帖的一个子帖的信息存入str,这个子帖的title上有一个链接(指向该贴的详细内容) if(login){ //login为真,说明是管理员,可以展现删除功能的链接 strDel=" id="+rs.getInt("id")+"&pid="+rs.getInt("pid")+"'>"+"删除 ";
}
str+="
preStr+" id="+rs.getInt("id")+"'>"+ rs.getString("title")+"
strDel+
"
if(rs.getInt("isleaf")!
=0){
//这个子帖还不是叶子节点,说明它下面还有子帖,继续调用tree方法往下进行展现
tree(conn,rs.getInt("id"),level+1);
}
}
}catch(SQLExceptione){
System.out.println("执行SQL语句过程中出现了错误。
。
。
");
e.printStackTrace();
}finally{
//最后关闭资源(后打开的先关闭)
//注意:
此处不要关闭conn,否则后面就拿不到数据了
try{
if(rs!
=null){
rs.close();
rs=null;
}
if(stmt!
=null){
stmt.close();
stmt=null;
}
}catch(SQLExceptione){
System.out.println("关闭资源时出现了错误。
。
。
");
e.printStackTrace();
}
}
}
%>
<%
Class.forName("com.mysql.jdbc.Driver");
Stringurl="jdbc:
mysql:
//localhost/bbs?
user=root&password=mysql";
Connectionconn=DriverManager.getConnection(url);
Statementstmt=conn.createStatement();
//获取话题帖(根帖)(主题帖的pid号为0)
Stringsql="select*fromarticle2wherepid=0";
ResultSetrs=stmt.executeQuery(sql);
StringstrDel="";
while(rs.next()){
//获取话题帖(根帖)的信息
if(login){
strDel="
id="+rs.getInt("id")+"&pid="+rs.getInt("pid")+"'>"+"删除
}
str+="
" id="+rs.getInt("id")+"'>"+ rs.getString("title")+"
strDel+
"
if(rs.getInt("isleaf")!
=0){
tree(conn,rs.getInt("id"),1);
}
}
//最后关闭资源
rs.close();
stmt.close();
conn.close();
%>
DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http:
//www.w3.org/TR/html4/loose.dtd">
<%--将所有帖子以树状一次性展现出来--%>
<%=str%>
<%--展现过后,要将str清空。
否则,一旦继续刷新的话,会在原来基础上继续累加,页面上会重复显示帖子的信息--%>
<%
str="";
//将login标志再设置回false,否则,只要管理员访问过该页面后,login标志就成true了,别的人即使不通过登陆也能直接使用删除功能了。
//因为管理员的login信息是存在session中的,只要此次session没有断,即使管理员去访问了其他页面,他回来后还是能继续使用删除功能。
login=false;
%>
-------------------------------------------------------------------------------------------------------------------------------------------------
(3)ShowArticleFlat.jsp根帖的平板型展现(分页实现)
根据总记录数和每页显示记录数来计算总页数的两种方法:
①inttotalPages=(totalRecords+pageSize-1)/pageSize;(逢pageSize进1)
②inttotalPages=totalRecords%pageSize==0?
totalRecords/pageSize:
totalRecords/pageSize+1;
<%@pagelanguage="java"contentType="text/html;charset=gbk"
pageEncoding="gbk"%>
<%@pageimport="java.sql.*"%>
<%
//每页3条记录
intpageSize=3;
StringstrPageNo=request.getParameter("pageNo");
intpageNo=0;
//以下是对第几页的页码值进行判断处理,提高健壮性
if(strPageNo==null||"".equals(strPageNo)){
pageNo=1;
}else{
try{
pageNo=Integer.parseInt(strPageNo);
}catch(NumberFormatExceptione){
pageNo=1;
}
if(pageNo<=0){
pageNo=1;
}
}
Class.forName("com.mysql.jdbc.Driver");
Stringurl="jdbc:
mysql:
//localhost/bbs?
user=root&password=mysql";
Connectionconn=DriverManager.getConnection(url);
StatementstmtCount=conn.createStatement();
//查询出文章表中共有多少篇话题帖(主题帖)
StringsqlCount="selectcount(*)fromarticle2wherepid=0";
ResultSetrsCount=stmtCount.executeQuery(sqlCount);
rsCount.next();
inttotalRecords=rsCount.getInt
(1);
//计算总页数
inttotalPages=totalRecords%pageSize==0?
totalRecords/pageSize:
totalRecords/pageSize+1;
//保证当前页号不能超过总页数
if(pageNo>totalPages){
pageNo=totalPages;
}
//计算从数据库中读取记录的起始位置
intstartPos=(pageNo-1)*pageSize;
Statementstmt=conn.createStatement();
//将数据库中所有主题帖按时间逆序排列,从中抽取出startPos位置开始的pageSize条记录,显示到页面上
Stringsql="select*fromarticle2wherepid=0orderbypdatedesclimit"+startPos+","+pageSize;
ResultSetrs=stmt.executeQuery(sql);
%>
DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http:
//www.w3.org/TR/html4/loose.dtd">
<%--平板展现第i页的话题帖信息--%>
<%
while(rs.next()){
%>
<%
}
//最后关闭资源
rs.close();
stmt.close();
conn.close();
%>
总共<%=totalPages%>页第<%=pageNo%>页
pageNo=<%=pageNo-1%>">上一页 pageNo=<%=pageNo+1%>">下一页 pageNo=1">首页 pageNo=<%=totalPages%>">尾页 自己选择页码: <% for(inti=1;i<=totalPages;i++){ %> "selected": ""%>>第<%=i%>页 <% } %> 自己输入页码: ------------------------------------------------------------------------------------------------------------------------------------------------- (4)ShowArticleDetail.jsp展现一篇帖子的具体内容 <%@pagelanguage="java"contentType="text/html;charset=gbk" pageEncoding="gbk"%> <%@pageimport="java.sql.*"%> <% //将ShowArticle.jsp页面传过来的id号拿到 StringstrId=request.getParameter("id"); intid=Integer.parseInt(strId); Class.forName("com.mysql.jdbc.Driver"); Stringurl="jdbc: mysql: //localhost/bbs? user=root&password=mysql"; Connectionconn=DriverManager.getConnection(url); Statementstmt=conn.createStatement(); //取得当前id号对应的帖子的所有信息 Stringsql="select*fromarticle2whereid="+id; ResultSetrs=stmt.executeQuery(sql); %> DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http: //www.w3.org/TR/html4/loose.dtd"> <% while(rs.next()){ %>ID <%=rs.getInt("id")%>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 士兵 BBS
copyright@ 2008-2022 冰点文档网站版权所有
经营许可证编号:鄂ICP备2022015515号-1