· [Java论坛][安全论坛][数据库论坛][操作系统论坛]
· [访谈] 网银安全系列访谈之:惊心动魄网银故事
· [热点专题] 网银安全系列 3G上网卡巡礼
· [订阅IT技术周刊][IT资源下载专区][病毒求助专区]
· [热点] 跨站脚本十二问 四步防范Conficker
· [热点] Windows 7 RC版公开下载 憾缺中文版

在Struts中使用PlugIn扩展Hibernate

发布时间:2008.03.24 04:52     来源:赛迪网    作者:Alice

使用Struts的PlugIn技术把HibernateSessionFactory,具体过程如下:  

(1)创建HibernateSessionFactory.java,代码如下:

  package zy.pro.td.util;
  
  import net.sf.hibernate.HibernateException;
  import net.sf.hibernate.Session;
  import net.sf.hibernate.cfg.Configuration;
  
  /**
  * Configures and provides access to Hibernate sessions, tied to the
  * current thread of execution. Follows the Thread Local Session
  * pattern, see {@link http://hibernate.org/42.html}.
  */
  public class HibernateSessionFactory {
  
  /**
  * Location of hibernate.cfg.xml file.
  * NOTICE: Location should be on the classpath as Hibernate uses
  * #resourceAsStream style lookup for its configuration file. That
  * is place the config file in a Java package - the default location
  * is the default Java package.<br><br>
  * Examples: <br>
  * <code>CONFIG_FILE_LOCATION = "/hibernate.conf.xml".
  * CONFIG_FILE_LOCATION = "/com/foo/bar/myhiberstuff.conf.xml".</code>
  */
  private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
  
  /** Holds a single instance of Session */
  private final ThreadLocal threadLocal = new ThreadLocal();
  
  /** The single instance of hibernate configuration */
  private final Configuration cfg = new Configuration();
  
  /** The single instance of hibernate SessionFactory */
  private net.sf.hibernate.SessionFactory sessionFactory;
  
  /**
  * Returns the ThreadLocal Session instance. Lazy initialize
  * the <code>SessionFactory</code> if needed.
  *
  * @return Session
  * @throws HibernateException
  */
  public Session currentSession() throws HibernateException {
  Session session = (Session) threadLocal.get();
  
  if (session == null) {
  if (sessionFactory == null) {
  try {
  cfg.configure(CONFIG_FILE_LOCATION);
  sessionFactory = cfg.buildSessionFactory();
  }
  catch (Exception e) {
  System.err.println("%%%% Error Creating SessionFactory %%%%");
  e.printStackTrace();
  }
  }
  session = sessionFactory.openSession();
  threadLocal.set(session);
  }
  
  return session;
  }
  
  /**
  * Close the single hibernate session instance.
  *
  * @throws HibernateException
  */
  public void closeSession() throws HibernateException {
  Session session = (Session) threadLocal.get();
  threadLocal.set(null);
  
  if (session != null) {
  session.close();
  }
  }
  
  /**
  * Default constructor.
  */
  public HibernateSessionFactory() {
  }
  
  }
  

