Db4o系列之十八:基于Db4o的WEB应用

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();  
}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值