`
Classicning
  • 浏览: 253673 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Struts2中用Spring实现IoC

    博客分类:
  • Tech
阅读更多
最近一直通过WebWork in Action来学习Struts2,发现WebWork中相关的IoC容器类已经被删去了。原来由于使用Spring的IoC容器的用户更多,所以从WebWork2.2开始,他们就删去了自己的IoC功能,转而支持Spring。Struts2也继承了这一特点。

Spring的IoC是一种资源管理的方法,有助于将具体实现和接口分离,从而实现解耦合。当实现接口的类改变时,不需要在其他类中修改相关接口的初始化,只要修改一个XML文件即可。

要在Struts中使用IoC,我们需要导入以下类库
  • struts2-core-2.0.8.jar
  • xwork-2.0.3.jar
  • struts2-spring-plugin-2.0.8.jar
  • spring-beans.jar
  • spring-context.jar
  • spring-core.jar
  • spring-web.jar

首先修改web.xml文件,增加一个监听器:

    <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>


接下来可以创建一个我们需要功能的接口

package com.classicning.struts2.service;

import com.classicning.struts2.role.User;

public interface ILoginService {
  
  public boolean login(User user);

}

这个接口定义了一个布尔型的登录验证功能,登录验证成功返回true。

接下来创建一个默认的实现,它通过与一组因硬编码的信息对比验证用户信息。(这个显然是不合适的,这么做只是举一个简短的例子而已)

package com.classicning.struts2.service;

import com.classicning.struts2.role.User;

public class LoginServiceHardCoded implements ILoginService{
  @Override
  public boolean login(User user){
    boolean loginable = false; 
    if (user.getUsername().equalsIgnoreCase("admin") && user.getPassword.equals("tomcat123")){
      loginable = true;
    }
    return loginable;
  }

}


创建LoginAction,使用这个LoginService的功能。这里提供了setILoginService方法,IoC容器将会调用这个方法,将适当的实现类注入。因此LoginAction中就不需要声明ILoginService的实现,当LoginService的实现改变时(比如变成LoginServiceXML,LoginServiceDB),就不需要对LoginAction进行任何修改。

package com.classicning.struts2.actions;

import com.opensymphony.xwork2.ActionSupport;

import com.classicning.struts2.service.ILoginService;

public class LoginAction extends ActionSupport {
  
  private static final long serialVersionUID = 1L;
  private String message;
  private User user;
  private ILoginService service;
  
  @Override
  public String execute(){
    
    if(!service.login(user)){
      addFieldError("user.password",getText("login.wrong"));
      return LOGIN;
    }
    
    message = getText("login.hello");
    message += getText("login.showname")+":"+user.getUsername();
    return SUCCESS;
  }

  public String getMessage() {
    return message;
  }

  public void setService(ILoginService service){
    this.service = service;
  }
  
  public void setUser(User user){
    this.user = user;
  }

}


在WEB-INF中创建applicationContext.xml,进行配置

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns ="http://www.springframework.org/schema/beans" 
    xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" >
    
  <bean id="loginService" class="com.classicning.struts2.service.LoginServiceHardCoded"/>
  
  <bean id="loginAction" class="com.classicning.struts2.actions.LoginAction" scope="prototype">
    <property name="service">
      <ref local="loginService"/>
    </property>
  </bean>
</beans>

loginAction的scope被配置为prototype,在每个请求中都要创建新实例;而loginService为默认设置,将仅保存一个实例。

最后配置Struts.xml,配置action

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
  <package name="com.classicning.struts2" extends="struts-default" namespace="/">
    <action name="login" class="loginAction">
      <result name="success">hello.jsp</result>
      <result name="input">index.jsp</result>
    </action> 
  </package>
  
</struts>

唯一需要注意的是class属性中,需要填入的是在spring的配置中bean的id,而不是类的位置。

这样就可以进行测试了。而在关于是否要修改properties文件的问题上,其实在struts2-spring-plugin-2.0.8.jar的struts-plugin.xml中已经包含了这样一句:

    <constant name="struts.objectFactory" value="spring" />

因此也就无需重复声明了。
分享到:
评论

相关推荐

    struts2帮助文档

    struts2中用Spring实现IOC struts2中的零配置与IOC struts2介绍之使用连接标签 struts2入门 struts2进阶学习一 struts2进阶学习二 struts2进阶学习三 struts2进阶学习四 struts2进阶学习一 struts2进阶学习一 struts...

    Struts2 chm文档

    5.Struts2中用Spring实现IoC.doc 6.Struts2中的零配置与CoC(Convention over Configration).doc 7.Struts2介绍之使用链接标签.doc 8.Struts2入门.doc 9.Struts2学习进阶(基础篇1-7) 10.Struts2学习进阶(实例篇1...

    Struts2.0中文教程权威版

    Struts 2权威指南——第1章 Struts 2概述.doc Struts 2权威指南——第2章 Struts 2下的...Struts2中用Spring实现IoC.doc Struts2中的零配置与CoC(Convention over Configration).doc Struts2介绍之使用链接标签.doc

    Struts2入门宝典

    依赖注入(Inversion of Control,简称IoC)是Struts2中实现对象管理的一种模式。通过使用Spring框架,Struts2可以实现Action和其他组件的依赖注入,使得代码更加模块化和易于测试。 ### Struts2标签 Struts2提供...

    SSH框架整合中用到的jar包

    SSH框架,全称为Struts2、Spring和Hibernate的集成,是Java Web开发中常见的三大开源框架的组合。这个框架组合提供了强大的MVC(Model-View-Controller)设计模式支持,数据库操作,以及依赖注入等功能,大大提高了...

    mycrm中用到的包2

    Spring的IoC容器可以方便地管理和配置Struts1.x中的Action和Service类。 3. **Hibernate**: Hibernate是一个持久化框架,它简化了Java应用与数据库之间的交互。在mycrm中,Hibernate可能被用来映射Java对象到...

    16.spring与springmvc常见面试题.docx

    2. Spring 中 IOC 的作用与原理? 答:IOC--Inversion of Control 控制反转。当某个角色需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例对象。但在 Spring 中创建被调用者...

    demo02源代码

    Struts2负责控制器层,Spring处理依赖注入和事务管理,而Hibernate则作为ORM工具,实现了Java对象和数据库表之间的映射。 通过学习这些源代码,我们可以掌握如何配置Struts2的Action类,定义结果类型,以及使用OGNL...

    SSH框架面试题.pdf

    40. **在SSH环境中用Spring代替Struts的ActionServlet的优势是什么?** 使用Spring可以提供更好的依赖管理和事务管理功能。此外,Spring的MVC框架相比Struts提供了更多的灵活性和更好的性能表现。 #### 高级问题...

    ssh需要的jar包

    7. cglib和asm:用于创建运行时的代理类,Spring AOP中用到。 在实际开发中,`JARALL`这个压缩包可能包含了所有这些所需的JAR文件,开发者需要将它们添加到项目的类路径中,以便正确地运行和构建SSH应用程序。同时...

    企业在线培训与知识竞赛系统设计与实现

    具体到实现的框架,文中提到了Struts2、Spring和Hibernate。Struts2是一个用于Java EE的web应用框架,它通过采用MVC(模型-视图-控制器)设计模式来分离界面层、控制层和业务逻辑层,从而提高系统的可维护性和可扩展...

    实习日记34篇(我的实习日记)

    9. Java Web 编程开发中用到的技术:作者学习了 Java Web 编程开发中用到的技术,包括 Struts、Spring、Hibernate 等开源框架,了解了它们之间的关系和应用。 10. 实习中的心态变化:作者通过实习的过程中,了解了...

    个人简历中如何写项目经验.doc

    业务层封装业务流程,为适应业务的变更,每一业务模块均有专门的接口及实现类,利用 spring 的 ioc 功能将实现类注入给表现层的 action;数据访问层借助于 hibernate 实现,代码简洁且可适应不同的数据库。事务部分...

    WEB开发常用JAR包

    Spring提供了一个IoC(控制反转)容器,用于管理对象的生命周期和依赖关系。此外,它还支持AOP(面向切面编程),使得日志、事务管理等通用功能得以模块化。Spring MVC是其Web开发部分,提供了模型-视图-控制器架构...

    最新Java面试宝典pdf版

    20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. 软件工程与设计模式 126 1、UML方面 126 2、j2ee常用的设计模式?说明工厂模式。 126 3、开发中都用到了那些设计...

    Java面试宝典-经典

    20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 八. 软件工程与设计模式 126 1、UML方面 126 2、j2ee常用的设计模式?说明工厂模式。 126 3、开发中都用到了那些设计...

    Java面试宝典2012版

    一. Java基础部分 7 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 ...20、什么是spring的IOC AOP 126 21、STRUTS的工作流程! 126 22、spring 与EJB的区别!! 126 ...

    java面试宝典2012

    20、什么是spring的IOC AOP 137 21、STRUTS的工作流程! 137 22、spring 与EJB的区别!! 137 八. 软件工程与设计模式 138 1、UML方面 138 2、j2ee常用的设计模式?说明工厂模式。 138 3、开发中都用到了那些设计...

Global site tag (gtag.js) - Google Analytics