Struts2中用Spring实现IoC

最近一直通过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" />

因此也就无需重复声明了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值