15.1 概述
15.1.1应用程序的分层
在前面学习了Struts2中的各个核心技术和多种组件,但是,在真正做项目的时候,Struts2只是帮我们处理Web层的日常任务和常见问题,那么,其他的部分呢?
在实际项目开发的时候,通常把程序划分成很多层次,也就是分层开发,比如大家熟悉的三层开发:表现层、逻辑层、数据层,它们的职责分别是:
- 表现层:展示数据、人机交互、收集参数并调用逻辑层
- 逻辑层:进行数据的逻辑校验、进行逻辑判断、实现业务功能、处理相关功能、处理后续流程、组织数据返回给表现层等
- 数据层:实现数据持久化、实现对象和持久化数据的双向映射等
在这三层交互的时候,通常有如下约定:
- 表现层调用逻辑层,逻辑层调用数据层,不能反向调用,也不会跨层调用。
- 层间交互应该通过接口进行调用,以确保各层实现独立变化。
图15.1 表现层、逻辑层、数据层之间的关系
Struts2就是一个表现层的框架,接下来就来看看动作类Action如何调用逻辑层组件,通过一个简单得示例来做说明,只是做出示范性质的逻辑层接口与逻辑层实现,并不实现实际的功能。示例代码如下:
- public interface SampleService {
- public String getNameById(String userId);
- }
- public class SampleServiceImpl implements SampleService{
- public String getNameById (String userId) {
- //根据userId到数据层进行查询,获取相应的name
- String name = "hello,"+ userId;
- return name;
- }
- }
接下来写一个示范性质的Action,实现根据用户输入的编号去获取用户名字的功能,Action中会先得到用户的编号,然后去调用逻辑层接口获取用户名字,将名字保存下来供下一个页面使用。示例代码如下:
- public class SampleAction extends ActionSupport{
- private String name;
- private String userId;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getUserId() {
- return userId;
- }
- public void setUserId(String userId) {
- this.userId = userId;
- }
- public String execute() throws Exception {
- SampleService sampleService = new SampleServiceImpl();
- name = sampleService.getNameById(userId);
- return SUCCESS;
- }
- }
注意:在前面讲过表现层在调用逻辑层的时候,通常应该通过接口调用。仔细看一下,这个Action代码写的符合要求吗?
Action作为表现层组件,在调用逻辑层组件的时候,只应该知道逻辑层组件的接口,也就是SampleService接口,但是在execute方法里还是出现了逻辑层组件的实现类,也就是SampleServiceImpl类,这显然是不符合要求的,那怎么办呢?
不要着急,继续往下看,其中一个优秀的解决方案就是使用Spring。
15.1.2使用Spring管理对象间的依赖关系
在上一节的示例中,SampleAction调用了SampleServiceImpl的方法,也可以这么说,SampleAction作为客户端依赖于SampleServiceImpl这个服务端。那么,该怎么管理它们之间的依赖关系呢?很显然,可以借助Spring框架来管理对象间的依赖关系。
Spring的知识很多,这里并不会详细讲解Spring的知识,只是一起来看看Struts2和Spring如何结合起来,并使用Spring框架的IoC/DI容器来管理对象之间的依赖关系。
另外,这里只讲述Spring中和Struts2相关的知识,更多Spring的知识,请参看Spring的文档或是资料。
私塾在线网站原创《研磨struts2》系列
转自请注明出处:【http://sishuok.com/forum/blogPost/list/4135.html】
欢迎访问http://sishuok.com获取更多内容