`
Classicning
  • 浏览: 255811 次
  • 性别: 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版)

    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