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

 

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

 

1.       OOD

2.       DAO, Spring DI初步

3.       Service DAO焊接

4.       Struts

5.       Struts Service焊接

 

 

一.   一切都是对象,所以在实例中遍布对象!数据库也是根据对象来设计的,虽然示例中只有一个对象,但结合DAO就会发现,其实这个程序是没有的概念的.

二.   所有的数据访问都是通过DAO来操作,业务与数据库没有任何关系.DAO通过SpringIOCDI进行无缝焊接.一下代码说明了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取得数据,这两个层依然通过SpringIOC容器和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应用的接口,那就是WebApplicationContextUtilsContextLoaderListener.

如果在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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值