(2) 创建HibernatePlugIn.java,代码如下:

  package zy.pro.td.plugin;
  
  /*
  * Created on Oct 4, 2004
  *
  * To change the template for this generated file go to
  * Window>Preferences>Java>Code Generation>Code and Comments
  */
  import javax.servlet.ServletException;
  
  import org.apache.struts.action.ActionServlet;
  import org.apache.struts.action.PlugIn;
  import org.apache.struts.config.ModuleConfig;
  
  import javax.naming.Context;
  import javax.naming.InitialContext;
  
  import zy.pro.td.util.HibernateSessionFactory;
  
  /**
  * @author sunil
  *
  *  This class will initialize hibernate and bind SessionFactory in JNDI at the
  *  time of application and startup and unbind it from JNDI at the time of application
  * shutdown
  */
  public class HibernatePlugin
  implements PlugIn {
  
  private static final String jndi_hibernate = "jndi_hibernate_factory";
  private  HibernateSessionFactory hsf;
  private String name;
  
  public HibernatePlugin() {
  hsf=new HibernateSessionFactory();
  }
  
  // This method will be called at the time of application shutdown
  public void destroy() {
  System.out.println("Entering HibernatePlugIn.destroy()");
  //Put hibernate cleanup code here
  System.out.println("Exiting HibernatePlugIn.destroy()");
  }
  
  //This method will be called at the time of application startup
  public void init(ActionServlet actionServlet, ModuleConfig config) throws
  ServletException {
  System.out.println("Entering HibernatePlugIn.init()");
  System.out.println("Value of init parameter " + getName());
  //Uncomment next two lines if you want to throw UnavailableException from your servlet
  //    if(true)
  //      throw new ServletException("Error configuring HibernatePlugIn");
  System.out.println("Exiting HibernatePlugIn.init()");
  bindFactoryToJNDI();
  }
  
  private void bindFactoryToJNDI() {
  
  try {
  Context ctx = new InitialContext();
  ctx.bind(this.jndi_hibernate,hsf);
  System.out.println("bindind the hibernate factory to JNDI successfully");
  }
  catch (Exception e) {
  e.printStackTrace();
  }
  }
  
  public String getName() {
  
  return name;
  }
  
  public void setName(String string) {
  name = string;
  }
  }
  

(3) 配置Struts-config.xml,如下:

  
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts-config PUBLIC "-//Apache Software 

Foundation//DTD Struts Configuration 

1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

  <struts-config>
  <form-beans>
  <form-bean name="userActionForm" 
   type="zy.pro.td.controller.UserActionForm" />
  </form-beans>
  <action-mappings>

  <action name="userActionForm" path="/act/log/login" scope="request" 

type="zy.pro.td.controller.LoginAction" />
  </action-mappings>
  <plug-in className="org.apache.struts.tiles.TilesPlugin">
  <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />
  </plug-in>
  <plug-in className="org.apache.struts.validator.ValidatorPlugIn">

  <set-property property="pathnames" 

value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
  </plug-in>
  <plug-in className="zy.pro.td.plugin.HibernatePlugin" />
  <plug-in className="zy.pro.td.plugin.HibernateSessionFactoryPlugIn" />
  </struts-config>  
  这一部分就是你的嵌入代码
  

(4)创建ActionForm,代码如下:

  package zy.pro.td.controller;
  
  import org.apache.struts.action.*;
  import javax.servlet.http.*;
  
  public class UserActionForm extends ActionForm {
  private String password;
  private String username;
  public String getPassword() {
  return password;
  }
  public void setPassword(String password) {
  this.password = password;
  }
  public String getUsername() {
  return username;
  }
  public void setUsername(String username) {
  this.username = username;
  }
  public ActionErrors validate(ActionMapping actionMapping, HttpServletRequest httpServletRequest) {
  /**@todo: finish this method, this is just the skeleton.*/
  return null;
  }
  public void reset(ActionMapping actionMapping, HttpServletRequest httpServletRequest) {
  }
  }
  

(5)创建Action

  package zy.pro.td.controller;
  
  import org.apache.struts.action.*;
  import javax.servlet.http.*;
  import javax.naming.Context;
  import javax.naming.InitialContext;
  import net.sf.hibernate.SessionFactory;
  import net.sf.hibernate

(责任编辑:卢兆林)


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
资讯 通信 IT产品 IT技术 信息化
2009第七届中国电脑商年会直播
·创业投资系列访谈:产业..
·特别策划:视频网站系列..
·专题:网游虚拟货币新规..
专题:6月上市手机新品回顾及7月新机展望
·2009年中国电信业信息化..
·专题:把iPhone 3GS“解..
·WAPI重启国际标准进程 ..
专题:09年中盘点-联想春季打印机新品回顾
·InfoComm 2009 视听与集..
·网游背后的故事 网游服..
·[专题]联想ThinkPad T40..
BizSpark:微软为技术创业企业点燃火花
·社区活动:我的IT求知生..
·访谈:内网安全2009系列..
·安全访谈:网银安全之Sa..