使用Webwork实现IOC
来源:互联网 发布:python 接收post 编辑:程序博客网 时间:2024/06/04 17:40
Webwork版本2.1.7
首先,需要配置web.xml,webwork的IOC容器可以区分三种作用域requet,session,application,我们可以使用Listener和filter进行配置
<!-- webwork IOC 使用的listener -->
<listener>
<listener-class>com.opensymphony.webwork.lifecycle.ApplicationLifecycleListener</listener-class>
</listener>
<listener>
<listener-class>com.opensymphony.webwork.lifecycle.SessionLifecycleListener</listener-class>
</listener>
<!-- webwork IOC 使用的fitler -->
<filter>
<filter-name>container</filter-name>
<filter-class>com.opensymphony.webwork.lifecycle.RequestLifecycleFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>container</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>com.opensymphony.webwork.lifecycle.ApplicationLifecycleListener</listener-class>
</listener>
<listener>
<listener-class>com.opensymphony.webwork.lifecycle.SessionLifecycleListener</listener-class>
</listener>
<!-- webwork IOC 使用的fitler -->
<filter>
<filter-name>container</filter-name>
<filter-class>com.opensymphony.webwork.lifecycle.RequestLifecycleFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>container</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我们还要修改action的interceptor栈,以便让所有实现Aware接口的action将资源应用到action,其中必须要引用component interceptor,否则调用依赖资源的方法时候会碰到空指针异常
<action name="testIOC" class="ch5.example2IOC.TestIOC">
<default-interceptor-ref name="completeStack"></default-interceptor-ref>
我们调用completeStack,已经包含了component interceptor了
<default-interceptor-ref name="completeStack"></default-interceptor-ref>
我们调用completeStack,已经包含了component interceptor了
创建组件接口:
package ch5.example2IOC;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
public interface PersistenceManager ...{
void setHibernateSessionFactory (HibernateSessionFactory hibernateSessionFactory);
void setSessionFactory(SessionFactory sessionFactory);
Session getSession();
void testIOC();
}
package ch5.example2IOC;
import com.opensymphony.webwork.lifecycle.SessionLifecycleListener;
import org.hibernate.SessionFactory;
public interface HibernateSessionFactory ...{
SessionFactory getSessionFactory();
}
import org.hibernate.Session;
import org.hibernate.SessionFactory;
public interface PersistenceManager ...{
void setHibernateSessionFactory (HibernateSessionFactory hibernateSessionFactory);
void setSessionFactory(SessionFactory sessionFactory);
Session getSession();
void testIOC();
}
package ch5.example2IOC;
import com.opensymphony.webwork.lifecycle.SessionLifecycleListener;
import org.hibernate.SessionFactory;
public interface HibernateSessionFactory ...{
SessionFactory getSessionFactory();
}
实现类:
package ch5.example2IOC;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.opensymphony.xwork.interceptor.component.Disposable;
import com.opensymphony.xwork.interceptor.component.Initializable;
public class HibernateSessionFactoryImpl implements HibernateSessionFactory,Initializable,Disposable ...{
SessionFactory sessionFactory;
public void dispose() ...{
try ...{
sessionFactory.close();
} catch (Exception e) ...{
e.printStackTrace();
}
}
public void init() ...{
try...{
Configuration configuration=new Configuration();
sessionFactory=configuration.configure().buildSessionFactory();
}catch(Throwable e)...{//此处一定要是Throwable,否则会漏掉NoClassDefFoiundError和其他Error子类
e.printStackTrace();
}
}
public SessionFactory getSessionFactory() ...{
return sessionFactory;
}
}
package ch5.example2IOC;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.opensymphony.xwork.interceptor.component.Disposable;
import com.opensymphony.xwork.interceptor.component.Initializable;
public class PersistenceManagerImpl implements PersistenceManager,HibernateSessionFactoryAware,Initializable,Disposable ...{
public void setHibernateSessionFactory(HibernateSessionFactory hibernateSessionFactory) ...{
this.hibernateSessionFactory=hibernateSessionFactory;
}
HibernateSessionFactory hibernateSessionFactory;
SessionFactory sessionFactory;
Session session;
public Session getSession() ...{
return session;
}
public void testIOC() ...{
System.out.println(this.sessionFactory);
System.out.println(this.session);
}
public void dispose() ...{
if(session!=null&&session.isOpen())...{
session.close();
}
}
public void setSessionFactory(SessionFactory sessionFactory) ...{
this.sessionFactory=sessionFactory;
}
public void init() ...{
try ...{
session=this.hibernateSessionFactory.getSessionFactory().openSession();
System.out.println(session);
} catch (Exception e) ...{
e.printStackTrace();
}
}
}
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.opensymphony.xwork.interceptor.component.Disposable;
import com.opensymphony.xwork.interceptor.component.Initializable;
public class HibernateSessionFactoryImpl implements HibernateSessionFactory,Initializable,Disposable ...{
SessionFactory sessionFactory;
public void dispose() ...{
try ...{
sessionFactory.close();
} catch (Exception e) ...{
e.printStackTrace();
}
}
public void init() ...{
try...{
Configuration configuration=new Configuration();
sessionFactory=configuration.configure().buildSessionFactory();
}catch(Throwable e)...{//此处一定要是Throwable,否则会漏掉NoClassDefFoiundError和其他Error子类
e.printStackTrace();
}
}
public SessionFactory getSessionFactory() ...{
return sessionFactory;
}
}
package ch5.example2IOC;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import com.opensymphony.xwork.interceptor.component.Disposable;
import com.opensymphony.xwork.interceptor.component.Initializable;
public class PersistenceManagerImpl implements PersistenceManager,HibernateSessionFactoryAware,Initializable,Disposable ...{
public void setHibernateSessionFactory(HibernateSessionFactory hibernateSessionFactory) ...{
this.hibernateSessionFactory=hibernateSessionFactory;
}
HibernateSessionFactory hibernateSessionFactory;
SessionFactory sessionFactory;
Session session;
public Session getSession() ...{
return session;
}
public void testIOC() ...{
System.out.println(this.sessionFactory);
System.out.println(this.session);
}
public void dispose() ...{
if(session!=null&&session.isOpen())...{
session.close();
}
}
public void setSessionFactory(SessionFactory sessionFactory) ...{
this.sessionFactory=sessionFactory;
}
public void init() ...{
try ...{
session=this.hibernateSessionFactory.getSessionFactory().openSession();
System.out.println(session);
} catch (Exception e) ...{
e.printStackTrace();
}
}
}
创建enabler接口(Aware接口)
package ch5.example2IOC;
public interface PersistenceManagerAware ...{
void setPersistenceManager(PersistenceManager persistenceManager);
}
package ch5.example2IOC;
import org.hibernate.SessionFactory;
public interface HibernateSessionFactoryAware ...{
void setHibernateSessionFactory(HibernateSessionFactory hibernateSessionFactory);
}
指明要注入HibernateSessionFactory
public interface PersistenceManagerAware ...{
void setPersistenceManager(PersistenceManager persistenceManager);
}
package ch5.example2IOC;
import org.hibernate.SessionFactory;
public interface HibernateSessionFactoryAware ...{
void setHibernateSessionFactory(HibernateSessionFactory hibernateSessionFactory);
}
指明要注入HibernateSessionFactory
定义components.xml配置文件,放在classpath下
<?xml version="1.0" encoding="UTF-8"?>
<components>
<component>
<scope>session</scope>
<class>ch5.example2IOC.PersistenceManagerImpl</class>
<enabler>ch5.example2IOC.PersistenceManagerAware</enabler>
</component>
<component>
<scope>application</scope>
<class>ch5.example2IOC.HibernateSessionFactoryImpl</class>
<enabler>ch5.example2IOC.HibernateSessionFactoryAware</enabler>
</component>
</components>
<components>
<component>
<scope>session</scope>
<class>ch5.example2IOC.PersistenceManagerImpl</class>
<enabler>ch5.example2IOC.PersistenceManagerAware</enabler>
</component>
<component>
<scope>application</scope>
<class>ch5.example2IOC.HibernateSessionFactoryImpl</class>
<enabler>ch5.example2IOC.HibernateSessionFactoryAware</enabler>
</component>
</components>
Action:
package ch5.example2IOC;
import java.util.Map;
import com.opensymphony.webwork.interceptor.SessionAware;
import com.opensymphony.xwork.ActionSupport;
public class TestIOC extends ActionSupport implements HibernateSessionFactoryAware,PersistenceManagerAware ...{
public void setPersistenceManager(PersistenceManager persistenceManager) ...{
this.s1=persistenceManager;
}
public void setHibernateSessionFactory(HibernateSessionFactory hibernateSessionFactory) ...{
this.s=hibernateSessionFactory;
}
HibernateSessionFactory s=null;
PersistenceManager s1=null;
public String execute() throws Exception ...{
s1.setHibernateSessionFactory(s);
System.out.println(s1);
System.out.println(s);
return NONE;
}
}
import java.util.Map;
import com.opensymphony.webwork.interceptor.SessionAware;
import com.opensymphony.xwork.ActionSupport;
public class TestIOC extends ActionSupport implements HibernateSessionFactoryAware,PersistenceManagerAware ...{
public void setPersistenceManager(PersistenceManager persistenceManager) ...{
this.s1=persistenceManager;
}
public void setHibernateSessionFactory(HibernateSessionFactory hibernateSessionFactory) ...{
this.s=hibernateSessionFactory;
}
HibernateSessionFactory s=null;
PersistenceManager s1=null;
public String execute() throws Exception ...{
s1.setHibernateSessionFactory(s);
System.out.println(s1);
System.out.println(s);
return NONE;
}
}
运行action可以看到,HibernateSessionFactory已经注入了
后记:Webwork只提供了接口注入,而Sprin框架还提供了set注入和构造注入,希望webwork以后会改进
Webwork2.4似乎在ioc方面有很很大的变动,我在2.4上没有调试通过,我发现lifecycle包有了变动,至于2.4
如何,我也没有继续研究,没有必要,现在ioc基本都是spring的天下,如果有朋友在2.4上有了进展,请通知
我啊 ,谢谢了
- 使用Webwork实现IOC
- WebWork IoC 特性使用
- WebWork中实现IoC(4)
- WebWork中实现IoC(4)
- 在WebWork中实现IoC(1)
- 在WebWork中实现IoC(2)
- 在WebWork中实现IoC(3)
- WebWork中实现IoC(5) (完)
- 在WebWork中实现IoC(2)
- WebWork中实现IoC(5) (完)
- 在WebWork中实现IoC(3)
- WebWork中的IOC
- 使用Webwork 2.2.4实现文件上传
- 使用Webwork 2.2.4实现文件上传
- 关于webwork的IOC容器
- 使用注解实现IoC
- 使用Webwork Iterator实现表格行颜色间隔
- WebWork实现文件上传
- 设计模式之Chain of Responsibility(职责链)
- 设计模式之Strategy(策略)
- 设计模式之Template
- 设计模式之Observer
- 设计模式之Command
- 使用Webwork实现IOC
- 用haskell实现select的timeout(待解决)
- Epigrams on Programming --Alan J. Perlis
- JS图像处理A
- 中了Viking,抓到CONFIG.EXE,NTDLL32.dll,webpnt.exe等
- 让RadASM支持中文
- TREEVIEW的选择判断
- vs2005常用快捷键
- AJAX实践DWR篇