Spring整合struts2和mybatis形成了一套web项目的后台框架架构;
在这一套架构中:
struts2负责表现层的工作;
mybatis负责数据访问层的工作;
spring负责bean的创建传递和事务的处理。
下面做一个简单的用户注册的例子来测试三者之间的整合。
本文只是说明这个架构的逻辑,并不是详细的说明各个框架部分的配置。
首先,考虑数据访问层面,也就是mybatis的工作;
创建一个dao包,用于存放操纵数据库的接口。包里面有一个UserMapper的接口,由于当前是用户注册,所以在接口中定义一个向数据库插入用户的方法。
需要注意的是,dao包是直接对数据库进行操作的包。
接口定义使用了@Repository来进行接口bean的注册,这也体现出spring的作用。
接口+xml映射器中的xml,配置的是dao包中接口的xml。
根据mybatis框架中接口+xml的配置方式,想要使用UserMapper操纵数据库还需要为UserMapper配置xml文件,设置namespace,resultmap之后,为insert方法做配置:
这里的parameterType表示UserMapper的全类名,已经为它设置了别名User,所以直接使用User即可;id对于的就是insert方法。
根据insert标签中的SQL语句,就可以对数据库进行操控,参数从传递进来的user对象中取得。
这样,调用UserMapper的insert方法就可以对数据库进行操控。
设置了直接对数据库进行操纵的dao包之后,设计Service层,接收controller的请求,并将数据库访问的结果反馈给controller。
首先,创建一个存放service接口的包。
这个包中,只定义方法,不做具体的实现。
其次,创建一个专门存放用于实现这些接口的类的包。
我们在接口处定义方法,而在类中给出这些方法的具体实现;
在这个实现类中,使用@Service将类注册为Service层的bean,也是目前唯一的UserService类型的bean,这意味这在表现层可以使用Service类型注入这个bean。使用@Autowired将userMapper注入到方法中,使用@Autowired注入后,就可以通过userMapper对象调用其中定义的操纵数据库的方法。这里将接口的insert方法做了具体的实现,插入用户后得到一个返回值。
既然实现类中实现了对于数据库操纵的方法,为什么要做一个操纵数据库的接口和接口的实现类呢?
这就是面向接口编程的思想,定义与实现的分离,这在大型项目中非常重要。
定义一个接口,就像定义一个框架,在这个接口的基础上做具体的实现;
而且这样做方便维护;
例如需要做插入两个用户的操作,需要调用两次insert方法,不在这个方法上修改,重新创建一个接口的实现类。
我们还需要做一个domain包,用于存放user这种对数据库具体对象的定义类:
User类中的属性根据数据库的user表设计,这里user有两个属性,id和name,设置这两个属性的setter和getter方法。这里user需要实现序列化,重写toString方法。
这样,就可以使用user对象作为insert方法的参数。
至此,mybatis的工作已经基本完成,接下来是struts2:
首先,创建controller包,存放控制层操作的action:
在UserAction中对用户传递的数据交给数据库进行处理,对数据库返回的结果处理后反馈给用户;
这是UserAction的核心代码register方法;在UserAction中定义了一个user对象,使用这个对象接收用户传递的数据,并将这些数据使用user对象打包后交给service层处理;
使用@Autowired将UserService依赖注入,这里采用是使用类型注入,目前spring中类型为UserService的bean只有一个,也就是UserService的实现类;
使用实现类的insert方法将用户输入的user对象进行插入数据库的操作;数据库插入用户成功,说明当前id不存在,跳转用户注册成功的页面;用户注册失败,参数i肯定还是0,跳转用户注册失败的页面。
下面是对于UserAction的xml配置和用户注册的jsp页面:
由于对UserAction做了注册,所以class直接使用bean的id即可;
将action的name设置为user,所以访问UserAction的register方法链接应该是上下文+user!register.action;