本篇我們做一個jsp執行個體的開發,實現一個留言板程式。上篇Servlet&JSP的那些事兒(十一)中討論的資料庫知識也是為了這個執行個體開發做鋪墊。另外,再複習一下Servlet&JSP的那些事兒(十)中討論的jsp知識。好了,讓我們開始吧~
1)建立一個Message表
首先建立一個MessageBoard資料庫,然後在資料庫中建立一個Message表,用來存放留言。當然,使用的還是Mysql資料庫。進入dos環境,輸入如下指令進入資料庫:
mysql -uroot -pshan
-u後面為使用者名稱,-p後面為密碼。然後建立資料庫MessageBoard,輸入語句:
create database MessageBoard;
然後如下語句切換到資料庫MessageBoard,
use MessageBoard;
最後使用如下語句建立Message表:
create table Message(id INT AUTO_INCREMENT not null primary key,user VARCHAR(20) not null,title VARCHAR(100) not null,content TEXT,time TIMESTAMP not null,ip VARCHAR(20) not null);
各項的含義看英文就可以明白,在此就不再贅述。
2)配置程式運行目錄和JDBC資料來源
我們在此採用的是資料庫連接池的方式,所以需要建立設定檔。先在D:\apache-tomcat-7.0.33\webapps\檔案夾下建立web工程目錄MessageBoard。然後在MessageBoard檔案夾下建立WEB-INF檔案夾和META-INF檔案夾。在META-INF檔案夾下,建立context.xml檔案,編輯檔案內容,如下所示:
<Context><Resource name="jdbc/messageboard" auth="Container"type="javax.sql.DataSource"maxActive="100" maxIdle="30" maxWait="10000"username="root" password="shan"driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/messageboard?autoReconnect=true"/></Context>
3)編寫message.html
然後在MessageBoard檔案夾下建立message.html檔案,用於填寫留言資訊。檔案內容如下:
<center> <form action="process.jsp" method="post"> <table bgcolor="#B3B3FF"> <caption>歡迎訪問留言板</caption> <tr> <td>使用者名稱:</td> <td><input type="text" name="name"/></td> </tr> <tr> <td>主題:</td> <td><input type="text" name="title" size="40"/></td> </tr> <tr> <td>內容:</td> <td><textarea name="content" rows="10" cols="40"></textarea></td> </tr> <tr> <td><input type="submit" value="提交"/></td> <td><input type="reset" value="重填"/></td> </tr> </table> </form></center>
4)編寫util.jsp
然後在MessageBoard檔案夾下編寫util.jsp用於處理一些特殊字元。內容如下:
<%! public static String toHtml(String str) { if(str == null) { return null; } StringBuffer sb = new StringBuffer(); for(int i = 0; i < str.length(); i++) { char c = str.charAt(i); switch(c) { case ' ': sb.append(" "); break; case '\n': sb.append("<br/>"); break; case '\r': break; case '\'': sb.append("'"); break; case '<': sb.append("<"); break; case '>': sb.append(">"); break; case '&': sb.append("&"); break; case '"': sb.append("""); break; case '\\': sb.append("\"); break; default: sb.append(c); break; } } return sb.toString(); }%>
5)編寫process.jsp
然後在MessageBoard檔案夾下編寫process.jsp用於向資料庫中插入使用者的留言。
<%@ page contentType="text/html;charset=gb2312" %><%@ page import="java.sql.*,javax.sql.*,javax.naming.*" %><%@ include file="util.jsp" %><% //設定本文編碼格式 request.setCharacterEncoding("gb2312"); String name = request.getParameter("name"); String title = request.getParameter("title"); String content = request.getParameter("content"); //如果使用者民,標題,內容之一為null,則重新定向到首頁面 if(null == name || null == title || null == content) {response.sendRedirect("index.jsp");return; } name = toHtml(name.trim()); title = toHtml(title.trim()); if(name.equals("") || title.equals("")) {response.sendRedirect("message.html");return; } content = toHtml(content.trim()); String fromIP = request.getRemoteAddr(); //利用資料來源對象建立資料庫連接 Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/messageboard"); Connection conn = ds.getConnection(); PreparedStatement pstmt = conn.prepareStatement("insert into message(user,title,content,ip) values (?,?,?,?)"); pstmt.setString(1,name); pstmt.setString(2,title); pstmt.setString(3,content); pstmt.setString(4,fromIP); pstmt.executeUpdate(); pstmt.close(); conn.close(); response.sendRedirect("index.jsp");%>
註:該檔案中我們沒有插入留言時間,這是因為在mysql中,如果一個TIMESTAMP類型的資料項目為空白,mysql會自動將當前日期插入新行。在使用其他資料庫時,就要採用另外的辦法來插入當前日期和時間。
6)編寫index.jsp
MessageBoard檔案夾下編寫index.jsp用於留言板的首頁,用於顯示使用者的留言,包含分頁功能。代碼如下:
<%@ page contentType="text/html;charset=gb2312" %><%@ page import="java.sql.*,javax.sql.*,javax.naming.*" %><html><head><title>留言板</title></head><body><a href="message.html">我要留言</a><br/><%Context ctx = new InitialContext();DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/messageboard");Connection conn = ds.getConnection();//建立可滾動的結果集Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);ResultSet rs = stmt.executeQuery("select * from message order by time desc");//移動遊標到結果集的最後一行rs.last();//得到當前行的行數,也就得到了資料庫中留言的總數int rowCount = rs.getRow();if(rowCount == 0) {out.println("當前沒有任何留言");} else {%>共有<strong><%=rowCount%></strong>條留言 <%String strCurPage =request.getParameter("page");//表示當前頁數int curPage;if(strCurPage == null) {curPage = 1;} else {curPage = Integer.parseInt(strCurPage);}//定義每頁顯示的留言數int countPerPage = 5;//計算顯示所有留言需要的總頁數int pageCount = (rowCount + countPerPage -1) / countPerPage;//遊標移至結果集中指定的行。如果顯示的是第一頁,curPage=1//遊標移動到第一行rs.absolute((curPage - 1) * countPerPage +1);//如果是第一頁,則顯示不帶串連的文字,如果不是第一頁,//則給使用者提供跳轉到第一頁和上一頁的串連if(curPage == 1) {%>第一頁 上一頁 <%} else {%><a href="index.jsp?page=<%=1%>">第一頁</a> <a href="index.jsp?page=<%=curPage-1%>">上一頁</a> <%}//如果當前頁是最後一頁,則顯示不帶串連的文字,如果不是最後一頁,//則給使用者提供跳轉到下一頁和最後一頁的串連if(curPage == pageCount) {%>下一頁 最後頁 <%} else {%><a href="index.jsp?page=<%=curPage+1%>">下一頁</a> <a href="index.jsp?page=<%=pageCount%>">最後頁</a> <%}int i = 0;//以迴圈的方式取出每頁要顯示的資料,因為在前面針對要顯示的頁數,//調用了rs.absolute((curPage - 1) * countPerPage +1);//所以是從遊標所在的位置取出當前頁面要顯示的資料while(i < countPerPage && !rs.isAfterLast()) {out.println("<hr color=\"blue\" size = \"2\"></hr><br/>");out.println("使用者名稱:"+rs.getString("user"));out.println(" ");Timestamp ts = rs.getTimestamp("time");long lms = ts.getTime();Date date = new Date(lms);Time time = new Time(lms);out.println("留言時間:" + date + " " + time);out.println(" ");out.println("使用者IP:"+rs.getString("ip"));out.println("主題:"+rs.getString("title"));out.println("內容:"+rs.getString("content"));i++;rs.next();}}rs.close();stmt.close();conn.close();%></body></html>
7)運行結果
神馬的太麻煩了。所以就不再了。可以自己按照步驟操作,然後在瀏覽器網址欄輸入http://localhost:8080/MessageBoard/index.jsp。對了,忘記了很重要的一步,你需要把之前下載的驅動程式放到tomcat安裝資料夾下的lib檔案夾中,以便讓tomcat伺服器能夠找到mysql的驅動程式。要明白,使用tomcat提供的資料來源來訪問資料庫,是tomcat需要驅動,而不是應用程式需要驅動。
另外,如果你不將應用程式放到webapps目錄下,需要在server.xml中配置context.xml中的內容,或者在D:\apache-tomcat-7.0.33\conf\Catalina\localhost中建立MessageBoard.xml,將context.xml檔案的內容拷貝到其中,和server.xml一樣,需要改變一下檔案內容,如下:
<Context docBase="檔案所在目錄(如:d:\\MessageBoard)"><Resource name="jdbc/messageboard" auth="Container"type="javax.sql.DataSource"maxActive="100" maxIdle="30" maxWait="10000"username="root" password="shan"driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/messageboard?autoReconnect=true"/></Context>
好了,大體上就這麼多了。我們在此通過複習了資料庫的一些知識和之前所學的一些jsp知識,這也就是本篇的目的所在。對了,整個web工程在這裡:點擊下載
轉載請註明出處:http://blog.csdn.net/iAm333