| 使用JDOM設計簡單的JSP+XML的系統(tǒng)留言板 JDOM是一個開源項目,是完全利用純Java技術開發(fā)的,全稱為(Java Document Object Model)可在http://www.上下載其包文件。下載完成后,將Build文件下面的jdom.jar添加classpath類路徑以及tomcat的common/lib下,即可完成jdom的配置。 JDOM主要包含了5個包,分別為org.JDOM、org.JDOM.input、org.JDOM.output、org.JDOM.adapters、org.JDOM.transform,作為我設計留言板主要使用到了org.JDOM、org.JDOM.input、org.JDOM.output這三個包。input包主要負責生成一個文檔,一般用于文檔的創(chuàng)建。output包主要用于文檔轉換輸出,而jdom包下面則是包含了所有可能應用到的數(shù)據(jù)類型,比如(Document、Element、Namespace等等)。 首先,我們建立一個簡單的xml文件。文件名可為message.xml <?xml version="1.0" encoding="UTF-8"?> <infoList> <info> <username>alexsander</username><!--保存的是發(fā)言者姓名--> <title>請問?</title><!--保存標題--> <date>Tue Jun 06 14:27:54 CST 2006</date><!--保存留言時間--> <information>你好,你是什么地方的人啊?</information><!--保存信息內(nèi)容--> <manager>系統(tǒng)管理員</manager><!--保存回復人姓名--> <message>暫無回復</message><!--回復內(nèi)容--> </info> </infoList> PS:從這里我們可以看出xml文件具有很強的樹型結構。 然后我們就可以編寫一個JSP(bbs.jsp)頁面來顯示其中的內(nèi)容:(以下頁面有點混亂,可使用JavaBean封裝某些操作,注意首次進入頁面時候,必須是"bbs.jsp?Page=1",或者其他頁數(shù)也可以,否則會報NullPointExcepton異常) <%@page contentType="text/html;charset=gb2312"%> <%@page language="java" import="java.util.*,org.jdom.*,org.jdom.input.*,org.jdom.output.*,java.io.*"%> <% Element root,info; String file="E:\\message.xml";//盤符可以自己設定,不過要的是絕對路徑。 StringBuffer s=new StringBuffer();//保存HTML格式 List li; int P1=1,P2=1; int i=0,Page=1,num=0,PageSize=5,totalPage=0,totalRecord=0, Page=Integer.parseInt(request.getParameter("Page")); if(Page<=0)Page=1; /*@--------------------*/ /**P1,P2控制分頁顯示**/ /*@--------------------*/ try{ SAXBuilder sb=new SAXBuilder();//實例化SAXBuilder類,用來操作文檔 Document doc=sb.build(new FileInputStream(file));//構造一個文檔,使用文件輸入流讀取。 root=doc.getRootElement();//獲得根元素 li=root.getChildren();//獲得所有的下一級孩子結點 if(li.size()%PageSize==0)totalPage=li.size()/PageSize;/*li.size()是指孩子結點的個數(shù)*/ else totalPage=(int)Math.floor(li.size()/PageSize)+1; if(Page<=1)P1=1; else P1=Page-1;//P1控制向前翻頁 if(Page>=totalPage) P2=totalPage; else P2=Page+1;//P2控制向后翻頁 <!---------------------------------------------------------------> if(Page==1)Page=totalPage; else if(Page==totalPage)Page=1; else Page=totalPage-1; /*……………………*/ /**……使得數(shù)據(jù)逆序讀出……**/ /*……………………*/ if(Page>=totalPage) {Page=totalPage; num=li.size()-(Page-1)*PageSize; i=(Page-1)*PageSize+num-1; } else{ i=(Page-1)*PageSize+4;}//通過以上轉換,xml文檔的最后一條記錄會被顯示為留言板的第一條記錄 for(;i>=(Page-1)*PageSize;i--){ info=(Element)li.get(i);/*獲得第i個孩子結點,通過getChildText(String)可以實現(xiàn)讀取該結點具體一個下級結點的數(shù)據(jù)內(nèi)容*/ s.append("<tr><td><table border align=‘center‘ cellspading=‘1‘ width=‘80%‘><tr><td width=‘20%‘>"+info.getChildText("username")+"</td>"); s.append("<td width=‘50%‘>"+info.getChildText("title")+"</td>"); s.append("<td>"+info.getChildText("date")+"</td></tr>"); s.append("<tr><td colspan=‘3‘>"+info.getChildText("information")+"</td></tr>"); s.append("<tr><td colspan=‘3‘>"+info.getChildText("manager")+":</td></tr>"); s.append("<tr><td colspan=‘3‘>"+info.getChildText("message")+"</td></tr></table></td></tr><br>"); } } catch(Exception e){ out.println(e); }%> <html><head><title>系統(tǒng)留言板</title></head> <body> <div align="center" valign="top"> <table width="60%" background="picture/beijing1.jpg" valign="top"> <tr bgcolor="#C9c900"><td align="center" bgcolor="#FFCC00">系統(tǒng)留言板</td></tr></table><a href="xtly.htm">發(fā)表留言</a><br> <%=s%> </div><div align="center"> <table><tr><td><a href="bbs.jsp?Page=<%=P1%>" style="text-decoretion:none">上一頁</a></td> <td><a href="bbs.jsp?Page=<%=P2%>" style="text-decoretion:none">下一頁</a></td></tr></table></div></body></html> 以上為為用戶顯示留言板的內(nèi)容。 下面是如何發(fā)表留言,首先用frontPage做一個發(fā)表留言的HTML(xtly.htm)靜態(tài)頁面,必須要求輸入留言者姓名、留言標題、留言內(nèi)容,然后將數(shù)據(jù)傳送到實現(xiàn)發(fā)表留言的JSP(addbbs.jsp)頁面, <%@page contentType="text/html;charset=gb2312"%> <%@page language="java" import="java.util.*,org.jdom.*,org.jdom.input.*,org.jdom.output.*,java.io.*"%> <% String msg=""; String file="E:\\message.xml"; Element root,info; List li; try{ Date d=new Date();//獲得當前系統(tǒng)時間 request.setCharacterEncoding("gb2312"); String username=request.getParameter("t1"); String title=request.getParameter("t2"); String information=request.getParameter("t3"); // /username=new String(username.getBytes("iso-8859-1"),"gb2312"); SAXBuilder sb=new SAXBuilder();//實例化SAXBuilder對象 Document doc=sb.build(new FileInputStream(file)); root=doc.getRootElement(); li=root.getChildren(); //@……………… Element newInfo=new Element("info");//新建一個二級結點 Element el=new Element("username");//新建該二級結點的子結點 el.setText(username);//設置該子結點的內(nèi)容 newInfo.addContent(el);//將子結點添加到二級結點下 el=new Element("title"); el.setText(title); newInfo.addContent(el); el=new Element("date"); el.setText(d.toString()); newInfo.addContent(el); el=new Element("information"); el.setText(information); newInfo.addContent(el); el=new Element("manager"); el.setText("系統(tǒng)管理員:"); newInfo.addContent(el); el=new Element("message"); el.setText("暫無回復"); newInfo.addContent(el); li.add(newInfo);//將該二級結點追加到所有二級結點的后面 //--------------------- String s=" ";//這里可以定義生成的文檔格式,首行縮進 boolean newLines=true;//是否為新的一行 XMLOutputter outer=new XMLOutputter();//輸出類 outer.output(doc,new FileOutputStream(file));//輸出文檔 msg+="恭喜你,你的留言已經(jīng)發(fā)送成功!"; out.println(msg); String url="3;url=‘bbs.jsp?Page=1‘"; response.setHeader("REFRESH",url); }catch(Exception e){} %> 由于是系統(tǒng)留言板,所有回復都要求是系統(tǒng)管理員的回復,所以當提交新留言的時候,將系統(tǒng)管理員的回復都暫時設置為:暫無回復。 當系統(tǒng)管理員登陸時候,可將"s.append("<form action=‘222.jsp?num="+i+"‘ method=‘post‘><td><input type=‘submit‘ value=‘回復‘></td></form></tr></table></td></tr><br>");" 添加到顯示留言板內(nèi)容的bbs.jsp中,不過要先刪除原來的</table>結束標記??梢栽O置成兩個頁面,一個是系統(tǒng)管理員登陸(bbsgl.jsp,必須是"bbsgl.jsp?Page=1",或者其他頁數(shù)也可以,否則會報NullPointExcepton異常))的頁面,一個是普通留言者進入(bbs.jsp)的頁面。在bbsgl.jsp中,每當在某條留言后面點到回復該留言的時候,自動將代表該條記錄的二級結點在xml文檔中的序號通過url參數(shù)傳遞到下一個頁面中。 當在bbsgl.jsp中點到“回復”,即回復該留言的時候,就進入到222.jsp。只顯示該條留言,并且只有管理員回復一項(即:暫無回復)可以被更改。 下面是222.jsp: <%@page contentType="text/html;charset=gb2312"%> <%@page language="java" import="java.util.*,org.jdom.*,org.jdom.input.*,org.jdom.output.*,java.io.*"%> <% request.setCharacterEncoding("gb2312"); int num=Integer.parseInt(request.getParameter("num"));/*獲得欲回復留言的二級結點在xml中的序號*/ StringBuffer s=new StringBuffer(); Element root,info; List li; String file="E:\\message.xml"; SAXBuilder sb=new SAXBuilder(); Document doc=sb.build(file); root=doc.getRootElement(); li=root.getChildren(); info=(Element)li.get(num); String username=String.valueOf(info.getChildText("username")); String title=String.valueOf(info.getChildText("title")); String date=String.valueOf(info.getChildText("date")); String information=String.valueOf(info.getChildText("information")); String manager=String.valueOf(info.getChildText("manager")); String message=String.valueOf(info.getChildText("message")); s.append("<form action=‘111.jsp?num="+num+"‘ method=‘post‘><table border align=‘center‘ cellspading=‘1‘ width=‘80%‘><tr><td width=‘20%‘>"+username+"</td>"); s.append("<td width=‘50%‘>"+title+"</td>"); s.append("<td>"+date+"</td></tr>"); s.append("<tr><td colspan=‘3‘>"+information+"</td></tr>"); s.append("<tr><td colspan=‘3‘>"+manager+":</td></tr>"); s.append("<tr><td colspan=‘3‘><textarea name=t1 rows=‘8‘ cols=‘50‘>"+message+"</textarea></td></tr>"); s.append("<tr><td colspan=‘3‘><input type=‘submit‘ value=‘修改‘></td></tr></table></form><br>"); %> <html> <body> <font size=10 color=red>請保證回復的嚴謹性</font> <hr color="blue"> <%=s%> </body> </html> 點擊“修改”,進入到111.jsp 111.jsp是具體操作管理員回復的。 <%@page contentType="text/html;charset=gb2312"%> <%@page language="java" import="java.util.*,org.jdom.*,org.jdom.input.*,org.jdom.output.*,java.io.*"%> <% request.setCharacterEncoding("gb2312"); String message=request.getParameter("t1");//管理員的回復 int num=Integer.parseInt(request.getParameter("num"));/*取得上頁面?zhèn)鬟f進來的欲修改的結點的序號*/ Element root,info; StringBuffer s=new StringBuffer(); List li; String file="E:\\message.xml"; SAXBuilder sb=new SAXBuilder();//構造器 Document doc=sb.build(new FileInputStream(file)); root=doc.getRootElement(); li=root.getChildren(); info=(Element)li.get(num);//獲得欲修改的二級結點 Element child=info.getChild("message"); child.setText(message); XMLOutputter outp=new XMLOutputter();//定義輸出類的引用 outp.output(doc,new FileOutputStream(file));//輸出 out.println("數(shù)據(jù)修改成功!!"); out.println("三秒后自動返回瀏覽頁面!"); String url="3;url=‘bbsgl.jsp?Page=1‘";//自動刷新到bbsgl.jsp response.setHeader("REFRESH",url);%> | 
|  |