使用dom4j保存公告信息到XML文件中

我们使用dom4j通过在客户端的表单中填写公告信息后,单击“保存”按钮将该公告信息保存到XML文件中。

第一步:下载dom4j组件,并将dom4j-1.6.1.jar和jaxen-1.1-beta-7.jar文件添加到web应用的WEB-INF\lib文件夹中,如下图所示:


第二步:编写index.jsp页面,在该页面中添加用于收集公告信息的表单及表单元素,关键代码如下:

<form name="form1" method="post" action="PlacardServlet" target="_self" οnsubmit="return check(this)">
 <table width="500" height="271" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF">  
   <tr>  
      <td width="90" height="23"> </td>  
      <td width="410"> </td>  
    </tr>  
    <tr>  
      <td colspan="2" align="center"><h1>添加公告信息</h1></td>  
    </tr>  
    <tr>  
      <td height="28" align="center">公告标题:</td>  
      <td><input name="title" type="text" id="title" size="52"></td>  
    </tr>  
    <tr>  
      <td height="157" align="center">公告内容:</td>  
      <td><textarea name="content" cols="50" rows="9" id="content"></textarea></td>  
    </tr>  
    <tr>  
      <td><input name="Submit" type="submit" class="btn_grey" value="保存"></td>  
      <td><input name="Submit2" type="reset" class="btn_grey" value="重置"></td>  
    </tr>  
  </table> 
</form> 
第三步:编写用于控制用户信息输入信息完整性的javascript脚本,用于判断用户输入是否为空,在表单的onsubmit事件中调用自定义的JavaScript函数来实现:

<script language="javascript">  
        function check(form){  
            if(form.title.value==""){  
                alert("请输入公告标题!");
                form.title.focus();
                return false;  
            }  
            if(form.content.value==""){  
                alert("请输入公告内容!");
                form.content.focus();
                return false;  
            }  
        }  
</script>  
第四步:编写用于将公告信息保存到XML文件中的Servlet,名称为PlacardServlet。在该方法中 首先进行获取用户的输入,我们用request.getParameter("参数名称")来在Servlet中获取到表单的数据,这里要注意对中文的处理,否则会出现乱码; 然后我们判断指定的XML文件是否存在,如果不存在则创建该文件,使用DocumentHelper.createDocument()方法进行创建,并在该文件中写入XML文件的序言及根节点等;如果存在打开文件,并获取对应的XML文件对象,再将公告信息写入到文档对象中,这里我们使用org.dom4j.io.XMLWriter包中的XMLWriter方法; 最后将该XML文档对象保存到XML文件中,并将页面重定向到该XML文件中。

package com.dc.Servlet;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class PlacardServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
   
    public PlacardServlet() {
        super();
       
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath()); 
	}
	
	@SuppressWarnings({ "deprecation", "null" })
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");  
        String fileURL = request.getRealPath("/xml/placard.xml");       //XML文件的路径  
        File file = new File(fileURL);  
        String title = new String(request.getParameter("title").getBytes("iso-8859-1"), "utf-8");//获取公告标题,并对其进行zhuanm
        String content = new String(request.getParameter("content").getBytes("iso-8859-1"), "utf-8");//获取公告内容,并对其进行转码
  
        Document document = null;        
        Element placard = null;  
        DateFormat df=new SimpleDateFormat("yyyy年MM月dd日 HH时mm分");   //设置日期格式  
        if (!file.exists()) {                   // 判断文件是否存在,如果不存在,则创建该文件  
            document = DocumentHelper.createDocument();                 //创建XML文档对象  
            placard=DocumentHelper.createElement("placard");            //创建普通节点  
            document.setRootElement(placard);                           // 将placard设置为根节点  
            placard.addAttribute("version", "2.0");                     //为根节点添加属性version  
            Element description = placard.addElement("description");    //添加description子节点  
            description.setText("公告栏");  								//设置子节点description的文本
            Element createTime = placard.addElement("createTime");      //添加createTime子节点  
            createTime.setText("创建于"+df.format(new Date()));  		//设置子节点createTime的文本
        } else {            
        	SAXReader reader = new SAXReader(); // 实现化SAXReader对象  
            try { 
            	document.setXMLEncoding("UTF-8");
                document = reader.read(new File(fileURL));//获取XML文件对应的XML文档对象  
                placard = document.getRootElement(); // 获取根节点  
            } catch (DocumentException e) {  
                e.printStackTrace();  
            }  
        }  
        
        Element info = placard.addElement("info");      //添加info节点      
        String id = String.valueOf(placard.elements("info").size() + 1); // 获取当前公告的id号 
        info.addAttribute("id", id);                    //为info节点设置ID属性  
        
        Element title_info = info.addElement("title");  //添加title节点  
        title_info.setText(title);                          //设置title节点的内容  
        Element content_item = info.addElement("content");  //添加content节点  
        // 此处不能使用setText()方法,如果使用该方法,当内容中出现HTML代码时,程序将出错  
        content_item.addCDATA(content);                     //设置content节点的内容为CDATA段  
        Element pubDate_item = info.addElement("pubDate");  //添加pubDate节点  
        df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");     //设置日期格式  
        pubDate_item.setText(df.format(new Date()));  
        // 保存文件  
          
        // 创建OutputFormat对象  
        OutputFormat format = OutputFormat.createPrettyPrint(); // 格式化为缩进方式  
        format.setEncoding("UTF-8");                            // 设置写入流编码  
        try {         	
            XMLWriter writer = new XMLWriter(new FileWriter(fileURL), format);  
            writer.write(document);                             // 向流写入数据  
            writer.close();                                     //关闭流  
            System.out.print("生成XML文件成功");
        } catch (IOException e) {  
        	System.out.print("生成XML文件失败");
            e.printStackTrace();  
        }  
        request.getRequestDispatcher("xml/placard.xml").forward(request,response);
	}

}
第五步:在web.xml文件中配置创建的Servlet,设置映射的路径为/PlacardServlet,具体代码如下:

  <servlet>
  	<servlet-name>PlacardServlet</servlet-name>
  	<servlet-class>com.dc.Servlet.PlacardServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>PlacardServlet</servlet-name>
  	<url-pattern>/PlacardServlet</url-pattern>
  </servlet-mapping>
最后我们测试一下效果:由于本实例中将创建的XML文件保存到该实例根目录下的xml文件夹中,所以运行程序前还需创建xml文件夹,但不需要创建对应的XML文件,如图:


运行后如下:


填入信息后点击保存,发现出现以下提示


进入目录查看文件已经生成


用editplus打开


我们用Crtl+B测试能否查看,发现页面空白


查看文件编码发现系统默认xml文件编码不是UTF-8的,另存为对话框把Encoding设置为UTF-8;


再用Ctrl+B测试,发现OK


由此我们得出结论:代码生成的xml文件编码内容是uft-8的,但文件格式却是ANSI的,导致文件格式不统一,所以我们再浏览器上不能正常浏览。

解决方法:这里我们不能使用简单的FileWriter,而是应该使用一个能指定具体输出编码的Writer,我们导入JDK的IO包中的OutPutStream,Servlet中只需要修改一行代码即可完成:

XMLWriter writer = new XMLWriter(new FileOutputStream(fileURL), format);  
修改完成后重新启动web,再进行操作点击保存,这时页面如下正常显示:









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xingdiango

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值