[JavaWeb基础] 019.Struts2 MVC架构之ModelDriven
用过struts1的人接触struts2的时候,通常会产生一个疑惑,明明struts1已经把action的form分开了,为什么struts2确把模型放在action中定义。其实这个方式只是想让action更加直观,但是如果表单数据过多的话,action类就会出现过于冗长,所以struts2的ModelDriven就要出来解决问题了。下面讲讲ModelDriven的机制
1.工作原理
ModelDriven的机制背后就是ValueStack.界面可以通过直接指定对象的属性名就能给对象进行赋值。
ModelDriven其实实现的是一个缺省的拦截器ModelDrivenInterceptor,当一个请求通过该拦截器的时候,会判断该请求是否实现了ModelDriven接口,如果实现了,那么就调用getModel方法,然后把返回值压入ValueStack。
public class ModelDrivenInterceptor extends AbstractInterceptor {
    protected boolean refreshModelBeforeResult = false;
    public void setRefreshModelBeforeResult(boolean val) {
        this.refreshModelBeforeResult = val;
    }
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        Object action = invocation.getAction();
        if (action instanceof ModelDriven) {
            ModelDriven modelDriven = (ModelDriven) action;
            ValueStack stack = invocation.getStack();
            Object model = modelDriven.getModel();
            if (model !=  null) {
              stack.push(model);
            }
            if (refreshModelBeforeResult) {
                invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven, model));
            }
        }
        return invocation.invoke();
    }
2.前面说的,我们应该在Action中实现ModelDriven并且实现其中的方法getModel,下面代码只是截取片段
public class ManageStudentAction extends ActionSupport implements Action,ModelDriven<Student> {
	private static final long serialVersionUID = 1L;
	private Student student;
	@Override
	public Student getModel() {
		if(student == null){
			student = new Student();
		}
		return student;
	}
}
3.页面代码就跟直接定义属性是一样的,以student的属性作为name。
<tr>
<td align="right">学生名</td>
<td> <input type="text" name="studentname" value="${theUser.studentname}"></td></tr>
<tr>
<td align="right">年龄:</td>
<td> <input type="text" name="age" value="${theUser.age}"></td></tr>
<td align="right">班级:</td>
<td> <input type="text" name="classname" value="${theUser.classname}"></td></tr>
<tr>
<td colspan='2' align="center"><input type="submit" value="保存" name="btnSubmit"> <input type="reset" value="重置" name="btnCancel"></td>
</tr>
4.这样我们就可以把Action和Model分开,去实现Struts2的MVC架构

本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士)
转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4824321.html
[JavaWeb基础] 019.Struts2 MVC架构之ModelDriven的更多相关文章
- Spring 框架基础(06):Mvc架构模式简介,执行流程详解
		
本文源码:GitHub·点这里 || GitEE·点这里 一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集 ...
 - Struts2知多少(1) Struts2 MVC架构
		
模型视图控制器(Model View Controller)或MVC,MVC是俗称,是一种软件设计模式,用于开发Web应用程序.模型 - 视图 - 控制器模式是由以下三个部分组成: Model - 模 ...
 - [JavaWeb基础] 007.Struts2的配置和简单使用
		
1.框架简介 采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架,用于快速开发Java Web应用.Struts实现的重点在C(Controller), ...
 - [JavaWeb基础] 018.Struts2 Action通配符使用
		
Struts2中有一个很牛逼的action通配符,可以用来简化action配置,以我们将要讲解的案例来说,如果我们要对一个学生信息进行增加,删除,修改,那么按照原来的做法,我们需要写3个Action来 ...
 - [JavaWeb基础] 017.Struts2 和 ajax交互简介
		
在网页开发中,我们为了只对网页的某块内容进行实时更新,而不对其他不需要更新的内容进行刷新,从而提高响应速度和节省流量,我们采用了页面的异步刷新技术Ajax,那么我们的Struts2框架在这一方面是如何 ...
 - [JavaWeb基础] 016.Struts2 国际化配置
		
