Model,与数据库,框架和开发方式无关

html登录页面整理 3 function r() { var username=document.getElementById("username"); var pass=document.getElementById("password"); if(username.value=="") { alert("请输入用户名"); username.focus(); return; } if 阅读详情

Model

与数据库,框架和开发方式无关

 

知识产权保护请从我做起,转载请注明出处。

http://blog.youkuaiyun.com/struts2

 

代码示例请参看:http://code.google.com/p/mdx-shopping

 

概述

说到Model就不得不提软件开发领域著名的构架模式:MVC。

 

MVC是一种软件构架,现在被认为是软件工程中使用的一种构架模式.这个模式将域逻辑(用户使用的应用程序逻辑)从用户界面(输入和表示)中分离出来,从而可以独立开发、测试和维护每一部分(关注分离)。

原文参看:

http://en.wikipedia.org/wiki/Model%E2%80%93View%E2%80%93Controller

 

MVC这三个字母风别是Model,View和Controller的首字母,一下这边文章主要探讨一下什么是Model,如何设计和实现Model。

 

Model是什么

Model是什么:

要回答Model是什么,需要从理解Model的定义开始。

根据MVC的定义,Model是域逻辑,或者可以通俗地理解为用户需要使用的应用程序的逻辑,或者跟简单一些就是用户的需求。

 

用户需求通常包含两部分的内容,做什么操作和得到什么结果。

 

做什么操作就是需要帮助用户完成什么业务逻辑,毕竟软件的初衷就是帮助客户完成一些原本用户需要重复做的事情。

得到什么结果就是做完用户期望的操作之后,得到什么结果,或许这才是用户最期望的内容,通常情况下这些内容需要被保存下来。

 

概括起来说,Model就是用户操作和被操作的数据的结合体。

 

Mode不是什么:

(1)   Model是数据库吗?

简单地回答,不是。不过上面说过Model通常需要被存储起来,以供客户使用。而数据库又是最常见的数据存储的手段,所以可以这样说,Model的数据部分需通常存储在数据库中。

(2)   Model可以不包含用户逻辑吗?

通常情况下不可以。Model不进包含数据,也包含对这些数据的有意义的业务操作,只有数据结合了这些有意义的操作才真正成为了Model。没有业务逻辑的数据其实已经退化为了VO或者DTO。

 

总结:

Model是业务逻辑和数据的结合体。业务逻辑体现了客户期望做什么,而数据体现了客户通过期望的操作想得到什么。

 

实例分析:

以下以用户管理为例,分析一下在这个Case中Model到底是什么。

 

通常的用户管理包含两个角色,第一是用户本身,第二是管理用户的管理员。

 

而需要做的操作可以按照角色的不同来分组:

l  对于用户本身来说,期望能够注册为系统的一个用户,希望能够使用注册用户登陆系统,同时希望能够定期修改密码。

l  对于管理员来说,希望能够了解总共有多少个用户,最好能够将用户分组管理,如果能够禁用默写用户就更好了。

 

在理解了这些需求的基础上,我们下面分析这个Case中的Mode。

业务逻辑(或者可以说是操作)部分:

l  用户:注册,登陆,修改密码

l  管理员:查看所有用户,用户分组,启用和禁用用户。

数据部分:

根据常规的情况,至少需要用户登录名,密码和是否有效三个数据。

 

所以在用户管理的Case下,Model可以理解为:

现在可以点题了,Mode就是用户通常使用的操作和期望得到的结果,可以操作可以通过BS结构来完成,也可以通过CS结构来完成,可以存储在数据库中,也可以存储在文件系统中,可以使用Struts也可以不使用Struts而直接使用Servlet。可以给予J2EE当然也可以基于.NET平台。

 

Mode的实现

尽管Model并不依赖于任何框架或者技术,但是为了讨论的方便,我们还是做了以下假定,在一下假定的范围内讨论Model的实现

l  使用Java语言

l  Model的数据部分保存在数据库中

l  使用MyBatis来简化数据保存的操作

 

Model实现的两种方式:

l  Manager(逻辑) + VO(数据):这种方式将数据与操作隔离,所有的操作都由Manager来完成,而VO通常承担了数据传输对象的作用,用来在前台View和Manager之间,以及Manager和数据库之间传递数据。本文中不详细讲解这种方式,这种方式较为普遍,请各位自行查阅。

l  Model(逻辑+数据):这种方式注重数据与操作的整合,一下主要探讨这种方式。

 

实例分析:

仍旧以用户管理为例逐步分析Model的实现。

第一步,数据部分首先应该添加在Model中,这部分内容比较简单,参看以下代码:

public class LoginInfoData extends ModelObject {

    private String username;

    private String password;

    private boolean isActive;

      

       // getter method and setter method

}

第二部,将操作封装在Model中。但是在封装用户操作之前还有一个问题需要说明。用户操作分为两类,第一类,无中生有,第二类,有则改之。

 

无中生有最典型的操作是查看所有用户,而有则改之最典型的操作是修改密码。由于无中生有通常不是对某个单独的对象进行操作,所以通常设计为静态的类方法,而有则改之通常是对某一个具体实例的操作,所以通常设计为实例方法。参看以下代码:

public class LoginInfo extends LoginInfoData {

    /**

     * register user and connect role of user to him.

     * @return true for success, false else

     */

    public boolean register() {

       //...

    }

   

    public static List<LoginInfo> getAll() {

       //

    }

}

其他的通用方法:

对于单个对象的CRUD通常应该以一种共同的方式实现,或者使用代码自动生成。请注意上述代码的继承层次关系。

 

Mode使用:

用户登录

protected boolean checkUserLoginInfo() {

 

    LoginInfo info = new LoginInfo();

    info.setUsername(getModel().getUsername());

 

    if (info.load() &&

info.getPassword().equals(Digester.crypt(getModel().getPassword()))) {

        // add role id and role

        this.loginInfo = info;

        return true;

    } else {

        return false;

    }

}

 

密码修改:

public String changePassword() {

    log.debug("enter customer/changepwd action, model:" + model);

 

    // 1. check password and repassword

 

    if (!model.getPassword().equals(model.getRePassword())) {

        return INPUT;

    }

 

    // 2. check old password

    LoginInfo info = new LoginInfo();

    info.setUsername(getModel().getUsername());

 

    if (!info.load() || !info.getPassword().equals(Digester.crypt(getModel().getPassword()))) {

        // old user not exist or old password not equals

        return INPUT;

    }

 

    // 3. generate new password hash

    String newpwd = Digester.crypt(model.getPassword());

    info.setPassword(newpwd);

 

    // 4. update login info

    info.update();

 

    log.debug("update password successfully!");

    return SUCCESS;

}

 

实体框架EF(Entity Framework)简介 是微软官方提供的ORM工具,ORM让开发人员节省数据库访问的代码时间,将更多的时间放到业务逻辑层代码上。提供变更追踪,唯一性约束,惰性加载、查询事务等功能。开发人员使用Linq语言,对数据库操作如同操作Object对象一样省事。使用场景:ORM-Object/Relational Mapper,即“对象-关系型数据映射组件”。对于O/R,即 Object(对象)和 Relational(关系型数据),表示必须同时使用面向对象和关系型数据进行开发。ORM是将数据存储从域对象自动映射到关系数据库的工具。ORM主 阅读详情

相关推荐

基于MVVM模式的Unity3D UI框架设计与实现

在Unity3D开发中,构建高效、可维护的UI系统是项目成功的关键。随着项目规模的增长,传统的UI开发方式往往导致代码臃肿、耦合度高、难以维护。因此,引入结构清晰、模块化的UI框架成为大型项目不可或缺的一环。Unity的UI系统从最初的IMGUI逐步演进到现在的UGUI,再到基于DOTween、UI Toolkit等第三方解决方案,其设计理念始终围绕着性能、灵活性与可扩展性展开。一个优秀的UI框架不仅能够提升开发效率,还能降低UI与业务逻辑之间的耦合度,便于团队协作与长期维护。

weixin_35433448的博客 1169

烟花特效Html

【代码】烟花特效Html。

大宽的博客 10万+

Visual C#数据库开发高级实战教程

Visual C#作为.NET框架的核心开发语言之一,在企业级数据库应用开发中占据重要地位。它通过与ADO.NET、Entity Framework等数据访问技术的深度集成,实现了高效、稳定的数据交互能力。本章将介绍数据库编程的基本概念,包括数据库与应用程序的交互方式、主流数据库系统(如SQL Server、MySQL、Oracle)的适用场景,并探讨Visual Studio在数据库开发中的强大集成优势,例如智能提示、调试支持与数据库项目管理功能,为后续章节的深入学习奠定坚实的理论与实践基础。组件。

weixin_35189483的博客 925

python base64编码的图片保存到本地

import os import base64 sss ="""/9j/4AAQSkZJRgABAQEASABIAAD//gAyUHJvY2Vzc2VkIEJ5IGVCYXkgd2l0aCBJbWFnZU1hZ2ljaywgejEuMS4wLiB8fEIy/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJCQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMm

zn505119020的专栏 68万+

从爱好者到工程师:如何低成本体验RFSoC ZU47DR?性能实测与避坑指南

本文详细介绍了如何低成本体验赛灵思RFSoC ZU47DR芯片,包括二手开发板选购、租赁服务、精简开发环境搭建等实用方案。通过性能实测与避坑指南,帮助爱好者和工程师在有限预算下充分利用这款集成了ARM处理器和FPGA的高性能芯片,降低开发门槛。

weixin_42525005的博客 220

使用VNC可视化Docker容器

Docker容器可视化

Robert_Q的博客 1万+

signature=21a3b1e2636f27ab5b1ada261e9e6ae3,mantisbt/KEYS.md at ab5a36f25ce4b025936b489e352f63a371745...

MantisBT PGP KeysThis file contains the PGPkeys of MantisBT Developers, which were used to sign official release packagesand the corresponding tags in the Git repository.Do not use these keys for emai...

weixin_39657125的博客 8万+

LaTeX双栏浮动结构实战:用dblfloatfix解决跨栏图表排版难题

本文深入探讨了LaTeX双栏浮动结构在学术论文排版中的常见问题,特别是IEEE会议论文中的跨栏图表定位难题。通过介绍dblfloatfix包的整合解决方案,帮助用户实现精准的底部定位和浮动顺序保持,提升排版效率与质量。

weixin_30872499的博客 442

http:/222.212.79/app/zscd.html,emscripten/src/shell.html at 1.29.12 · emscripten-core/emscripten · G...

version="1.1"id="Layer_1"x="0px"y="0px"width="296px"height="78px"viewBox="420 120 100 170"enable-background="new 0 0 900 400"xml:space="preserve"inkscape:version="0.48.4 r9939"sodipodi:docname="emscri...

weixin_36304957的博客 27万+

通俗讲解清楚光线追踪中的蒙特卡洛积分

彻底讲解光线追踪中的蒙特卡洛积分

qq_37366618的博客 1243

【低轨】Starlink星链-Ku波段OFDM信号同步机制与PNT应用潜力

本文深入解析了Starlink星链Ku波段OFDM信号的同步机制及其在定位、导航与授时(PNT)领域的应用潜力。研究发现,其信号帧内嵌的同步序列具有相位恒定特性,支持超长相干积分,可在极低信噪比下实现高精度伪距测量,为利用低轨卫星通信信号实现高精度PNT服务提供了新的技术路径。

weixin_29250403的博客 730

EF基础系列--Entity Framework的开发方式

在使用Entity Framework开发应用程序时,可以使用三种不同的方法:1.Database-First 2.Code-First 3.Model-First在database-first的开发方法中,您使用集成在Visual Studio中的EDM向导或执行EF命令为现有数据库生成上下文和实体。EF 6广泛支持database-first的方法。EF Core对这种方法的支持有限。当您的应用程序没有现有数据库时,请使用此方法。在code-first方法中,首先编写实体(域类)和上下文类,然后使用迁移

a859745210b66a6的博客 189

从“氛围编程“到“智能体工程“:AI编程范式的认知跃迁与工程实践

摘要: 2026年,ClaudeCode负责人鲍里斯·切尔尼提出用“智能体工程”(Agent Engineering)替代流行的“氛围编程”(Vibe Coding),认为后者过于主观,无法体现AI编程的系统化与工程化本质。智能体工程强调记忆系统、工具编排、任务分解、可观测性等核心技术,将AI编程从“玄学辅助”升级为可度量、可规模化的工程学科。本文通过对比术语差异、构建知识体系,并结合代码实例(如带记忆系统的代码生成Agent和可观测性系统),展示了智能体工程的实际应用。行业案例(如ClaudeCode的并

yyq916的博客 1060

Entity Framework之Model First开发方式

一、Model First开发方式 在项目一开始,就没用数据库时,可以借助EF设计模型,然后根据模型同步完成数据库中表的创建,这就是Model First开发方式。总结一点就是,现有模型再有表。 二、创建Model First Demo 1.右键解决方法“EFDemo”,选择“添加项目-》控制台应用程序”,并将名称改为ModelFirst 2.右键M...

weixin_30693183的博客 128

Open3D 点云数学形态学滤波(Python版本)

Open3D 点云数学形态学滤波(Python版本)

dayuhaitang1的博客 1395

鸿蒙应用发布实战:应用热更新的实现

在移动应用开发领域,应用更新是持续交付价值的关键环节。传统的应用更新方式需要用户手动下载完整安装包,不仅用户体验差,而且更新率往往不理想。热更新技术(也称为OTA更新)允许应用在不重新安装的情况下动态更新部分功能,极大提升了用户体验和迭代效率。本文专注于鸿蒙操作系统下的应用热更新实现方案,涵盖从原理到实践的完整知识体系。鸿蒙热更新的技术架构差分更新算法实现动态部署机制实际项目中的最佳实践安全与性能优化策略首先介绍鸿蒙热更新的背景和核心概念深入分析技术原理和算法实现。

操作系统内核探秘的博客 965

db和model用哪个开发大型项目 thinkphp_谈谈腾讯和百度的C++开发环境

笔者先后在TB待过,主要做C++开发工作。今天来谈一下两个公司的C++开发环境。其实不管是哪个公司对于如何开发都没有太大限制,在保证不泄露代码的安全前提下,选择自己喜欢的开发方式就好。但是肯定每个公司的前辈程序员们还是有一定的选择偏好的,所以后来的程序员也慢慢被同化。免责声明:腾讯BG众多,各个部门的技术体系和研发流程自成一体。不同部门,不同BG之间差异都很大。本文所介绍的是笔者当时(2...

weixin_39666550的博客 304

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Entity Framework 4-第一篇-采用Model-First 开发方式创建数据库

本文是《ASP.NET 4.0与Entity Framework 4》系列文章的第一篇,该系列将向你介绍如何采用Entity Framewok4开发ASP.NET程序。文章会一步一步的教您使用Entity Framewok4创建数据库。创建好的数据库将会在以后该系列文章中使用。 摘要 已经发布的Visual Studio 2010 中包含了Entity Framewok4,它是微软发布的第

Json1204的专栏 5422

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

视觉角度: jfinal的Model与Beetlsql比较

JFinal 是目前在 git.oschina.net java中关注最多的项目. 亲自用JFinal开发过有上百张表的项目.项目完结后总要做个总结 这篇文章是介绍项目中开发的一些经历. 会首先列出JFinal的Model开发 (只是Model的使用) 使用Beetlsql替换...

chunlvgun9736的博客 269

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

code first model first database first优劣势

代码优先 相对受欢迎,以为铁杆程序员不喜欢使用edmx xml来定义映射关系,那样太复杂。完全的代码控制(自动生成的代码较难修改)一般不会被数据库影响到,数据库只是存储,没有逻辑关系,EF框架会处理和创建逻辑,你不必关心如何实现。手动修改数据库可能会造成数据丢失,因为你代码定义了数据结构。 数据库优先 较为被DBA接受,可以单独开发,或者根据数据库自动生成。可以让EF自动创建实体,...

weixin_30779691的博客 215

ASP.NET 4.0 与 Entity Framework 4-第一篇-采用Model-First 开发方式创建数据库

LloydSheng 写于 2010年04月16日上午 10:37 | 评 论一下 本文是《ASP.NET 4.0与Entity Framework 4》系列文章的第一篇,该系列将向你介绍如何采用Entity Framewok4开发ASP.NET程序。文章会一步一步的教您使用Entity Framewok4创建数据库。创建好的数据库将会在以后该系列文章中使用。 摘要 已经发布的Visu

清风古韵 715

利用 Linq to SQL 的数据访问层开发方式讨论

为了较好的开发体验,在开发阶段,我喜欢用 Model -&gt; DB 的次序来进行。也就是说,先在程序中创建一个 Linq to SQL Data Classes 类,在设计视图上设计好类图。然后,程序中执行一下如下的代码来生成数据库:if (db.DatabaseExists())    db.DeleteDatabase();db.CreateDatabase();这样做的好处是让我们可以以...

weixin_34217711的博客 77

MVC5 DB FIRST

跟着师父一直在做codefirst的开发,最近有个新需求,就是需要人家的数据库,然后来开发,现在出现问题了。整理如下 目前有个现成的我们之前的codefirst的工程代码,我记得师父说过,根据数据库生成model的做法是: 在指定文件夹,右键添加-->新建项--> 这里先选择数据,然后是ADO.NET,在下面的名称输入你想生成的名称,但是这个名称最好是起个项目的名称,因为

g6uqwseseo的博客 277
上一篇: Shopping Mall 的诞生! 使用Struts 2,MyBatis,JQuery开发Web应用程序!
下一篇: Android 开发类库
struts2
博客等级 码龄19年 885粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值