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万+

【Web实战】微信小程序逆向

2E 70 6E 67”为带存放路径的文件名称,“00 00 11 7C”对应文件在小程序包中的具体偏移位置,“00 01 01 F7“对应文件在小程序包中的数据长度。但这并不是最初的原项目文件结构,原因是微信服务器会将小程序源码中所有的“js”文件压入“app-service.js”文件中,将所有的“json”文件压入“app-config.json”中,将所有的“wxml”文件压入“page-frame.html”文件中,“wxss”则在处理之后以“html”文件的形式存留在对应页面目录之下。

若有战,召必回 1943

从零到一:Livox Mid-360 激光雷达的硬件集成与避坑实战

本文详细介绍了Livox Mid-360激光雷达的硬件集成全流程,包括硬件准备、网络配置、驱动编译和常见问题解决方案。通过实战经验,帮助开发者高效完成从设备拆箱到数据输出的完整链路,避免在IP设置、驱动编译和固件兼容性等环节踩坑。

salt的博客 1028

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万+

告别零散脚本:用Playwright+Pytest+Yaml+Allure搭建可维护的UI自动化项目

UI自动化测试是软件质量保障的关键环节,其核心在于模拟用户操作,对Web应用界面进行功能验证。传统的脚本堆砌方式常因代码耦合度高、维护成本大而难以为继。工程化解决方案通过分离关注点,将测试逻辑、数据和配置解耦,从而显著提升项目的可读性、可维护性和可扩展性。其技术价值在于构建可持续运行的自动化资产,而非一次性脚本。典型的应用场景包括Web应用的回归测试、兼容性测试及CI/CD流水线中的质量门禁。本文以Playwright、Pytest、Yaml和Allure为核心技术栈,详细阐述了如何从项目架构、页面对象模型

weixin_42529328的博客 299

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万+

RLHF的数学表示

RLHF(Reinforcement Learning with Human Feedback)是一种结合了强化学习和人类反馈的机器学习方法。它通常用于训练智能体(agent)在复杂环境中做出决策,同时利用人类的反馈来指导和改进学习过程。RLHF 没有一个统一的数学表示式,因为它依赖于具体的应用场景和实现细节。然而,我们可以从强化学习和人类反馈的角度来描述RLHF的一些关键数学概念。

xw555666的博客 687

时间序列:R语言ARMA-GARCH模型

ARMA: #读入数据,并绘制时序图 d<-read.table("C:/Users/haha/Desktop/R/zuoye/1.txt") x<-ts(log(d),start = 1) 1: x的时间序列图: x<-ts(log(d),start = 1) plot(x) 2: 从上图可以看出x.dif序列值在0的附近波动,没...

1万+

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

用友U8 API 二次开发:WebService封装7个核心DLL引用与U8Login登录避坑

本文详细介绍了用友U8 API二次开发中的WebService封装与U8Login登录优化实践。通过7个核心DLL的正确引用、U8Login登录机制的深度解析及IIS环境下的特殊处理方案,为开发者提供了一套高可用性的通用解决方案,助力企业实现ERP系统的高效集成与数字化转型。

weixin_42524171的博客 505

Entity Framework之Model First开发方式

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

weixin_30693183的博客 128

YOLOv13涨点改进 | 全网独家创新、高效涨点改进篇 | CVPR 2024 | YOLOv13引入SHSA单头自注意力模块,减少冗余的多头注意力,轻量化改进,助力目标检测和图像分类任务高效涨点

本文提出了一种改进YOLOv13模型的新方法——SHSA(单头自注意力)模块,用于提升目标检测任务的计算效率和推理速度。SHSA通过简化多头注意力机制为单头结构,显著减少了计算冗余和内存占用。实验表明,该模块在保持精度的同时,在GPU、CPU和移动设备上分别实现了3.3倍、8.1倍和2.4倍的加速效果。文章详细介绍了SHSA的结构原理、核心代码实现方法,以及如何集成到YOLOv13的配置文件中。这种改进特别适合资源受限设备,为实时目标检测提供了更优的速度-精度平衡方案。

Ai缝合怪、助力小伙伴高效发论文 506

零基础学习CANoe Panel(17)—— Panel CAPL Function

CANoe内置了几个CAPLFunction,允许我们在CAPL运行时动态的更改Panel控件的属性,比如打开某个panel,禁用某个控件,更改控件颜色等。

蚂蚁小兵 3508

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

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

weixin_39666550的博客 304

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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、付费专栏及课程。

余额充值