如果一个软件想要让其受众是全球或者是几个国家的人,那么这个软件就需要支持多种语言,那么我们就需要软件的国际化去对一些文字信息进行国际化处理.web也一样,当外国人打开我们的网站,要是看到满屏幕的中文, ...
 - [JavaWeb基础] 015.Struts2 表单验证框架
		
在web开发的过程中,我们经常要用到一些填写表单的操作,我们一般都要在提交表单信息的时候对表单的内容进行验证,struts2给我们提供了简单的实现接口,让我们可以很容易的对表单进行验证.下面讲解下最传 ...
 - [JavaWeb基础] 014.Struts2 标签库学习
		
在Struts1和Struts2中都有很多很方便使用的标签库,使用它可以让我们的页面代码更加的简洁,易懂,规范.标签的形式就跟html的标签形式一样.上面的篇章中我们也讲解了自定义标签那么在如何使用标 ...
 - [JavaWeb基础] 013.Struts2 自定义类型转换器
		
很多时候,我们在做web开发的时候经常要用到时间的转换器,Struts2给我们提供了一种类型转换器的接口.下面我们讲讲怎么实现吧. 1.首先我们要定义一个类型转换的类,继承自com.babybus.s ...
 
随机推荐
- Edge Weight Assignment(树-异或-贪心)
			
大意: 给定一棵无根树,要求你任意设置n-1条边的边权. 使得任意叶子节点间边权的XOR值为0: 此时,令f为所有边权数值不同的个数,求最小的f和最大的f. \(\color{Red}{------- ...
 - P2201 数列编辑器
			
传送门呀呀呀呀呀呀呀呀呀呀呀呀呀 \(乍一看题目好像很难\)(实际也确实很难) \(但是我们仔细看就发现,整个数列分成了光标前和光标后两组数列\) \(我们有什么理由不分开储存呢??\) \(然后光标 ...
 - 最小点覆盖(König定理)
			
König定理是一个二分图中很重要的定理,它的意思是,一个二分图中的最大匹配数等于这个图中的最小点覆盖数.如果你还不知道什么是最小点覆盖,我也在这里说一下:假如选了一个点就相当于覆盖了以它为端点的所有 ...
 - python学习笔记 Day4
			
1.函数返回值分析 li = [1,2,3,4] li2 = [1,2,3,4] def f1(args): args.append(55) li = f1(li) print(li) f1(li2) ...
 - gulp插件学习01
			
1.安装和使用 安装node环境:官网:https://nodejs.org: 命令行输入 npm i gulp -g ,gulp-v查看安装是否成功: 创建项目目录: 进入目录,并在目录中按住shi ...
 - Android(H5)互相调用方法
			
记录一下前面混合开发时很重要的java与js互调方法进行数据交互. 混合开发就需要webview这个控件了 这就很玄学了,哈哈哈 这篇文章https://www.jianshu.com/p/3d9a9 ...
 - Linux内核驱动学习(四)Platform设备驱动模型
			
Linux platform设备驱动模型 文章目录 Linux platform设备驱动模型 前言 框架 设备与驱动的分离 设备(device) 驱动(driver) 匹配(match) 参考 前言 ...
 - python的进栈出栈遍历
			
python实现出栈进栈 要求: 进栈 出栈 遍历所有 退出 stack = [] #创建列表 #进栈 def pushstack(): stack.append(input('Enter a nub ...
 - requestAnimationFrame/cancelAnimationFrame——性能更好的js动画实现方式
			
用js来实现动画,我们一般是借助setTimeout或setInterval这两个函数,css3动画出来后,我们又可以使用css3来实现动画了,而且性能和流畅度也得到了很大的提升.但是css3动画还是 ...
 - DNS注入以获取WebShell -asp_POST_DNS_SQLServer_GetWebShell
			
豹子安全-注入工具-asp_POST_DNS_SQLServer_GetWebShell 注意,是 DNS 注入.这种方式的注入会隐藏很多细节, 对于用户来说是透明的. 请看如下视频(该视频会停留15 ...