一:利用單例設計模式創建dom對象
編碼問題:xml文件不指定輸入流的編碼格式,文件以系統編碼(windows7爲gbk)寫入(雖然文件頭爲utf-8)
此時注意dom4j解析讀取的編碼問題:
1:當文件編碼格式與xml頭文件屬性編碼不一致時,會出現解析異常,將xml頭改爲gbk即可
2:如果以utf-8讀取,必須文件是以utf-8寫入進去:則需要對寫入流設置編碼:
第一種:利用OutputFormat
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter w=null;
w=new XMLWriter(new FileOutputStream(fileName),format);
第二種,利用轉換流設置編碼: XMLWriter w=null;
w=new XMLWriter(new PrintWriter(new OutputStreamWriter(new FileOutputStream(fileName),"utf-8")));
note:要注意寫入文件的本身編碼格式。可另存爲查看編碼(文件選擇框下面有編碼選擇,默認的爲原來文件的編碼)package cn.hncu.login;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
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 DomFactory {
private static Document dom;
private static String fileName;
static{
String name=DomFactory.class.getSimpleName();
name+=".class";
String packageName=DomFactory.class.getPackage().getName().replace(".", "/");
String urlPath=DomFactory.class.getResource(name).getPath();
String path=urlPath.substring(0, urlPath.lastIndexOf(packageName));
fileName=path+"users.xml";
File file=new File(fileName);
if(!file.exists()){
try {
file.createNewFile();
FileWriter pw=new FileWriter(file);
//xml頭無中文,直接寫入文件(無論哪種格式輸入流,文件都是ASCII碼(只含有ASCII碼時))
//PrintWriter pw=new PrintWriter(new OutputStreamWriter(new FileOutputStream(file),"utf-8"));
pw.write("<?xml version='1.0' encoding='utf-8'?>");
//fw.write("<?xml version='1.0' encoding='gbk'?>");
pw.flush();
pw.close();
dom=DocumentHelper.createDocument();//創建dom對象
dom.addElement("Users");
SaveDom();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
try {
SAXReader sax=new SAXReader();
//文件格式正確時,無需設置,格式不正確,設了也沒用。。。。
//sax.setEncoding("utf-8");
//dom=sax.read(new InputStreamReader(new FileInputStream(file),"utf-8"));
dom=sax.read(new FileInputStream(file));
} catch (FileNotFoundException e) {
throw new RuntimeException(e.getMessage());
} catch (DocumentException e) {
throw new RuntimeException(e.getMessage());
}
List<Element> list=dom.getRootElement().elements();
for(Element e:list){
System.out.println(e.elementText("name"));
}
}
public static Document getInstance(){
return dom;
}
public static boolean SaveDom(){
<pre name="code" class="java"> OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
//format.setTrimText(false);
XMLWriter w=null;
try {
//w=new XMLWriter(new PrintWriter(new OutputStreamWriter(new FileOutputStream(fileName),"utf-8")));
w=new XMLWriter(new FileOutputStream(fileName),format);
} catch (IOException e) {throw new RuntimeException(e.getMessage());}finally{if(w!=null)try {w.close();} catch (IOException e) {throw new RuntimeException(e.getMessage());}}return true;}}
jsp:主頁
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>login</title>
<script type="text/javascript">
/* function imgUpdate(){
var imgNode= document.getElementsByTagName("img").item(0);
//瀏覽器的緩存,對相同url的請求無效,改變參數來達到刷新
var t=new Date().getTime();
imgNode.src="/WebStudy/Captcha?"+t;
}*/
οnlοad=function(){
var value=document.getElementById("has").value;
if(value=="true"){
alert("用戶已存在");
}
var value=document.getElementById("add").value;
if(value=="true")
alert("用戶創建成功");
else if(value=="false")
alert("用戶創建失敗");
};
</script>
</head>
<body>
<!-- /WebStudy/Captcha 對servelt的請求,需要在web.xml配置servel的路徑映射url-pattern
<img src="/WebStudy/Captcha"/><a href="javascript:imgUpdate()">看不清</a>
<a href="OneServelt">一次轉發</a>
<a href="/WebStudy/OneServelt">一次轉發</a>
<a href="">多次轉發</a>
<a href="ChongServelt">重定向</a>-->
<form action="LoginServlet" method="post">
姓名:<input type="text" name="name"/>
密碼:<input type="password" name="pwd"/>
<input type="submit" value="提交">
<input type="hidden" value="<%=request.getAttribute("has") %>" id="has">
<input type="hidden" value="<%=request.getParameter("add") %>" id="add">
</form>
<a href="LoginServlet">查看所有用戶</a>
</body>
</html>
servlet的處理:
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
Document dom=DomFactory.getInstance();
//System.out.println(dom.asXML());
//List<Element> list = dom.getRootElement().elements();
List<Element> list = dom.selectNodes("//user");
PrintWriter pw=response.getWriter();
pw.print("<html><body>");
for(Element e:list){
pw.print("用戶名:"+e.elementText("name")+"密碼:"+e.elementText("pwd"));
pw.print(" <a href='DelServlet?id="+e.attributeValue("id")+"'>刪除</a><br/>");
}
pw.print("<a href='/WebStudy/index.jsp'>主頁</a>");
pw.println("</body></html>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String name=request.getParameter("name");
String pwd=request.getParameter("pwd");
Document dom=DomFactory.getInstance();
// System.out.println(dom.getRootElement().getName());
List<Element> list = dom.selectNodes("//user");
for(Element e:list){
//if(e.elementText("name").equals(name)&&e.elementText("pwd").equals(pwd)){
if(e.elementText("name").equals(name)){
request.setAttribute("has", true);
request.getRequestDispatcher("/index.jsp").forward(request, response);
return;
}
}
Element root=dom.getRootElement();
Element user=root.addElement("user");
user.addAttribute(new QName("id"), UUID.randomUUID().toString().replace("-", ""));
user.addElement("name").setText(name);
user.addElement("pwd").setText(pwd);
response.sendRedirect("/WebStudy/index.jsp?add="+DomFactory.SaveDom());
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Document dom=DomFactory.getInstance();
Node node=dom.selectSingleNode("//user[@id='"+request.getParameter("id")+"']");
if (node!=null) {
node.getParent().remove(node);
DomFactory.SaveDom();
}
// List<Element> list=dom.getRootElement().elements();
// for (Element e:list) {
// if (e.attributeValue("id").equals(request.getParameter("id"))) {
// e.getParent().remove(e);
// DomFactory.SaveDom();
// }
// }
response.sendRedirect("LoginServlet");
}