struts2分层体系架构及模型驱动介绍

2018-05-20  本文已影响0人  pr0metheus

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应用体系分层结构.png

2. struts2的模型驱动(Model Driven)

2.1. 驱动的分类

struts2分为属性驱动以及模型驱动两种,当然这是对于Action来说的

属性驱动:表单提交的元素对应于Action中的成员变量完成自动赋值

模型驱动:客户端提交表单后,将内容封装到一个javaBean中

2.2. 模型驱动的实现步骤

  1. 定义一个Action在继承ActionSupport后再实现ModelDriven<T>接口
  2. 定义一个模型所引用类型的成员变量并实例化它
  3. 实现接口方法getModel并返回模型对象的引用类型

示例代码如下:

前端页面:

前端页面.png

LoginAction:

LoginAction.png

struts.xml:

struts.xml.png

结果页面:

output.png

测试部分:

首先在前端页面输入hello、world,如下图所示:

modelDrivenTest.png

在提交后,转到output.jsp并显示如下结果:

modelDrivenTestResult.png

2.3. 模型驱动赋值过程

  1. 发现Action并确认是模型驱动后
  2. 调用getModel方法得到模型对象
  3. 根据表单提供的信息对该对象进行赋值

对于显示结果这部分代码没有任何变化,还是从request作用域中去取信息,也就是说struts2存放的不是模型对象,不过也是存放模型对象的话还要通过类型转换器进行转换

2.4. 属性驱动与模型驱动差异

属性驱动优点:

灵活、准确、需要什么定义什么

模型驱动缺点:

不灵活、不准确,为什么说不灵活呢,我是这样理解的,javaBean一般而言是对照数据表中的表而生成的,具有通用性,而有些表单的元素可能会与之有出入,这时候我们不能为了一些个例就该javaBean吧,只能去该表单元素的name了,但表单元素的名字也许会被一些js所使用,盖起来也没想象中那么简单,有牵连,但是遇到这种情况,后台与前端总有一个是要做出牺牲的

模型驱动优点:

对象已经建立好了,不用去一个一个set属性了

模型驱动更加符合面向对象的编程风格,使得我们获得的是一个完整的对象,而不是一个离散的值

推荐使用属性驱动编写Action更加灵活

上一篇下一篇

猜你喜欢

热点阅读