4、分离业务逻辑
l Action应该只负责画面迁移的控制,而业务逻辑的具体细节应该封装到业务层,Action只要调用业务接口就行了
l 这里将Action中的业务逻辑移到业务类中,并使用Spring的Bean机制进行管理
(1)创建业务接口和业务类
l 业务接口
public interface UserService {
public boolean isUserValid(String userid, String password);
}
l 业务类
public class UserServiceImpl implements UserService {
public boolean isUserValid(String userid, String password) {
return "123456".equals(password);
}
}
(2)追加Spring能力
l 右击Samples工程,MyEclipse -> Add Spring Capabilities:

l 为了减少不需要的jar文件发布到工程中,这里指向BuildPath追加Spring2.0 Core Libraries,其他需要的jar文件手工追加:
Ø spring-aop.jar
Ø spring-dao.jar
Ø spring-remoting.jar
Ø spring-struts.jar
Ø spring-support.jar
Ø spring-web.jar
(3) 修改struts-config.xml
l 使用Spring的代理RequestProcessor替代Struts缺省的RequestProcessor:
<controller
processorClass="org.springframework.web.struts.DelegatingRequestProcessor" />
l 注册Spring的Struts Plugin,指定Bean配置文件路径:
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/classes/org/xqtu/samples/bean/samples-services.xml,
/WEB-INF/classes/org/xqtu/samples/bean/samples-actions.xml" />
</plug-in>
l Spring支持多Bean配置文件,这里按功能层次在不同Bean文件中定义
(4) 定义Bean文件
l samples-services.xml
<bean id="userService"
class="org.xqtu.samples.service.impl.UserServiceImpl">
</bean>
l samples-actions.xml
<bean name="/login"
class="org.xqtu.samples.web.action.LoginAction">
<property name="userService" ref="userService" />
</bean>
l 注意,name属性的值要和struts-config.xml中Action的path属性相同
(5) Action类注入业务接口
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
l 注意,这里定义是UserService接口,而Bean文件中定义的是实现类UserServiceImpl
(6) 修改Action类,调用业务方法
if (userService.isUserValid(loginForm.getUserid(), loginForm
.getPassword())) {
request.setAttribute("userid", loginForm.getUserid());
return mapping.findForward("success");
}
(7) 显示Spring的Log信息
l 为了在控制台显示Spring的Log信息,可以在src目录下追加log4j.properties:
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p %c - %m%n
log4j.rootLogger=INFO, stdout
log4j.logger.org.springframework=DEBUG