分享

使用JDOM设计简单的JSP+XML的系统留言板

 凤舞天煌 2006-12-14
使用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);%> 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多