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

    最新Java面试宝典pdf版

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

    Java面试宝典2010版

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

    Java面试笔试资料大全

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

    JAVA面试宝典2010

    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、开发中都用到了那些设计...

    Java面试宝典2012新版

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

    Java 面试宝典

    2、Java 有没有 goto? ....................................................................................................... 8 3、说说&和&&的区别。 ......................................................

Global site tag (gtag.js) - Google Analytics