1 导言
作为一个新手JAVA程序员,我相信很多人和我一样急切的想要寻找项目来做,这里我把马士兵老师讲的JAVA WEB的第一个小项目拿过来给大家分享一下。
首先,对一个项目而言我们先要认识清楚我们要做什么。这里我们要做的是一个模拟的小型BBS,内容分为以下几块:
1、树形展示回帖内容
2.、详细展示帖子内容
3、回复帖子功能
4、管理员登陆功能
5、删除功能
对这个项目而言,我们使用纯JSP最为联系语言,以后使用JSP+JAVABEAN这种主流的方法。纯JSP将事物与展示放在一起做,业务逻辑混乱,但是做一次来培养我们的业务逻辑思考,在这个过程中我们会体会到这种不足,之后自然而然的会投入到JAVABEAN+JSP的怀抱中。
2 数据库分析
作为一个BBS网站,我们主要做的是将数据库中的内容在网页上展示出来,所以我们需要一个良好的数据库作为我们的测试数据。
数据库如下:
create database bbs; use bbs; create table article ( id int primary key auto_increment, pid int, rootid int, title varchar(255), cont text, pdate datetime, isleaf int ); insert into article values (null, 0, 1, '蚂蚁大战大象', '蚂蚁大战大象', now(), 1); insert into article values (null, 1, 1, '大象被打趴下了', '大象被打趴下了',now(), 1); insert into article values (null, 2, 1, '蚂蚁也不好过','蚂蚁也不好过', now(), 0); insert into article values (null, 2, 1, '瞎说', '瞎说', now(), 1); insert into article values (null, 4, 1, '没有瞎说', '没有瞎说', now(), 0); insert into article values (null, 1, 1, '怎么可能', '怎么可能', now(), 1); insert into article values (null, 6, 1, '怎么没有可能', '怎么没有可能', now(), 0); insert into article values (null, 6, 1, '可能性是很大的', '可能性是很大的', now(), 0); insert into article values (null, 2, 1, '大象进医院了', '大象进医院了', now(), 1); insert into article values (null, 9, 1, '护士是蚂蚁', '护士是蚂蚁', now(), 0);
对于BBS中每个帖子的内容,首先我们要有帖子id,他回复的是哪个楼pid,以及主题rootid,回复内容的“主题title+正文cont”,回复日期pdate,是否为叶子节点即是否没有人回复他。对于一个小型测试用数据库已经足够,业务逻辑正确就行,我们不考虑界面美观,毕竟这是我们的练手项目。三 JSP代码
1 树形展示帖子主题
每个bbs都有一个入口界面,BBS入口界面基本上都是以树形展示为主,比如百度贴吧与天涯论坛。代码如下:
<%@ page language="java" contentType="text/html; charset=gbk" pageEncoding="gbk"%> <%@ page import="java.sql.*" %> <%//检查管理员session是否登陆,若登陆显示删除按钮 String admin = (String)session.getAttribute("admin"); if(admin != null && admin.equals("true")) { login = true; } %> <%! String str = "";//全局声明,保存需要打印的字符串,即显示内容 boolean login = false;//默认设为管理员未登录 private void tree(Connection conn, int id, int level) { Statement stmt = null; ResultSet rs = null; String preStr = ""; for(int i=0; i<level; i++) {//层次化结构显示,level为传入参数 preStr += "----"; } try { stmt = conn.createStatement(); String sql = "select * from article where pid = " + id; rs = stmt.executeQuery(sql); String strLogin = ""; while(rs.next()) {//递归查询该节点下是否还有子节点,先打印自己节点,再打印子节点 if(login) { strLogin = "<td><a href='Delete.jsp?id=" + rs.getInt("id") + "&pid=" + rs.getInt("pid") + "'>删除</a>"; }//字符串用于控制是否显示删除按钮 str += "<tr><td>" + rs.getInt("id") + "</td><td>" + preStr + "<a href='ShowArticleDetail.jsp?id=" + rs.getInt("id") + "'>" + rs.getString("title") + "</a></td>" + strLogin + "</td></tr>"; if(rs.getInt("isleaf") != 0) {//如果不是叶子节点,证明还存在子节点,递归打印 tree(conn, rs.getInt("id"), level+1); } } } catch (SQLException e) { e.printStackTrace(); } finally { try { if(rs != null) { rs.close(); rs = null; } if(stmt != null) { stmt.close(); stmt = null; } } catch (SQLException e) { e.printStackTrace(); } } } %> <% Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost/bbs?user=root&password=123456"; Connection conn = DriverManager.getConnection(url); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select * from article where pid = 0"); String strLogin = ""; while(rs.next()) { if(login) { strLogin = "<td><a href='Delete.jsp?id=" + rs.getInt("id") + "&pid=" + rs.getInt("pid") + "'>删除</a>"; } str += "<tr><td>" + rs.getInt("id") + "</td><td>" + "<a href='ShowArticleDetail.jsp?id=" + rs.getInt("id") + "'>" + rs.getString("title") + "</a></td>" + strLogin + "</td></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>Insert title here</title> </head> <body> <a href="Post.jsp">发表新帖</a> <table border="1"> <%= str %> <% str = ""; //清空str,否则每刷新一次打印一次 login = false;//清空登录位 %> </table> </body> </html>
2 详情页面
在上面的页面中我们加入了查看详情的链接,这里我们写详情链接
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ page import="java.sql.*" %> <% String strid = request.getParameter("id");//查看上个页面,我们需要查询的内容传来了id,这里第一步就是接受id int id = Integer.parseInt(strid);//传来的参数默认为字符串,我们转换为int类型,便于sql查询 Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/bbs?user=root&password=123456"; Connection conn = DriverManager.getConnection(url); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select * from article where id = "+ id); %> <!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>Insert title here</title> </head> <body> <% if(rs.next()){//查询只能拿到一条记录,这里用if就行,用table展示出来 %> <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> <%--加入回复链接,指向回复页面,需要传入参数为,回复楼的id,以及帖子id,这里rootid不是必要参数,加上可以简化流程 --%> <a href="Reply.jsp?id=<%= rs.getInt("id")%>&rootid=<%= rs.getString("rootid")%>">回复</a> <% }//记得打开的东西要逆序关闭 rs.close(); stmt.close(); conn.close(); %> </body> </html>
3 回复页面
<%@ page language="java" contentType="text/html; charset=gbk" pageEncoding="gbk"%> <%//任何情况下都是先接受传递过来的参数 int id = Integer.parseInt(request.getParameter("id")); int rootId = Integer.parseInt(request.getParameter("rootid")); %> <!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>Insert title here</title> <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)!=" "&&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> <form name=reply action="ReplyOK.jsp" method="post" 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 cols="80" rows="12" name="cont"></textarea> </td> </tr> <tr> <td> <input type="submit" value="提交"> </td> </tr> </table> </form> </body> </html>
4 回复成功,调转显示
任何帖子回复成功后都要进行跳转,否则用户需要手动点击,太不人性化
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ page import="java.sql.*" %> <% request.setCharacterEncoding("gbk");//request采用默认编码,我们给他转换成中文编码 int id = Integer.parseInt(request.getParameter("id"));//第一步,接受传递过来的参数 int rootid = Integer.parseInt(request.getParameter("rootid")); String title = request.getParameter("title"); String cont = request.getParameter("cont"); if(title == null) {//虽然前台检查过了,后台仍然要检查 out.println("error! please use my bbs in the right way!"); return; } title = title.trim(); if(title.equals("")) { out.println("title could not be empty!"); return; } cont = cont.trim(); if(cont.equals("")) { out.println("content could not be empty!"); return; } cont = cont.replaceAll("\n", "<br>");//将用户输入域得到的字符串中的回车用html中的换行符替换 Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/bbs?user=root&password=123456"; Connection conn = DriverManager.getConnection(url); conn.setAutoCommit(false);//我们回复过的楼层必然不再是叶子节点,因此这里要用事物处理,关闭自动提交 String sql = "insert into article values(null,?,?,?,?,now(),0)"; PreparedStatement pstmt = conn.prepareStatement(sql);//sql语句过于负责,我们用PreparedStatement进行简便操作 Statement stmt = conn.createStatement(); pstmt.setInt(1,id); pstmt.setInt(2,rootid); pstmt.setString(3, title); pstmt.setString(4, cont); pstmt.executeUpdate(); stmt.executeUpdate("update article set isleaf = 1 where id = "+id); conn.commit(); conn.setAutoCommit(true);//回复自动提交功能 stmt.close(); pstmt.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=GB18030"> <title>Insert title here</title> </head> <body> <% response.sendRedirect("ShowArticleTree.jsp");//重定向到入口界面 %> </body> </html>
5 发表新帖
<%@ page language="java" contentType="text/html; charset=gbk" pageEncoding="gbk"%> <%@ page import="java.sql.*" %> <% request.setCharacterEncoding("gbk"); String action = request.getParameter("action");//接受传递给自己的参数 if(action != null && action.equals("post")) { String title = request.getParameter("title"); String cont = request.getParameter("cont"); cont = cont.replaceAll("\n" , "<br>");//将回车符换为html重的换行符 Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost/bbs?user=root&password=123456"; Connection conn = DriverManager.getConnection(url); conn.setAutoCommit(false); String sql = "insert into article values (null, 0, ?, ?, ?, now(), 0)"; PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); Statement stmt = conn.createStatement(); pstmt.setInt(1, -1); pstmt.setString(2, title); pstmt.setString(3, cont); pstmt.executeUpdate(); ResultSet rsKey = pstmt.getGeneratedKeys(); rsKey.next(); int key = rsKey.getInt(1); rsKey.close(); stmt.executeUpdate("update article set rootid = " + key + " where id = " + key); conn.commit(); conn.setAutoCommit(true); stmt.close(); pstmt.close(); conn.close(); response.sendRedirect("ShowArticleFlat.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>Insert title here</title> </head> <body> <form action="Post.jsp" method="post"> <input type="hidden" name="action" value="post"> <table border="1"> <tr> <td> <input type="text" name="title" size="80"> </td> </tr> <tr> <td> <textarea cols="80" rows="12" name="cont"></textarea> </td> </tr> <tr> <td> <input type="submit" value="提交"> </td> </tr> </table> </form> </body> </html>
6 删除功能
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ page import="java.sql.*" %> <%!//递归判断该id下面是否有子结点,有的话递归,最后删除自己 private void del(Connection conn,int id){ Statement stmt = null; ResultSet rs = null; try{ stmt = conn.createStatement(); String sql = "select * from article where pid = "+ id;//查询该id下的所有内容,因此该id应作为pid查询 rs = stmt.executeQuery(sql); while(rs.next()){//查询到的结果集进行一条一条循环迭代 del(conn,rs.getInt("id")); } stmt.executeUpdate("delete from article where id = " + id); } catch(SQLException e){ e.printStackTrace(); } finally{ try{ if(rs != null){//注意异常的捕获,这样处理更加严谨 rs.close(); rs = null; } if(stmt != null){ stmt.close(); stmt = null; } } catch(SQLException e){ e.printStackTrace(); } } } %> <% String admin = (String)session.getAttribute("admin"); if(admin == null || !admin.equals("true")) { out.println("孙贼,别想找BUG来删除!"); return; } %> <% 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:3306/bbs?user=root&password=123456"; Connection conn = DriverManager.getConnection(url); conn.setAutoCommit(false);//我们回复过的楼层必然不再是叶子节点,因此这里要用事物处理,关闭自动提交 del(conn,id); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select count(*) from article where pid = " + pid); rs.next(); int count = rs.getInt(1); rs.close(); stmt.close(); if (count <= 0){ Statement stmtUpdate = conn.createStatement(); stmtUpdate.executeUpdate("update article set isleaf = 0 where id = " + pid); stmtUpdate.close(); } conn.commit(); conn.setAutoCommit(true);//回复自动提交功能 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=GB18030"> <title>Insert title here</title> </head> <body> <% response.sendRedirect("ShowArticleTree.jsp");//重定向到入口界面 %> </body> </html>
7 登陆页面
登陆页面主要有美工来做,这里的代码主要看业务逻辑
<%@ page contentType="text/html; charset=gbk" pageEncoding="gbk" %> <% String action = request.getParameter("action"); if(action != null && action.equals("login")) { String username = request.getParameter("uname"); String password = request.getParameter("pwd"); if(username == null || !username.equals("admin")) { %> <font color="white" size=5>username not correct!</font> <% //return; }else if(password == null || !password.equals("admin")) { out.println("password not correct!"); //return; }else { session.setAttribute("admin", "true"); response.sendRedirect("ShowArticleTree.jsp"); } } %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <!-- saved from url=(0054)http://www.simworld.com/client_access/client_login.asp --> <HTML><HEAD><TITLE>SIM - Client Access - Login</TITLE> <META http-equiv=Content-Type content="text/html; charset=gbk" pageEncoding="gbk"><LINK href="images/sim_stylesheet.css" type=text/css rel=styleSheet> <SCRIPT language=JavaScript src="" type=text/javascript></SCRIPT> <SCRIPT language=JavaScript src="" type=text/javascript></SCRIPT> <SCRIPT language=JavaScript src="" type=text/javascript></SCRIPT> <META content="MSHTML 6.00.2900.2963" name=GENERATOR> <style type="text/css"> <!-- .STYLE1 {color: #CCCCCC} --> </style> </HEAD> <BODY bgColor=#20355a leftMargin=0 topMargin=0 onload=init() marginheight="0" marginwidth="0"><!--Begin all TOP NAVIGATIOND ROPDOWN LAYERS ------------><!--Begin About Sim Dropdown 1 --> <DIV id=about_sim_drop1> <TABLE cellSpacing=0 cellPadding=0 width=140 border=0> <TBODY> <TR> <TD bgColor=#ffffff> <TABLE cellSpacing=2 cellPadding=2 width=140 border=0> <TBODY> <TR> <TD vAlign=top align=left width=130><A class=topnav onmouseover="stopTime(); showLayer('about_sim_corporate_drop2'); hideLayer('about_sim_portfolio_drop2');" onmouseout=startTime(); href="http://www.simworld.com/about_sim/corporate/index.asp">Corporate Info</A></TD> <TD vAlign=top width=10><IMG height=10 alt=arrow src="images/nav_arrows.gif" width=10></TD></TR></TBODY></TABLE></TD></TR><!-- <tr> <td bgcolor="#CACFDA"> <table width="140" border="0" cellspacing="2" cellpadding="2"> <tr> <td width="130" valign="top" align="left"><a href="/about_sim/services/index.asp" onMouseOver="stopTime(); hideLayer('about_sim_corporate_drop2');" onMouseOut="startTime();" class="topnav">Services</a></td> <td width="10" valign="top"><img src="/pics/spacer.gif" alt="" width="10" height="10"></td> </tr> </table> </td> </tr> --> <TR> <TD bgColor=#cacfda> <TABLE cellSpacing=2 cellPadding=2 width=140 border=0> <TBODY> <TR> <TD vAlign=top align=left width=130><A class=topnav onmouseover="stopTime(); hideLayer('about_sim_corporate_drop2');" onmouseout=startTime(); href="http://www.simworld.com/about_sim/products/index.asp">Products</A></TD> <TD vAlign=top width=10><IMG height=10 alt="" src="images/spacer.gif" width=10></TD></TR></TBODY></TABLE></TD></TR><!--<tr> <td bgcolor="#CACFDA"> <table width="140" border="0" cellspacing="2" cellpadding="2"> <tr> <td width="130" valign="top" align="left"><a href="/about_sim/portfolio/index1.asp" onMouseOver="stopTime(); showLayer('about_sim_portfolio_drop2'); hideLayer('about_sim_corporate_drop2');" onMouseOut="startTime();" class="topnav">Portfolio</a></td> <td width="10" valign="top"><img src="/pics/nav_arrows.gif" alt="arrow" width="10" height="10"></td> </tr> </table> </td> </tr>--> <TR> <TD bgColor=#ffffff> <TABLE cellSpacing=2 cellPadding=2 width=140 border=0> <TBODY> <TR> <TD vAlign=top align=left width=130><A class=topnav onmouseover=stopTime(); onmouseout="startTime(); hideLayer('about_sim_corporate_drop2');" href="http://www.simworld.com/about_sim/portfolio/index_temp.asp">Portfolio</A></TD> <TD vAlign=top width=10><IMG height=10 alt=arrow src="images/spacer.gif" width=10></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></DIV><!-- End About Sim Dropdown 1 --><!--Begin About Sim Corporate Dropdown 2 --> <DIV id=about_sim_corporate_drop2> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD bgColor=#cacfda> <TABLE cellSpacing=2 cellPadding=2 width="100%" border=0> <TBODY> <TR> <TD vAlign=top align=left width="100%"><A class=topnav onmouseover=stopTime(); onmouseout=startTime(); href="http://www.simworld.com/about_sim/corporate/mission.asp">Mission</A></TD></TR></TBODY></TABLE></TD></TR> <TR> <TD bgColor=#ffffff> <TABLE cellSpacing=2 cellPadding=2 width="100%" border=0> <TBODY> <TR> <TD vAlign=top align=left width="100%"><A class=topnav onmouseover=stopTime(); onmouseout=startTime(); href="http://www.simworld.com/about_sim/corporate/philosophy.asp">Philosophy</A></TD></TR></TBODY></TABLE></TD></TR> <TR> <TD bgColor=#cacfda> <TABLE cellSpacing=2 cellPadding=2 width="100%" border=0> <TBODY> <TR> <TD vAlign=top align=left width="100%"><A class=topnav onmouseover=stopTime(); onmouseout=startTime(); href="http://www.simworld.com/about_sim/corporate/team.asp">Team</A></TD></TR></TBODY></TABLE></TD></TR> <TR> <TD bgColor=#ffffff> <TABLE cellSpacing=2 cellPadding=2 width="100%" border=0> <TBODY> <TR> <TD vAlign=top align=left width="100%"><A class=topnav onmouseover=stopTime(); onmouseout=startTime(); href="http://www.simworld.com/about_sim/corporate/specialty.asp">Specialty Markets </A></TD></TR></TBODY></TABLE></TD></TR> <TR> <TD bgColor=#cacfda> <TABLE cellSpacing=2 cellPadding=2 width="100%" border=0> <TBODY> <TR> <TD vAlign=top align=left width="100%"><A class=topnav onmouseover=stopTime(); onmouseout=startTime(); href="http://www.simworld.com/about_sim/corporate/news.asp">News & Awards</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></DIV><!--Begin About Sim Corporate Dropdown 2 --><!--Begin About Sim Portfolio Dropdown 2 --> <DIV id=about_sim_portfolio_drop2><!--<table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td bgcolor="#CACFDA"> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tr> <td width="100%" valign="top" align="left"><a href="/about_sim/portfolio/websites.asp" onMouseOver="stopTime();" onMouseOut="startTime();" class="topnav">Websites</a></td> </tr> </table> </td> </tr> <tr> <td bgcolor="#FFFFFF"> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tr> <td width="100%" valign="top" align="left"><a href="/about_sim/portfolio/multimedia.asp" onMouseOver="stopTime();" onMouseOut="startTime();" class="topnav">Multimedia Presentations</a></td> </tr> </table> </td> </tr> <tr> <td bgcolor="#CACFDA"> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tr> <td width="100%" valign="top" align="left"><a href="/about_sim/portfolio/print_graphic_design.asp" onMouseOver="stopTime();" onMouseOut="startTime();" class="topnav" target="_blank">Print / Graphic Design</a></td> </tr> </table> </td> </tr> <tr> <td bgcolor="#FFFFFF"> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tr> <td width="100%" valign="top" align="left"><a href="/about_sim/client_list.pdf" onMouseOver="stopTime();" onMouseOut="startTime();" class="topnav" target=_"blank">Client List (PDF)</a></td> </tr> </table> </td> </tr> </table>--></DIV><!--Begin About Sim Portfolio Dropdown 2 --><!--Begin Client Access Dropdown 1 --> <DIV id=client_access_drop1><!--<table width="140" border="0" cellspacing="0" cellpadding="0"> <tr> <td bgcolor="#FFFFFF"> <table width="140" border="0" cellspacing="2" cellpadding="2"> <tr> <td width="130" valign="top" align="left"><a href="/client_access/client_login.asp" onMouseOver="stopTime(); hideLayer('client_access_customer_drop2');" onMouseOut="startTime();" class="topnav">Client Login</a></td> <td width="10" valign="top"><img src="/pics/spacer.gif" alt="" width="10" height="10"></td> </tr> </table> </td> </tr> <tr> <td bgcolor="#CACFDA"> <table width="140" border="0" cellspacing="2" cellpadding="2"> <tr> <td width="130" valign="top" align="left"><a href="/client_access/customerservice/index1.asp" onMouseOver="stopTime(); showLayer('client_access_customer_drop2');" onMouseOut="startTime();" class="topnav">Customer Service</a></td> <td width="10" valign="top"><img src="/pics/nav_arrows.gif" alt="arrow" width="10" height="10"></td> </tr> </table> </td> </tr> <tr> <td bgcolor="#FFFFFF"> <table width="140" border="0" cellspacing="2" cellpadding="2"> <tr> <td width="130" valign="top" align="left"><a href="/under_construction.asp" onMouseOver="stopTime(); hideLayer('client_access_customer_drop2');" onMouseOut="startTime();" class="topnav">Beyond Today</a></td> <td width="10" valign="top"><img src="/pics/spacer.gif" alt="" width="10" height="10"></td> </tr> </table> </td> </tr> </table>--></DIV><!-- End Client Access Dropdown 1 --><!--Begin Client Access Customer Service Dropdown 2 --> <DIV id=client_access_customer_drop2><!--<table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td bgcolor="#CACFDA"> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tr> <td width="100%" valign="top" align="left"><a href="/client_access/customerservice/policy1.asp" onMouseOver="stopTime();" onMouseOut="startTime();" class="topnav">Our Policy</a></td> </tr> </table> </td> </tr> <tr> <td bgcolor="#FFFFFF"> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tr> <td width="100%" valign="top" align="left"><a href="/client_access/customerservice/help1.asp" onMouseOver="stopTime();" onMouseOut="startTime();" class="topnav">Help</a></td> </tr> </table> </td> </tr> <tr> <td bgcolor="#CACFDA"> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tr> <td width="100%" valign="top" align="left"><a href="/client_access/customerservice/downloads1.asp" onMouseOver="stopTime();" onMouseOut="startTime();" class="topnav">Downloads</a></td> </tr> </table> </td> </tr> <tr> <td bgcolor="#FFFFFF"> <table width="100%" border="0" cellspacing="2" cellpadding="2"> <tr> <td width="100%" valign="top" align="left"><a href="/client_access/customerservice/tech_standards1.asp" onMouseOver="stopTime();" onMouseOut="startTime();" class="topnav" target=_"blank">Technical Standards</a></td> </tr> </table> </td> </tr> </table>--></DIV><!-- End Client Access Customer Service Dropdown 2 --><!--Begin Join our Team Dropdown 1 --> <DIV id=join_our_team_drop1> <TABLE cellSpacing=0 cellPadding=0 width=150 border=0> <TBODY> <TR> <TD bgColor=#ffffff> <TABLE cellSpacing=2 cellPadding=2 width=150 border=0> <TBODY> <TR> <TD vAlign=top width=10><IMG height=10 alt="" src="images/client_access.htm" width=10></TD> <TD vAlign=top align=right width=140><A class=topnav onmouseover=stopTime(); onmouseout=startTime(); href="http://www.simworld.com/join_our_team/job_openings.asp">Job Openings</A></TD></TR></TBODY></TABLE></TD></TR> <TR> <TD bgColor=#cacfda> <TABLE cellSpacing=2 cellPadding=2 width=150 border=0> <TBODY> <TR> <TD vAlign=top width=10><IMG height=10 alt="" src="images/spacer.gif" width=10></TD> <TD vAlign=top align=right width=140><A class=topnav onmouseover=stopTime(); onmouseout=startTime(); href="http://www.simworld.com/join_our_team/apply_online.asp">Employee Benefits</A></TD></TR></TBODY></TABLE></TD></TR> <TR> <TD bgColor=#ffffff> <TABLE cellSpacing=2 cellPadding=2 width=150 border=0> <TBODY> <TR> <TD vAlign=top width=10><IMG height=10 alt="" src="images/spacer.gif" width=10></TD> <TD vAlign=top align=right width=140><A class=topnav onmouseover=stopTime(); onmouseout=startTime(); href="http://www.simworld.com/join_our_team/corp_culture.asp">Corporate Culture</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></DIV><!-- End Join Our Team Dropdown 1 --><!--End all TOP NAVIGATIOND ROPDOWN LAYERS ------------><!--Begin Browser Spanning Table, this allows Main Web Site Table to be centered in the middle of the browser --> <TABLE height="100%" cellSpacing=0 cellPadding=0 width="100%" align=center border=0> <TBODY> <TR> <TD><!--Begin Main Web Site Table All Website Design elements below--> <TABLE borderColor=#ffffff cellSpacing=0 cellPadding=0 width=760 align=center border=1> <TBODY> <TR> <TD> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD><!-- Begin Top Logo, Navigation and Message bar Table --> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0><!--Beign Global Nav Buttons ---> <TBODY> <TR> <TD rowSpan=2><IMG height=53 alt="Screened Images Multimedia" src="images/sim_logo_top.gif" width=136 useMap=#top_logo_map border=0><MAP name=top_logo_map><AREA shape=RECT alt="Screened Images Multimedia [Back to Home]" coords=11,4,120,54 href="http://www.simworld.com/index.asp"></MAP></TD> <TD><span class="STYLE1">欢迎来到 著名的BBS后台</span></TD> </TR> <TR><!--End Global Nav Buttons ---> <TD><span class="STYLE1">不输入用户名密码不许进 用户名: admin 密码: admin </span></TD> </TR></TBODY></TABLE><!-- End Top Logo, Navigation and Message bar Table --></TD></TR> <TR> <TD><!-- Begin Inner Content Table: This portion will be customizable throughout the website --> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD><IMG height=324 alt="" src="images/client_login_left_arc.gif" width=137 useMap=#bot_logo_map border=0><MAP name=bot_logo_map><AREA shape=RECT alt="Screened Images Multimedia [Back to Home]" coords=11,0,120,24 href="http://www.simworld.com/index.asp"></MAP></TD> <TD> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD><IMG height=91 alt="CLIENT LOG-IN" src="images/client_login_title.gif" width=282></TD></TR> <TR> <TD> <FORM action=Login.jsp method=post> <input type=hidden name=action value=login> <TABLE cellSpacing=0 cellPadding=0 width="100%" background="images/client_login_text_bg.gif" border=0> <TBODY> <TR> <TD rowSpan=4><IMG height=158 alt="" src="images/spacer.gif" width=22 border=0></TD> <TD colSpan=2> <P class=bodydarkblue>Please enter your username and password here to preview your designs, check project status and/or submit new job requests.</P></TD></TR> <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>密码:</LABEL></P></TD> <TD><INPUT id=pwd type=password name=pwd></TD></TR> <TR> <TD vAlign=top colSpan=2><A class=bodydarkblue href="http://www.simworld.com/client_access/client_login.asp"><STRONG><!--Forget your password?--></STRONG></A><IMG height=1 alt="" src="images/spacer.gif" width=132 border=0> <INPUT type=image alt=Submit src="images/client_login_submit.gif" align=absMiddle value=Submit name=Submit></TD></TR></TBODY></TABLE></TD></TR> <TR> <TD><IMG height=75 alt="" src="images/client_login_bot_arc.gif" width=282></TD></TR></TBODY></TABLE></TD> <TD><IMG height=324 alt="Log-in Image" src="images/client_login_main_pic.jpg" width=341></TD></TR></TBODY></TABLE><!-- End Inner Content Table --------></TD></TR> <TR> <TD><!-- Begin Bottom Navigation: Contact Us, Request A- Quote --> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD><A onmouseover="Rollover('nav_homepage_a','nav_homepage');" onmouseout="Rollover('nav_homepage','nav_homepage');" href="http://www.simworld.com/index.asp"></A><IMG height=26 alt="" src="images/interior_bot_nav_bar.gif" width=100%></TD> </TR> <TR> <TD><IMG height=12 alt="Copyright 2003 Screened Images, Inc." src="images/bot_footer_bar.gif" width=760></TD></TR></TBODY></TABLE><!-- End Bottom Navigation: Contact Us, Request A- Quote --></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!--End Main Web Site Table --></TD></TR></TBODY></TABLE><!--End Browser Spanning Table --></BODY></HTML>
8 平面展示
<%@ page language="java" contentType="text/html; charset=gbk" pageEncoding="gbk"%> <%@ page import="java.sql.*"%> <% int pageSize = 3;//定义一页显示多少条数据 String strPageNo = request.getParameter("pageNo");//接受当前页数 int pageNo; if (strPageNo == null || strPageNo.equals("")) { pageNo = 1;//若没有则默认第一页 } else { try { pageNo = Integer.parseInt(strPageNo.trim()); } 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=123456"; Connection conn = DriverManager.getConnection(url); Statement stmtCount = conn.createStatement(); ResultSet rsCount = stmtCount .executeQuery("select count(*) from article where pid = 0");//拿出父亲节点为0的,即主题帖 rsCount.next(); int totalRecords = rsCount.getInt(1); int totalPages = totalRecords % pageSize == 0 ? totalRecords / pageSize : totalRecords / pageSize + 1;//若可以整除则显示多少页,否则+1页 if (pageNo > totalPages) pageNo = totalPages;//指定最多页数不可溢出 int startPos = (pageNo - 1) * pageSize;//确定mysql中要取出来的数据位置 Statement stmt = conn.createStatement(); ResultSet rs = stmt .executeQuery("select * from article where pid = 0 order by pdate desc limit " + startPos + "," + pageSize);//利用mysql中的分页来显示 %> <!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>Insert title here</title> </head> <body> <a href="Post.jsp">发表新帖</a> <table border="1"> <% while (rs.next()) { %> <tr> <td><%=rs.getString("title")%></td> </tr> <% } rs.close(); stmt.close(); conn.close(); %> </table> 共<%=totalPages%>页 第<%=pageNo%>页 <a href="ShowArticleFlat.jsp?pageNo=<%=pageNo-1%>"> < </a> <%--传递给本页要显示的页数 --%> <a href="ShowArticleFlat.jsp?pageNo=<%=pageNo+1%>"> > </a> <form name="form1" action="ShowArticleFlat.jsp"><%--动态提交数据--%> <select name="pageNo" onchange="document.form1.submit()"> <% for(int i=1; i<=totalPages; i++) { %> <option value=<%=i%> <%=(pageNo == i) ? "selected" : ""%>> 第<%=i%>页 <% } %> </select> </form> <form name="fom2" action="ShowArticleFlat.jsp"> <input type=text size=4 name="pageNo" value=<%=pageNo%> /> <input type="submit" value="go" /> </form> </body> </html>
3 总结
到此为止,一个纯JSP的BBS完成,大家应该感觉到了头绪有点乱的感觉,正是由于这种感觉,我们之后会采取jsp+javabean的方法来开发,那样代码逻辑性看上去会强很多。
给大家一个建议:这些代码都是先写出来功能模块,能够独立运行以后才慢慢加入其他控制模块以及健壮性模块,所以按照这个顺序写还是没那么困难的,希望大家都能够学好JAVA WEB!