使用JDOM设计简单的JSP+XML的系统留言板
JDOM是一个开源项目,是完全利用纯Java技术开发的,全称为(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包主要负责生成一个文档,一般用于文档的创建。output包主要用于文档转换输出,而jdom包下面则是包含了所有可能应用到的数据类型,比如(Document、Element、Namespace等等)。 首先,我们建立一个简单的xml文件。文件名可为message.xml <?xml version="1.0" encoding="UTF-8"?> <infoList> <info> <username>alexsander</username><!--保存的是发言者姓名--> <title>请问?</title><!--保存标题--> <date>Tue Jun 06 14:27:54 CST 2006</date><!--保存留言时间--> <information>你好,你是什么地方的人啊?</information><!--保存信息内容--> <manager>系统管理员</manager><!--保存回复人姓名--> <message>暂无回复</message><!--回复内容--> </info> </infoList> PS:从这里我们可以看出xml文件具有很强的树型结构。 然后我们就可以编写一个JSP(bbs.jsp)页面来显示其中的内容:(以下页面有点混乱,可使用JavaBean封装某些操作,注意首次进入页面时候,必须是"bbs.jsp?Page=1",或者其他页数也可以,否则会报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()是指孩子结点的个数*/ 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; /*……………………*/ /**……使得数据逆序读出……**/ /*……………………*/ 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)可以实现读取该结点具体一个下级结点的数据内容*/ 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>系统留言板</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">系统留言板</td></tr></table><a href="xtly.htm">发表留言</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> 以上为为用户显示留言板的内容。 下面是如何发表留言,首先用frontPage做一个发表留言的HTML(xtly.htm)静态页面,必须要求输入留言者姓名、留言标题、留言内容,然后将数据传送到实现发表留言的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();//获得当前系统时间 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);//设置该子结点的内容 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("系统管理员:"); 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+="恭喜你,你的留言已经发送成功!"; out.println(msg); String url="3;url=‘bbs.jsp?Page=1‘"; response.setHeader("REFRESH",url); }catch(Exception e){} %> 由于是系统留言板,所有回复都要求是系统管理员的回复,所以当提交新留言的时候,将系统管理员的回复都暂时设置为:暂无回复。 当系统管理员登陆时候,可将"s.append("<form action=‘222.jsp?num="+i+"‘ method=‘post‘><td><input type=‘submit‘ value=‘回复‘></td></form></tr></table></td></tr><br>");" 添加到显示留言板内容的bbs.jsp中,不过要先删除原来的</table>结束标记。可以设置成两个页面,一个是系统管理员登陆(bbsgl.jsp,必须是"bbsgl.jsp?Page=1",或者其他页数也可以,否则会报NullPointExcepton异常))的页面,一个是普通留言者进入(bbs.jsp)的页面。在bbsgl.jsp中,每当在某条留言后面点到回复该留言的时候,自动将代表该条记录的二级结点在xml文档中的序号通过url参数传递到下一个页面中。 当在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"));/*取得上页面传递进来的欲修改的结点的序号*/ 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("数据修改成功!!"); out.println("三秒后自动返回浏览页面!"); String url="3;url=‘bbsgl.jsp?Page=1‘";//自动刷新到bbsgl.jsp response.setHeader("REFRESH",url);%> |
|