一:利用单例设计模式创建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");
}