欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-30 10:00:17
...

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

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

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

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

<form name="form1" method="post" action="PlacardServlet" target="_self" onsubmit="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文件,如图:

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

运行后如下:

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

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

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

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

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

用editplus打开

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

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

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

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

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

再用Ctrl+B测试,发现OK

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

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

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

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


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