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

    技术2022-05-11  56

     

    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


    最新回复(0)