`

Struts调用Spring服务类的三种方法

阅读更多
  用SSH做了几个项目,现在总结一下Struts Action中调用Spring Service的方法,大家有好的实现,请继续补充:

  1.老爸操持型
    这种类型,即是在BaseAction中提供一个getBean(String beanName)的父类方法,业务Action 在需要Serivce时,调用父类的getBean()得到Object型的Service,再Cast。
   e.g.
  public class BaseAction extends DispatchAction
  {
     ... 
     public Object getBean(String name)
    {
        if (ctx == null)
        {
            ctx = WebApplicationContextUtils
                  .getRequiredWebApplicationContext(servlet.getServletContext());
        }
        return ctx.getBean(name);
    }
  }


  2.自已动手型
   自己动手 丰衣足食,再加了自从有了IoC,所谓动手也只是衣来后的伸手和饭来后的张口。自己动手型,即是利用Spring的IoC,将IoC容器中的Service注入到Action中,当然Action需要提供注入服务有setter.
   如果采用这种方式,首先需要让Spring接管Struts,然后在Spring配置文件中,配置Action的注入属性。
   首先.在struts-config.xml将Spring引狼入室。
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> 
        <set-property property="contextConfigLocation" 
                                  value="/WEB-INF/action-servlet.xml" 
        /> 
</plug-in> 

  然后,Struts再向Spring投怀送抱:
<bean id="userService" class="com.nic.service.UserServiceImpl">
    <property name="userDao">
	<ref bean="userDao" />
    </property>
</bean>	
<bean name="/userAction" class="com.stamen.web.UserAction">
   <property name="userService" ref="userService"/>
</bean>
   
   聪明的你一下就看出“/userAction ”即是com.stamen.web.UserAction在Struts中的配置名。
 
3.朋友帮忙型  朋友多了好办事,凡事都自己动手总有一天会活活累死,所有Action为自己需要的Service提供setter,并且在Spring中注入,好累啊。小学生都在减负了,我们也来为Action减减负吧--提供一个专门
查找Serivice的ServiceLocator,负责获取所有的Service,该类为每个Service提供专门的获得方法,如:
  public class ServiceLocator
{
    private static ApplicationContext factory = null;
    public static void init(ApplicationContext ctx)
    {    
        factory = ctx;
    }
    public static LogService getLogService()
    {
        return (LogService) ServiceLocator.getBean("logService");
    }

    public static UserService getUserService()
    {
        return (UserService) ServiceLocator.getBean("userService");
    }
    public static PieeService getPieeService()
    {
        return (PieeService) ServiceLocator.getBean("pieeService");
    }
    public static PieeGrid getPieeListService()
    {
        return (PieeGrid) ServiceLocator.getBean("pieeListService");
    }
    ...
 } 


    Action要用哪个Serivce时,直接通过ServiceLocator.getXxxService()就可以获得了,省去了
“老爸操持型”指定Service 名和Cast的繁琐,比在Spring中IoC来IoC去也来得省心省力。
   
   下面做一个自己的分析小结:
1.“老爸操持型” 将serviceName分散到代码中,到时配置文件中serviceName一改,得牵一毛而动全身->维护性差;且要进行Cast转换,怎一个繁字了得。
2.“自己动手型”也不好,不但在Action中要添加get/setXxxService代码,而且还要在Struts和Spring的配置文件中做好群众的大串连工作,难道我们的配置还不够多吗?吃回香豆的,你别又跳出来啊:)
3.“朋友帮忙型”,目前,我认为是比较好的方式,ServiceLocator象一个服务周到,工作到位的房产“中介”,我们要租房子 何必满街跑啊?TMD 这个月我又交了3K房租,也不知道李大伦,李金宝之流规矩后,房价能不能降些,我想有个蜗牛的家 已经唱了好几年了--跑题了,睡觉去了:)
 
分享到:
评论
12 楼 h819 2006-09-17  
支持楼主!不论合理与否,挥棒子打击人不对!
11 楼 java虫 2006-09-17  
我一直在用第一种方法,感觉service的名字不会经常改。
10 楼 quickselect 2006-09-17  
三种方法各有千秋。
9 楼 downpour 2006-09-16  
嗨~~  本来不想再说啥了,既然你喋喋不休,我也再说两句。

userDAO访问两个数据库,本身就针对了两个userDAOImpl,两个sessionFactory。此时你居然可以只设计一个接口?我不懂了,假设你这个接口中有个getUserByName,针对的是DB1。你的UserDAOImpl1实现了这个函数,UserDAOImpl2实现这个函数的时候你写的啥?

退一步,byType可以解决绝大多数问题,类似多个实现的情况,一般byName会起到作用。如果针对两个不同的实现,你都要取同样的名字,那我实在是无话可说了。

PS. 不晓得你哪里看到我说过粗话?如果找不到,请修改你的言语。
8 楼 stamen 2006-09-16  
downpour 写道
偶实在还是不能理解在大家使用同一个接口时,需要啥交流?

    我来给你举两个例子,同样的一个UserDao接口,该UserDao需要访问两个DB,所以在Spring中会配置两个,一个叫userDao1 访问DB1,另一个叫userDao2 访问DB2,这时,如果你用byType难道还不要交流吗?
    另一个例子,我有两个JavaMailSender,一个叫sender1用于发送系统的Mail,另一个叫sender2,用于发送业务的Mail(所用的邮件服务器,用户密码均不一样),需要注入JavaMailSender的服务类,直接用byType还能成吗?
    在大型的系统中,并非一个接口只会在IoC中出现一次,这两个例子,目前我的系统都有出现,所以我才会说byType和byName是不适合在大型系统中用的。
7 楼 ithero 2006-09-16  
各有千秋吧,无论是byName,byType还是用autowire...等等,虽然简化了自己写配置文件的时间,但是条理不清晰,不方便测试,重构代码的时候要求注入的对象名还不能变,一变就挂了,至于楼主所说的三种方法,我常用第二种,第三种也要写死呀,还不如配置文件算了,反正写一句也是写
6 楼 stamen 2006-09-16  
downpour 写道
和此人无法交流了。

哪位老大来给他讲讲啥叫byType。偶实在还是不能理解在大家使用同一个接口时,需要啥交流?

  看来Downpour最近心情不好,首先是叫我学习IoC,然后再开口讲话,现在又要叫大家给我上ByType的课,对我进行学前教育。你心情不好,大家都可以理解,但没有必须动不动就暴粗口,影响美好氛围的同时,也并不会有利于你心情的好转
5 楼 downpour 2006-09-16  
和此人无法交流了。

哪位老大来给他讲讲啥叫byType。偶实在还是不能理解在大家使用同一个接口时,需要啥交流?
4 楼 stamen 2006-09-16  
引用
autowire提供了多种方式,byName,byType等等,我不清楚你所说的“模糊了配置的清晰度”是啥意思,也不清楚你所说的大型项目中,需要充分沟通和协调的项目是什么样的项目?到底需要那些默认契约?我们所有的项目都在用autowire,好像没有听说有什么默认契约嘛。

    byName时契约就是属性名和Bean名必须相同,byType时契约就是属性类型和Bean类型必须相同,Spring又不是神仙,它哪里知道你的心理想什么,还不是根据这些契约或说协议来自动装配的。
     但是这种装配,你得在命名上小心谨慎,否则可以就把该装配的没有装配上,不该装配的装配进去了。
一个大项目的Service ,Dao数量是很大的,很容易就张冠李戴,弄巧成拙了。此外,大项目有多个开发人员同时做,在命名时就要约定好,否则,Bean的属性名得遵照规矩走,难道这不是沟通成本吗。
3 楼 downpour 2006-09-16  
三种都是方法,在评价哪个好,哪个不怎么好的时候,每个人有不同的标准。我的标准就是我的Java代码尽量不要依赖于Spring的代码进行测试。这也是引入Spring的ApplicationContext对你的Bean进行管理的原因,你的业务逻辑代码将不依赖于容器。

stamen 写道

autowire是个不错的东西,可以省除Spring中部分的配置
信息,但是凡事有得必有失,它是以规范命名和默认契约为前提的。它一方面减少配置,一方面有模糊了配置的清晰度,一般情况下,在小型的项目或测试时可以使用,在大型的项目,需要充分沟通和协调的项目里,autowire并不推荐使用。


autowire提供了多种方式,byName,byType等等,我不清楚你所说的“模糊了配置的清晰度”是啥意思,也不清楚你所说的大型项目中,需要充分沟通和协调的项目是什么样的项目?到底需要那些默认契约?我们所有的项目都在用autowire,好像没有听说有什么默认契约嘛。


2 楼 stamen 2006-09-16  
downpour 写道
什么是注入?你有看到Spring的IoC依赖于Spring的代码嘛?再想想再评论。

   我并没有说Action依赖于Spring,“自己动手型”时,每个需要用到Service的Action需要提供Service的get/setter方法,并且在Struts和Spring的配置文件中都需要设置,毕竟带了挺多的工作。此外还将Action的类变得更不清晰。
 
downpour 写道
Spring2.0提供了autowire的注入方式,值得借鉴,我已经开过一贴,论坛中搜索一下。

   autowire是个不错的东西,可以省除Spring中部分的配置
信息,但是凡事有得必有失,它是以规范命名和默认契约为前提的。它一方面减少配置,一方面有模糊了配置的清晰度,一般情况下,在小型的项目或测试时可以使用,在大型的项目,需要充分沟通和协调的项目里,autowire并不推荐使用。
1 楼 downpour 2006-09-16  
什么是注入?你有看到Spring的IoC依赖于Spring的代码嘛?再想想再评论。

Spring2.0提供了autowire的注入方式,值得借鉴,我已经开过一贴,论坛中搜索一下。

相关推荐

    struts和spring的三种整合方法

    ### Struts与Spring的三种整合方法详解 在Java企业级应用开发中,Struts和Spring是两个非常重要的框架。Struts作为MVC架构的一种实现,主要用于构建web应用程序的表示层,而Spring则提供了依赖注入(DI)和面向切面...

    Struts,Spring登陆

    表单的提交动作会指向Struts的Action,该Action会调用Spring管理的业务层服务进行验证。 3. **业务逻辑**:在Spring中,我们可以创建一个UserService接口及其实现类,用于处理登陆验证。这个服务类可能会调用DAO...

    Struts+spring+mybatis

    Struts、Spring 和 MyBatis 是Java开发领域中三大著名框架,它们的组合常被称为SSM框架,用于构建高效、可扩展的企业级Web应用程序。在这个项目中,它们被用来实现一个基本的增删改查(CRUD)功能,这是任何数据库...

    Struts2 Spring Jpa 配置测试

    Struts2、Spring和JPA是Java开发中常用的三大框架,它们在企业级应用开发中发挥着关键作用。Struts2作为MVC框架,负责控制应用程序的流程;Spring框架则是一个全面的后端解决方案,提供了依赖注入(DI)、面向切面...

    struts+spring的一个简单项目

    在"struts+spring"的集成项目中,通常会有一个Spring配置文件(如:applicationContext.xml),用于定义bean,包括Action类、Service类和DAO类。这些bean可以通过Struts的ActionContext获取到,以便在Action中使用。...

    struts2+spring4+hibernate

    Struts2、Spring4和Hibernate是Java开发中的三大框架,它们在构建企业级Web应用程序时起着核心作用。本教程将深入探讨这三个框架如何协同工作,以实现高效、灵活和可扩展的电子商务平台。 首先,Struts2是一个基于...

    SSH整合源码(Struts+Spring+Hibernate整合用户注册例子)

    8. **用户注册流程**:用户提交注册信息后,Struts的Action接收到请求,通过Spring的依赖注入获取到业务服务类,业务服务类再调用DAO(数据访问对象)完成数据的持久化。同时,Spring可以管理事务,确保注册过程中...

    struts+spring+ibatis的Demo

    Struts、Spring和iBatis是Java开发领域中三大经典的开源框架,它们分别负责MVC模式中的动作控制、依赖注入以及数据库操作。这个"struts+spring+ibatis的Demo"压缩包文件提供了这三个框架集成使用的示例代码,旨在...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    1.4.8 RMI(远程方法调用) 1.4.9 JMS(Java消息服务) 1.4.10 JMX(Java分布式管理) 1.4.11 JACC(Java容器授权合同) 1.4.12 JCA(Java连接器体系) 1.5 小结 第二章 MVC模式介绍 2.1 MVC模式概述 2.1.1 MVC模式...

    Struts Spring Hibernate整合实践.doc

    标签的实现类需要继承自Struts2的标签基类,并调用Spring服务层的方法获取所有用户数据,然后在JSP页面中使用这个标签来显示。 在实际开发中,还需要关注事务管理、异常处理和安全性等方面。Spring提供了强大的事务...

    struts2+Spring2.5+Spring3.2)实现登录.

    - **登录逻辑处理**:当用户提交登录信息后,由Struts2转发至Spring管理的业务逻辑层进行处理,通过调用UserDAO的findUserByNameAndPass方法来验证用户身份。 - **错误处理**:对于登录失败的情况,需要捕获异常并给...

    Struts+Spring+Hibernate整合教程.pdf

    Struts、Spring和Hibernate是Java开发中非常经典的三大框架,它们各自在Web应用程序开发的不同层面发挥着重要作用。Struts提供了MVC(Model-View-Controller)设计模式的实现,Spring作为一个全面的轻量级框架,提供...

    Struts,Spring,Hibernate三大框架的面试&笔试题

    如果需要验证,ActionForm的validate方法会被调用。Action处理完业务逻辑后返回ActionForward,控制页面跳转。Struts1的核心在于提供了一个清晰的分层结构,使得开发者能够更好地分离视图、控制和模型。 【Spring】...

    struts2 spring hibernate integration

    Struts2、Spring和Hibernate是Java开发中三大重要的开源框架,它们各自负责Web应用的不同层面。Struts2作为MVC框架处理HTTP请求和视图展示,Spring提供了依赖注入(DI)和面向切面编程(AOP),以及服务层管理,而...

    struts+spring+hibernate

    在SSH项目中,开发者通常会创建Action类来处理特定的业务逻辑,这些Action类由Struts框架调用,然后Spring管理这些Action类的生命周期和依赖关系。同时,Hibernate会通过SessionFactory和Session接口来建立与数据库...

    struts+spring+hibernate ssh框架一个实例

    在SSH整合中,Spring作为业务逻辑的核心,可以管理和调用DAO(数据访问对象),同时负责控制流程的跳转,以及提供Spring MVC来替代部分Struts的功能。 Hibernate是一个强大的ORM(对象关系映射)框架,它可以将Java...

    SSH(Struts+Spring+Hibernate)结合项目简单实例

    SSH(Struts+Spring+Hibernate)是Java Web开发中一种常见的技术栈,它将MVC设计模式、依赖注入和持久层框架集成为一个整体,大大提高了开发效率和代码的可维护性。下面我们将深入探讨SSH框架的各个组成部分及其结合...

    struts+spring+hibernate源代码

    Struts、Spring和Hibernate是Java开发中非常著名的三个开源框架,它们共同构成了SSH(Struts、Spring、Hibernate)集成框架,被广泛应用于企业级Web应用的开发中。这个压缩包文件"SSH"提供了这三个框架的源代码,让...

    struts+spring+ibatis框架集合教程

    Struts、Spring和iBatis是Java开发中常用的三大开源框架,它们各自专注于应用程序的不同层次:Struts处理表现层逻辑,Spring提供全面的依赖注入和事务管理,而iBatis则负责数据访问层的工作。本教程集合了这三者的...

    Struts+Spring+Hibernate快速入门

    Struts+Spring+Hibernate 整合是开发Java Web应用程序的一种常见模式,也称为SSH框架。这个框架组合提供了从前端到后端的完整解决方案,适用于构建三层架构的应用程序。以下是关于这个话题的详细说明: 1. **Struts...

Global site tag (gtag.js) - Google Analytics