使用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文件夹中,如下图所示:
第二步:编写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文件,如图:
运行后如下:
填入信息后点击保存,发现出现以下提示
进入目录查看文件已经生成
用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,再进行操作点击保存,这时页面如下正常显示:
上一篇: mybatis源码-解析配置文件(二)之解析的流程
下一篇: Spring自定义标签的定义和解析
推荐阅读
-
读取xml文件中的信息到txt文本中
-
使用工厂模式或dom4j 获取document(保存和读取xml文件)
-
Java:使用DOM4j来实现读写XML文件中的属性和元素
-
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码_javascript技巧
-
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码_javascript技巧
-
使用dom4j保存公告信息到XML文件中
-
使用工厂模式或dom4j 获取document(保存和读取xml文件)
-
使用DOM复制(克隆)指定节点名数据到新的XML文件中
-
读取xml文件中的信息到txt文本中
-
使用DOM复制(克隆)指定节点名数据到新的XML文件中