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);
}
接下来创建一个默认的实现,它通过与一组因硬编码的信息对比验证用户信息。(这个显然是不合适的,这么做只是举一个简短的例子而已)
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>
最后配置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>
这样就可以进行测试了。而在关于是否要修改properties文件的问题上,其实在struts2-spring-plugin-2.0.8.jar的struts-plugin.xml中已经包含了这样一句:
<constant name="struts.objectFactory" value="spring" />