用过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的更多相关文章

  1. Spring 框架基础(06):Mvc架构模式简介,执行流程详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集 ...

  2. Struts2知多少(1) Struts2 MVC架构

    模型视图控制器(Model View Controller)或MVC,MVC是俗称,是一种软件设计模式,用于开发Web应用程序.模型 - 视图 - 控制器模式是由以下三个部分组成: Model - 模 ...

  3. [JavaWeb基础] 007.Struts2的配置和简单使用

    1.框架简介 采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架,用于快速开发Java Web应用.Struts实现的重点在C(Controller), ...

  4. [JavaWeb基础] 018.Struts2 Action通配符使用

    Struts2中有一个很牛逼的action通配符,可以用来简化action配置,以我们将要讲解的案例来说,如果我们要对一个学生信息进行增加,删除,修改,那么按照原来的做法,我们需要写3个Action来 ...

  5. [JavaWeb基础] 017.Struts2 和 ajax交互简介

    在网页开发中,我们为了只对网页的某块内容进行实时更新,而不对其他不需要更新的内容进行刷新,从而提高响应速度和节省流量,我们采用了页面的异步刷新技术Ajax,那么我们的Struts2框架在这一方面是如何 ...

  6. [JavaWeb基础] 016.Struts2 国际化配置

    如果一个软件想要让其受众是全球或者是几个国家的人,那么这个软件就需要支持多种语言,那么我们就需要软件的国际化去对一些文字信息进行国际化处理.web也一样,当外国人打开我们的网站,要是看到满屏幕的中文, ...

  7. [JavaWeb基础] 015.Struts2 表单验证框架

    在web开发的过程中,我们经常要用到一些填写表单的操作,我们一般都要在提交表单信息的时候对表单的内容进行验证,struts2给我们提供了简单的实现接口,让我们可以很容易的对表单进行验证.下面讲解下最传 ...

  8. [JavaWeb基础] 014.Struts2 标签库学习

    在Struts1和Struts2中都有很多很方便使用的标签库,使用它可以让我们的页面代码更加的简洁,易懂,规范.标签的形式就跟html的标签形式一样.上面的篇章中我们也讲解了自定义标签那么在如何使用标 ...

  9. [JavaWeb基础] 013.Struts2 自定义类型转换器

    很多时候,我们在做web开发的时候经常要用到时间的转换器,Struts2给我们提供了一种类型转换器的接口.下面我们讲讲怎么实现吧. 1.首先我们要定义一个类型转换的类,继承自com.babybus.s ...

随机推荐

  1. ACM学习总结 6月11日

    经过这几天没有队友的协助,又是算法题比较多,有点碰触到自己的短板,因为搜索的题目就做了1个,一遇到搜索就跳过,DP也有点忘得差不多了,四边形优化,斜率优化还不会,这是下一阶段努力方向,把之前做过的题, ...

  2. muduo网络库源码学习————线程安全

    线程安全使用单例模式,保证了每次只创建单个对象,代码如下: Singleton.h // Use of this source code is governed by a BSD-style lice ...

  3. Android控件重叠显示小记

    方案一 利用布局控件显示优先级 在xml中RelativeLayout,FrameLayout,靠后的控件显示在上层. 利用margin属性 margin属性可以控制控件间的距离,属性值为正值时,越大 ...

  4. B - Save the problem! CodeForces - 867B 构造题

    B - Save the problem! CodeForces - 867B 这个题目还是很简单的,很明显是一个构造题,但是早训的时候脑子有点糊涂,想到了用1 2 来构造, 但是去算这个数的时候算错 ...

  5. maven基本配置

    1.maven 是一个项目构建工具,如果在公司做大的项目 ,需要把项目拆分成很多子项目,为了方便各子项目之间协同开发和调试,一般都会使用maven.使用maven和以前web项目最大的不同是jar包的 ...

  6. Python 记录日志文件

    1.打印到控制台 # -*- coding: UTF-8 -*- import logging def logFileTest(): logging.debug('This is debug') lo ...

  7. MySQL基础总结(二)

    数据表的完整性约束条件 AUTO_INCREMENT (自增长) 注意事项: 1.一个表中只能有一个自增长字段 2.必须配合主键使用 方法1: 方法2: 方法3: 指定自增长初始值的方法: 修改自增长 ...

  8. 微信小程序开发实战(1):使用滚动视图

    本文主要介绍了滚动视图组件(scroll-view)的各种常用功能,例如,垂直和水平滚动.滚动事件等,并通过例子代码来演示这些功能的使用方法.   1. 垂直滚动视图 scroll-view是容器组件 ...

  9. Android CodeReview 些许总结

    CodeReview些许总结 1:使用Handler的时候,使用handler.post(Runnable);,hanler与类尽量保持弱引用关系,或者使用静态的handler对象 public Ha ...

  10. 8、HTTPS证书Actions无法导出问题

    前言 在点Actions时候出现Export Failed:The root certificate could not be located.最近有很多小伙伴在fiddler导出证书的时候,遇到无法 ...