Db4o不仅可以应用于嵌入式和单机程序,它同样知用于WEB应用程序。因为:
1.Db4o是线程安全的,这就允许你在Servlet中使用它而不用担心引起共享问题
2.Db4o的核心只是一个JAR文件,你只需要把该JAR文件放入WEB-INF/lib下即可
3.在WEB应用中Db4o同样会存储对象,就像很多ORM一样,不同的是ORM是一种转换关系,而Db4o是纯正的对象数据库。
由于在WEB程序中有可能有多台服务器,所以单机版的db4o模式不适合使用(你不知道是哪台服务器对请求做出的响应);而C/S网络模式也不适用,因为我们并不真正需要每次通过网络建立一个连接——所有应用是在服务器端运行的,因而我们选择嵌入式的C/S模式。
要在WEB应用中(针对JSP J2EE)使用db4o,首先要将db4o中的JAR(至少要一个主要的JAR)放入WEB-INF/lib下,然后需要在web.xml文件中定义一个 listener,目的是在WEB应用启动的时候启动Server,并将它放入context,以便所有的servlet可以使用到它,注意,JSP文件最终也是先被编译成servlet然后再执行的,因而JSP文件也可以直接使用到这个server。除此之外,其余的便和普通JSP(J2EE)应用无异了
下面是一个demo,用途很简单,只供插入用户和查找用户,没有做验证:
目录结构:
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<listener>
<listener-class>iss.whu.macro.db.Db4oServletContextListener</listener-class>
</listener>
<context-param>
<param-name>db4oFileName</param-name>
<param-value>db.yap</param-value>
</context-param>
<servlet>
<servlet-name>add</servlet-name>
<jsp-file>/WEB-INF/add.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>add</servlet-name>
<url-pattern>/add</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>query</servlet-name>
<jsp-file>/WEB-INF/query.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>query</servlet-name>
<url-pattern>/query</url-pattern>
</servlet-mapping>
<display-name>JspWithDb4o</display-name>
<servlet>
<display-name>AddPerson</display-name>
<servlet-name>AddPerson</servlet-name>
<servlet-class>iss.whu.macro.servlet.AddPerson</servlet-class>
</servlet>
<servlet>
<description>
</description>
<display-name>QueryPerson</display-name>
<servlet-name>QueryPerson</servlet-name>
<servlet-class>iss.whu.macro.servlet.QueryPerson</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AddPerson</servlet-name>
<url-pattern>/AddPerson</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>QueryPerson</servlet-name>
<url-pattern>/QueryPerson</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
iss.whu.macro.db.Db4oServletContextListener:
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.db4o.Db4o;
import com.db4o.ObjectServer;
/**
* Application Lifecycle Listener implementation class Db4oServletContextListener
*
*/
public class Db4oServletContextListener implements ServletContextListener {
public static final String KEY_DB4O_FILE_NAME = "db4oFileName";
public static final String KEY_DB4O_SERVER = "db4oserver";
private ObjectServer server = null;
/**
* Default constructor.
*/
public Db4oServletContextListener() {
}
/**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
public void contextInitialized(ServletContextEvent arg0) {
close();
ServletContext context=arg0.getServletContext();
String filePath = context.getRealPath("WEB-INF/db/"
+ context.getInitParameter(KEY_DB4O_FILE_NAME));
server = Db4o.openServer(filePath, 0);
context.setAttribute(KEY_DB4O_SERVER, server);
context.log("db4o startup on " + filePath);
}
/**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
public void contextDestroyed(ServletContextEvent event) {
ServletContext context = event.getServletContext();
context.removeAttribute(KEY_DB4O_SERVER);
close();
context.log("db4o shutdown");
}
private void close()
{
if (server!=null )
server.close();
server=null;
}
}
AddPerson.java:
package iss.whu.macro.servlet;
import iss.whu.macro.db.object.Person;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.db4o.ObjectContainer;
import com.db4o.ObjectServer;
/**
* Servlet implementation class AddPerson
*/
public class AddPerson extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* Default constructor.
*/
public AddPerson() {
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
ObjectServer server=(ObjectServer) getServletContext().getAttribute("db4oserver");
ObjectContainer db=server.openClient();
request.setCharacterEncoding("utf-8");//注意的是,如果这里没有这句在FF里面将是乱码,在IE里面正常
String name=request.getParameter("name");
int age=Integer.valueOf(request.getParameter("age"));
Person p=new Person(name,age);
db.store(p);
db.close();
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
}
QueryPerson.java:
package iss.whu.macro.servlet;
import iss.whu.macro.db.object.Person;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.db4o.ObjectContainer;
import com.db4o.ObjectServer;
import com.db4o.ObjectSet;
/**
* Servlet implementation class QueryPerson
*/
public class QueryPerson extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public QueryPerson() {
super();
}
/**
* @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ObjectServer server=(ObjectServer) getServletContext().getAttribute("db4oserver");
ObjectContainer db = server.openClient();
String name=request.getParameter("name");
if (name!=null && name.trim().equals("")) name=null;
int age=0;
try {
age=Integer.valueOf(request.getParameter("age"));
} catch (Exception e) {
age=0;
}
Person person=new Person(name,age);
ObjectSet<Person> result=db.queryByExample(person);
response.setContentType("text/html;charset=utf-8");//没有这两句在FF里面是正常,在IE里面是乱码
response.setCharacterEncoding("utf-8");//
PrintWriter out=response.getWriter();
out.write("<html><head><title>Result</title></head><body><table>");
out.write("<tr><th>Name</th><th>Age</th></tr>");
for (Person p:result)
{
out.write("<tr>");
out.write("<td>"+p.getName()+"</td><td>"+p.getAge()+"</td>");
out.write("</tr>");
}
out.close();
db.close();
}
}