struts2分层体系架构及模型驱动介绍
1. struts2应用体系结构
我们都知道servlet可以作为控制层来使用,而struts2中的Action与servlet的作用类似
servlet是在doGet或doPost中调用service服务得到结果并选择相应的视图进行数据展示,那么对于Action而言也是一样的
例如下面代码:
LoginAction.png因为struts2是多例的,所以可以把service定义成成员变量,当然局部变量也没问题,然后在execute方法中调用service层的业务即可
这个例子阐述的思想更为重要即:无论是servlet还是替换成了struts2框架,对于service以及dao层没有任何影响,不关心最上层是否用了框架(Tips:servlet编程时是不允许servlet api往service以及dao层传的)
struts2应用体系结构如下图所示:
struts2应用体系分层结构.png2. struts2的模型驱动(Model Driven)
2.1. 驱动的分类
struts2分为属性驱动以及模型驱动两种,当然这是对于Action来说的
属性驱动:表单提交的元素对应于Action中的成员变量完成自动赋值
模型驱动:客户端提交表单后,将内容封装到一个javaBean中
2.2. 模型驱动的实现步骤
- 定义一个Action在继承ActionSupport后再实现ModelDriven<T>接口
- 定义一个模型所引用类型的成员变量并实例化它
- 实现接口方法getModel并返回模型对象的引用类型
示例代码如下:
前端页面:
前端页面.pngLoginAction:
LoginAction.pngstruts.xml:
struts.xml.png结果页面:
output.png测试部分:
首先在前端页面输入hello、world,如下图所示:
modelDrivenTest.png在提交后,转到output.jsp并显示如下结果:
modelDrivenTestResult.png2.3. 模型驱动赋值过程
- 发现Action并确认是模型驱动后
- 调用getModel方法得到模型对象
- 根据表单提供的信息对该对象进行赋值
对于显示结果这部分代码没有任何变化,还是从request作用域中去取信息,也就是说struts2存放的不是模型对象,不过也是存放模型对象的话还要通过类型转换器进行转换
2.4. 属性驱动与模型驱动差异
属性驱动优点:
灵活、准确、需要什么定义什么
模型驱动缺点:
不灵活、不准确,为什么说不灵活呢,我是这样理解的,javaBean一般而言是对照数据表中的表而生成的,具有通用性,而有些表单的元素可能会与之有出入,这时候我们不能为了一些个例就该javaBean吧,只能去该表单元素的name了,但表单元素的名字也许会被一些js所使用,盖起来也没想象中那么简单,有牵连,但是遇到这种情况,后台与前端总有一个是要做出牺牲的
模型驱动优点:
对象已经建立好了,不用去一个一个set属性了
模型驱动更加符合面向对象的编程风格,使得我们获得的是一个完整的对象,而不是一个离散的值
推荐使用属性驱动编写Action更加灵活