最近看到了一个项目解析xml的方式,觉得也不错,测试下跟大家分享下!眼下解析xml的方式很多,这里不提了!只谈谈digester的使用,浅谈吧!希望以后你们遇到了能有点帮助吧!
首先在使用Digester解析xml时要导入2个jar包,有的人说是4个,我认为2个就够了,可能有其它的功能实现吧!不说了
2个jar包分别是commons-beanutils.jar 、commons-digester.jar,你们自己去下!
以下没有任何目的,纯属测试用:
1,首先建立一个web项目(我是为了方便直接建立了web项目)将三个jar包导入进来,再建立一个xml文件名字自己起,我这里叫database.xml
<?xml version="1.0" encoding="UTF-8"?>
<database>
<user userName="admin"
password="admin"
>
</user>
</database>
2,为之建立一个javabean,属性必须和xml中的user节点的属性一致(是不是必须没有做测试)
public class UserBean {
private String userName;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
3,创建一个servlet类,我这里的名字叫UserDatabaseServlet,自己决定!为了做测试所以写的不严谨!
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.util.Hashtable;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import org.apache.commons.digester.Digester;
public class UserDatabaseServlet extends HttpServlet {
private Hashtable database = null;
private String pathname = "/WEB-INF/database.xml";
public void init() throws ServletException{
String value;
value = getServletConfig().getInitParameter("pathnamexml");
if(value !=null){
pathname = value;
}
try {
load();
getServletContext().setAttribute("database",database);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void addUser(UserBean user){
database.put(user.getUserName(), user);
}
private synchronized void load() throws Exception{
database = new Hashtable();
InputStream is = getServletContext().getResourceAsStream(pathname);
BufferedInputStream bis = new BufferedInputStream(is);
Digester digester = new Digester(); //创建Digester对象
digester.push(this); //并将digester对象压入到堆栈中
digester.setValidating(false); //不进行xml与相应的dtd验证
//对user节点注入对象创建规则,当sax的事件遇到user节点的时候创建UserBean的实例,并压入到堆栈中!
digester.addObjectCreate("database/user", "com.wenhua.test.UserBean");
//对user节点属性调用UserBean的set方法,这里分别为setUserName/setPassword
digester.addSetProperties("database/user");
//调用addUser方法,将设置好的javabean放入到Hashtable中
digester.addSetNext("database/user", "addUser");
digester.parse(bis);//解析xml
bis.close();
}
}
4,配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>userdatabase</servlet-name>
<servlet-class>com.wenhua.test.UserDatabaseServlet</servlet-class>
<init-param>
<param-name>pathnamexml</param-name>
<param-value>/WEB-INF/database.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup><!--在服务器启动时就加载/WEB-INF/database.xml 你们可以不写然后测试下看看-->
</servlet>
<!-- 测试servlet -->
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>com.wenhua.test.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
5,写个测试类servlet 测试下能不能拿到userName password
mport java.io.IOException;
import java.io.PrintWriter;
import java.util.Hashtable;
import java.util.Iterator;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out
.println("<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
Hashtable database = (Hashtable) getServletContext().getAttribute("database");
UserBean user = new UserBean();
//遍历hashtable
for (Iterator it = database.keySet().iterator(); it.hasNext(); ) {
String key = (String) it.next();
user =(UserBean) database.get(key);
}
out.println("userName: "+user.getUserName()+" "+"passWord: "+user.getPassword());
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}