上一篇讲到了如何通过 java 来使用 dom4j 组件创建本地磁盘上面的xml文档,
现在我要说一下怎样在 Servlet 的请求处理方法 doXxx() 里面把从浏览器上获取的信息保存到 本地的xml文件中:
1)获取浏览器表单中的信息、
2)创建 xml 文档、
3)给xml文档添加节点等信息
4)输出xml文档到本地磁盘
这四个不用多说了,关键是获取的中文信息保存到 xml 文档中如何不出现 乱码 !
检查了很多遍, jsp 页面的编码方式和 xml 文档的输出格式编码都是 GBK 这没错啊! 究竟是什么原因导致出现中文乱码呢?
这就是我这两天一直纠结的问题,实际上很简单就能解决,主要是没想到。
我们常用 response.setCharacterEncoding(),但是很少用 request.setCharacterEncoding(),没错就是因为没有手动用代码设置request请求对象的编码方式为 GBK ,设置之后才与 jsp 页面和 xml 文档输出格式一致啊!
下面我就直接贴代码:
1.index.jsp
1)<body></body>中的:
<form name="form1" method="post" action="ChineseXml" target="_blank" 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">信息:</td>
</tr>
<tr>
<td height="28" align="center">省名:</td>
<td><input name="province" type="text" id="province" size="52"></td>
</tr>
<tr>
<td height="157" align="center">市名:</td>
<td><textarea name="city" cols="50" rows="9" id="city"></textarea></td>
</tr>
<tr>
<td> </td>
<td><input name="Submit" type="submit" class="btn_grey" value="保存">
<input name="Submit2" type="reset" class="btn_grey" value="重置"></td>
</tr>
</table>
</form>
2)<head></head>中的:
<script language="javascript">
function check(form){
with(form){ //with 语句可以不通过对象名直接引用参数对象中已有的属性
if(province.value==""){
alert("省名不能为空!!!!!!!!!!!!!!");
province.focus();
return false;
}else if(city.value==""){
alert("市名不能为空!!!!!!!!!!!");
city.focus();
return false;
}
return true;
}
}
</script>
2.ChineseXml.java
import java.io.File;
import java.io.FileOutputStream;
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 ChineseXml extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("GBK"); //非常重要,请求对象的编码方式设置为与浏览器和输出格式一致的 GBK 编码才能避免乱码
String fileURL = getServletContext().getRealPath("/xml/ChineseText.xml"); //XML文件的路径
File file = new File(fileURL);
/***************************获取表单中的信息****************************/
String province=request.getParameter("province"); //获取省名
String city=request.getParameter("city"); //获取市名
/****************************************************************************/
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("信息栏");
Element createTime = placard.addElement("createTime"); //添加createTime子节点
createTime.setText("创建于"+df.format(new Date()));
} else {
SAXReader reader = new SAXReader(); // 实现化SAXReader对象
try {
document = reader.read(new File(fileURL));//获取XML文件对应的XML文档对象
placard = document.getRootElement(); // 获取根节点
} catch (DocumentException e) {
e.printStackTrace();
}
}
/********************** 添加信息 **************************/
String id = String.valueOf(placard.elements("info").size() + 1); // 获取当前信息的id号
Element info = placard.addElement("info"); //添加info节点
info.addAttribute("id", id); //为info节点设置ID属性
Element province_info = info.addElement("province"); //添加province节点
province_info.setText(province); //设置province节点的内容
Element city_item = info.addElement("city"); //添加city节点
city_item.addCDATA(city); //设置city节点的内容为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("GBK"); // 设置写入流编码
try {
XMLWriter writer = new XMLWriter(new FileOutputStream(fileURL), format);
writer.write(document); // 向流写入数据
writer.close(); //关闭流
} catch (IOException e) {
e.printStackTrace();
}
request.getRequestDispatcher("xml/ChineseText.xml").forward(request,response);
}
}