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>我们还要修改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了创建组件接口:
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();
}
实现类:
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();
}
}

}
创建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定义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>
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;
}
}
运行action可以看到,HibernateSessionFactory已经注入了
后记:Webwork只提供了接口注入,而Sprin框架还提供了set注入和构造注入,希望webwork以后会改进
Webwork2.4似乎在ioc方面有很很大的变动,我在2.4上没有调试通过,我发现lifecycle包有了变动,至于2.4
如何,我也没有继续研究,没有必要,现在ioc基本都是spring的天下,如果有朋友在2.4上有了进展,请通知
我啊 ,谢谢了
2022

被折叠的 条评论
为什么被折叠?



