您的位置:首页 > 编程语言 > Java开发

Spring + Struts 完整J2EE三层架构开发测试

2007-02-12 10:12 441 查看
Spring + Struts 完整J2EE三层架构开发测试

1. OOD
2. DAO, Spring DI初步
3. Service 与DAO焊接
4. Struts
5. Struts 与 Service焊接

一. 一切都是对象,所以在实例中遍布对象!数据库也是根据对象来设计的,虽然示例中只有一个对象,但结合DAO就会发现,其实这个程序是没有”表”的概念的.
二. 所有的数据访问都是通过DAO来操作,业务与数据库没有任何关系.DAO通过Spring的IOC和DI进行无缝焊接.一下代码说明了DAO与数据源的依赖关系
由于com.zhaoda.test.spring.dao.impl.PeopleDaoImpl继承了
org.springframework.jdbc.core.support.JdbcDaoSupport
所以, PeopleDaoImpl需要一个DataSource或者一个JdbcTemplate(这个是Spring框架中的类)
一下XML显示了依赖注入的配置.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 初始化一个数据源,因为这里设计的数据库操作需要用到,这里通过JNDI初始化一个对象 -->
<bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/test"></property>
</bean>
<!-- DAO依赖于数据源 -->
<bean id="peopleDao"
class="com.zhaoda.test.spring.dao.impl.PeopleDaoImpl">
<!-- 这里给DAO注入数据源 -->
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
</beans>
三. 业务层处理所有的业务数据,它通过DAO取得数据,这两个层依然通过Spring的IOC容器和DI协调完成.
由前面一点看到,依赖注入就是这么简单,但是它是根据什么来注入的呢?业务层依赖DAO是最好的说明
先看Java代码

public class TestServiceImpl implements TestService {

private PeopleDao dao;

/**
* @return the dao
*/
public PeopleDao getDao() {
return dao;
}

/**
* @param dao
* the dao to set
*/
public void setDao(PeopleDao dao) {
this.dao = dao;
}

/**
*
* @see com.zhaoda.test.spring.service.TestService#add(com.zhaoda.test.spring.vo.People)
*/
public int add(People p) {
PeoplePo po = new PeoplePo();
po.setAge(p.getAge());
po.setName(p.getName());
return dao.add(po);
}
……
}
以上代码中,除了一个业务方法外,其它的就是一个严格按照JavaBean的规范写的.Spring就是根据set/get方法来对相应的属性注入值.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="testService"
class="com.zhaoda.test.spring.service.impl.TestServiceImpl">
<!-- DAO的初始化就是前面的代码定义的.这里依赖DAO -->
<property name="dao">
<ref local="peopleDao" />
</property>
</bean>
</beans>
从以上两个XML中可以看出,Spring配置的就是Bean,它是根据id属性来标识一个bean的,正常的bean还有一个class属性,表示由哪个类来产生实例.使用WebApplicationContext.getBean(String name)得到bean对象
四. Struts是目前应用最广的开源MVC框架,虽然已经暴露很多缺点,但由于其入门门槛低,以及它成熟的技术,依然受到开发者的青睐.
说白了吧,Struts最终也只是一个Servlet,只是这个Servlet后面的事情太复杂了.
说它是Servlet因为它在web.xml中是如下配置的
<servlet>
<servlet-name>struts</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>struts</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
但其实,只是这样配置了并不能使用Struts,它还需要config中指定的另一个配置文件/WEB-INF/struts-config.xml,这个就是Struts的核心配置文件,
一个Action的定义如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
<action-mappings>
<action path="/people" type="com.zhaoda.test.struts.action.TestAction" >
<forward name="edit" path="/people.jsp"></forward>
<forward name="findAll" path="/all.jsp"></forward>
</action>
</action-mappings>
</struts-config>
在自定义的Action中,通过ActionMapping. findForward(String name)来跳转到forward指定的path
五. Struts只是一个控制器,它本身没有任何的业务逻辑,并且为了搞扩展性和可移植性,所以不能直接把Service层和Struts耦合,因此,Spring提供了专门应用于WEB应用的接口,那就是WebApplicationContextUtils和ContextLoaderListener.
如果在WEB中需要使用,最好的方法是在web.xml中配置如下代码
<context-param>
<!-- Spring 的配置文件 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext*.xml</param-value>
</context-param>
<!-- Spring 配置文件载入监听器 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
然后在使用ServletContext来得到WebApplicationContext,在Struts中有如下代码初始化WebApplicationContext:
private WebApplicationContext context = null;

/**
*
* @see org.apache.struts.action.Action#setServlet(org.apache.struts.action.ActionServlet)
*/
public void setServlet(ActionServlet servlet) {
context = WebApplicationContextUtils
.getRequiredWebApplicationContext(servlet.getServletContext());
}
然后使用getBean(String name)得到Bean对象,例如:需要得到前面配置的 testService ,那么只需要像这个代码:
private WebApplicationContext context = null;

/**
*
* @see org.apache.struts.action.Action#setServlet(org.apache.struts.action.ActionServlet)
*/
public void setServlet(ActionServlet servlet) {
context = WebApplicationContextUtils
.getRequiredWebApplicationContext(servlet.getServletContext());
}
Object o = context.getBean(“testService”);
//然后强制转型成对应类型就OK了.
由于博客不支持附件,所以需要代码的朋友请到java_fancy@163.com下载附件,密码是: new_java
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: