struts主要提供视图层面的实现,spring结合IBAT实现业务层和数据库访问的方法。
下面是Facae设计模式实现的具体方法:
1:定义一个BASEACTION ,其他struts调用的ACTION都继承该类
BASEACTION主要特点是定义一个私有对象变量petStore,在setServlet方法中通过spring实例划所有BEAN(DAO)
public void setServlet(ActionServlet actionServlet)//在每个ACTION 第一次创建时执行,所以继承该类的方法都会执行
{
super.setServlet(actionServlet);
if(actionServlet != null)
{
javax.servlet.ServletContext servletContext = actionServlet.getServletContext();
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
petStore = (PetStoreFacade)wac.getBean("petStore");//执行这里spring会加载实例化petStore的相关 //DAO
}
}
protected PetStoreFacade getPetStore()继承该类的ACTION 通过该方法来得到私有变量petStore,在通过 接口的方式引用各种具体的业务方法。
{
return petStore;
}
private PetStoreFacade petStore;
2:一个接口PetStoreFacade定义所有跟数据库操作的方法定义
3:一个具体类PetStoreImpl通过各种DAO的具体实现来实现接口PetStoreFacade中的数据库操作方法
public List getOrdersByUsername(String username)
{
return orderDao.getOrdersByUsername(username);///通过接口引用具体DAO中的方法
}
private AccountDao accountDao;///定义所有用到的DAO接口
private CategoryDao categoryDao;
private ProductDao productDao;
private ItemDao itemDao;
private OrderDao orderDao;
}
.
.
4:一每个表都定义了一个DAO接口,和该接口的具体数据库实现DAO类
public interface AccountDao/s//DAO接口下所有数据库操作
{
public abstract Account getAccount(String s)
throws DataAccessException;
public abstract Account getAccount(String s, String s1)
throws DataAccessException;
public abstract void insertAccount(Account account)
throws DataAccessException;
public abstract void updateAccount(Account account)
throws DataAccessException;
public abstract List getUsernameList()
throws DataAccessException;
}
public class SqlMapAccountDao extends SqlMapClientDaoSupport//DAO接口实现,注意实现方法的参数 和方法名称,类型要和接口定义一致
implements AccountDao
{
public SqlMapAccountDao()
{
}
public Account getAccount(String username)
throws DataAccessException
{
return (Account)getSqlMapClientTemplate().queryForObject("getAccountByUsername", username);
}
public Account getAccount(String username, String password)
throws DataAccessException
{
Account account = new Account();
account.setUsername(username);
account.setPassword(password);
return (Account)getSqlMapClientTemplate().queryForObject("getAccountByUsernameAndPassword", account); 这里是spring 和ibat结合之处:extends SqlMapClientDaoSupport后可以通过 //getSqlMapClientTemplate()方法得到各种ibat方法
}
.
.
5:struts的ACTION部分调用业务方法
public class ListOrdersAction extends SecureBaseActionSecureBaseAction extends BaseAction
{
public ListOrdersAction()
{
}
protected ActionForward doExecute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception
{
AccountActionForm acctForm = (AccountActionForm)form;
String username = acctForm.getAccount().getUsername();
request.setAttribute("orderList", getPetStore().getOrdersByUsername(username));/这里可以说是 //struts 和spring结合之处体现,直接通过 //getPetStore()得到
return mapping.findForward("success");
}
}
6:WEB.xml中spring ,struts,ibat的配置初始化
spring:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/dataAccessContext-local.xml /WEB-INF/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
struts:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
7:spring.xml
<bean id="petStore" class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl">//Facade模式,包括所有数据库的DAO
<property name="accountDao" ref="accountDao"/>
<property name="categoryDao" ref="categoryDao"/>
<property name="productDao" ref="productDao"/>
<property name="itemDao" ref="itemDao"/>
<property name="orderDao" ref="orderDao"/>
</bean>