Windows客户端开发简介(二)

oldmanzhao 2015-02-12 01:41:54
加精
Windows客户端开发简介(二)

一个典型的Windows客户端程序要有哪几部分构成呢?下面我会以一个国内比较流行的互联网客户端程序的基本架构来跟大家逐步展开分析,由于涉及到知识产权的问题,请大家不要问我是什么产品,当然,如果你能猜到,那我就管不着了^_^。

某视频影音互联网PC客户端产品基本架构


如上只是个粗略的分层架构图,没有更细致的划分,但是有几个地方是需要特别关注的,比如最上层的那几个部分,音视频解码引擎,UI引擎,WebKit浏览器内核,内核通信模块,日志系统。

因为音视频解码引擎和内核通信模块只是对于视频客户端和P2P通信特有的,不具有通用性,所以我这里不做特别介绍。

首先我们要来重头介绍一下UI引擎

所谓的UI引擎就是通常所说的界面库,对于客户端产品来说,UI开发占了很大篇幅,UI的好坏会直接印象用户的最直观体验,因此一个好的界面库实在是重中之重。

那么什么样算是好的UI引擎呢?从功能角度说首先配置方便,能快速的修改界面,或者完成界面的重建;其次要有功能丰富的控件,能够满足各种各样的UI需求。从技术角度说,界面库的移植性要好,比如绘制层和展现层分离,这样在跨平台的时候就只需要修改绘制层的代码,而上层的客户端UI代码不需要做太大修改。其次伸缩性,伸缩性好在界面库本身控件不够丰富的情况下可以快速的进行开发新控件,这里面就跟面向对象技术有很大关系。再其次,UI界面库应该有比较好的扩展性,比如在现有控件不足的情况下,可以直接与平台原生控件结合,这样在界面控件元素缺少的情况下可以快速的利用本平台原生控件进行弥补。

现在的界面库发展大致经历了四个阶段

一、最早的用Windows API进行界面开发的阶段

这时期的界面相对比较简单,图片还用的比较少,软件结构也不是特别复杂,因而这个阶段上界面甚至还谈不上独立出来的引擎,基本和数据层和通信层是整合在一起的。

在这个阶段上,如果你要创建一个窗口,需要调用一大堆的Windows API,需要手动创建消息循环,需要调用诸如CreateWindow这样的API并进行相应的消息处理。

二、以MFC、WTL为代表的第二代界面库

这个阶段上由于面向对象技术的发展(主要是C++),Windows平台上出现了像MFC这样的C++封装界面库。它的主要特点是利用了C++的多态,封装等C++特性,比如把窗口进行封装,把窗口视作一个对象,对窗口的处理视作施加在窗口类对象上的行为。虽然引入了面向对象的概念,但是本质上而言,这还是一种用代码来拼凑界面的办法,对UI开发人员还是有比较高的要求的。

在这个阶段上,如果你要创建一个窗口,相对工作量要少一点,派生两个类,消息循环已经封装在里面,覆盖它们的虚函数,在里面做一些初始化操作就可以了。

三、以QT为代表的第三代界面库

QT使用了一种用QML这种描述性脚本语言配置界面的办法,这种开发界面的方法在效率上与前面两代产品有很大的提高,学习成本也低了很多。

在这个阶段上,如果你要创建一个窗口,只需要在QML的编辑器中进行可视化的创建修改就可以了,QT会编译相应的QML文件到你的应用程序中,某种程度上说,你甚至不需要懂C++也可以完成界面的基本开发。

四、以XML配置为特征的第四代界面库

在Windows平台上,有WPF,Silverlight这样的技术,也有XUL(FireFox所采用的UI引擎)这样的界面库。现在很多的国产界面库也算作是这种类型,比如最近比较流行的DUILIB。它们的主要特征是:界面开发与逻辑控制相分离,用XML来配置界面,XML的一个节点一般就是一种控件,节点上的各个属性控制控件的各种特征,比如位置,图片等等。而用另外一种语言作为对界面元素处理的逻辑控制,比如XUL用脚本语言JavaScript,WPF,Silverlight用C#,DUILIB则直接用了C++。

这个阶段上,如果你要配置一个窗口可能只需要在XML(WPF和Silverlight是XAML)里声明一个元素,比如

<window x=”0” y=”0” width=”400” height=”300” background=”bg.png”></window>

类似于上面这样的一句简单描述,就完成了一个位于屏幕左上角(0,0)起始位置,宽度为400,高度为300,背景图片是bg.png的窗口的配置,注意这里说的是配置,而不是创建,因为创建需要在UI引擎解析完XML以后才会完成。



其实界面库的发展跟计算软硬件技术的发展有着很大关系,随着软件复用性的提高,UI元素的复用性也在不断提高。随着硬件技术的发展,更快的CPU,更大的内存,使得我们在做一些以前看上去效率比较低的处理界面的方式也具有相对良好的性能,但是又同时拥有了更好的灵活性。



现在的互联网客户端一般都会有自己的界面库,也有可能采用一些开源的界面库自己修改。据我说知QQ用的是自己开发的界面库,PPS用的是DUILIB,最近翻了一下新出的微信PC客户端,里面居然也有DUILIB的授权文件,因为界面库的开发算是客户端开发里相对比较有技术含量的东西,因而难度也相对大一点,能流行开的第四代C++界面库其实并不多,如果大家有兴趣可以自行研究。



第二篇就到这里,再往后我要介绍一下Windows界面开发的基础,就是GDI这个东西,还会简单介绍一下GDI的常见函数和使用方法,以及常见的坑。

多谢观赏!
...全文
6021 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
w_xxxbbb 2015-04-06
  • 打赏
  • 举报
回复
引用 13 楼 wyx100 的回复:
[quote=引用 3 楼 weiym 的回复:] 现在搞Windows客户端开发的不多了, 呵呵 http://www.cppblog.com/weiym/archive/2014/07/26/207819.html
顶[/quote] 再顶。
程序员鼓励师 2015-04-05
  • 打赏
  • 举报
回复
wyx100 2015-04-04
  • 打赏
  • 举报
回复
引用 3 楼 weiym 的回复:
现在搞Windows客户端开发的不多了, 呵呵 http://www.cppblog.com/weiym/archive/2014/07/26/207819.html
xiaocongzhi 2015-04-04
  • 打赏
  • 举报
回复
ccvoid_void 2015-04-03
  • 打赏
  • 举报
回复
同顶。不过确实,MFC的好处在于学习起来资料多,学了MFC后,看别的界面库,瞬间方便很多了。缺点就是。。MFC的功能确实不太够了。 http://bbs.csdn.net/topics/391006529 之前上传的一个用WIN32,基于GDI的虚拟按钮的进制转换器DEMO,交流交流。
oldmtn 2015-03-31
  • 打赏
  • 举报
回复
不错,顶一个..一个WINDOWS程序员
Eleven 2015-03-30
  • 打赏
  • 举报
回复
感谢分享~~
china_jeffery 2015-03-30
  • 打赏
  • 举报
回复
介绍了不同领域所要用到技术会比较好
洗洗睡去 2015-03-29
  • 打赏
  • 举报
回复
引用 5 楼 lx624909677 的回复:
[quote=引用 1 楼 sunnyloves 的回复:] 1.mfc做的比较多,最近在看qt,的确像你说的,qt思路比mfc领先一代,简单的界面配置起来几乎可以不用懂c++,mfc应该是历史的包袱太多了,大象飞不起来了。 2.duilib似乎国内迅雷的blit做的很不错,还有我在csdn上看到的炫彩也还可以。不过他们的问题都是文档太少,真的做大型软件,可能开发起来没mfc效率高,毕竟mfc文档非常详细了。 3.建议整理成博客,帖子的话很快就找不到了 4.期待第三篇
QT除了帮助文档。有木有好的学习资料推荐下![/quote]惭愧了 我也就是学帮助文档的
lx624909677 2015-03-29
  • 打赏
  • 举报
回复
引用 1 楼 sunnyloves 的回复:
1.mfc做的比较多,最近在看qt,的确像你说的,qt思路比mfc领先一代,简单的界面配置起来几乎可以不用懂c++,mfc应该是历史的包袱太多了,大象飞不起来了。 2.duilib似乎国内迅雷的blit做的很不错,还有我在csdn上看到的炫彩也还可以。不过他们的问题都是文档太少,真的做大型软件,可能开发起来没mfc效率高,毕竟mfc文档非常详细了。 3.建议整理成博客,帖子的话很快就找不到了 4.期待第三篇
QT除了帮助文档。有木有好的学习资料推荐下!
这不是鸭头 2015-03-28
  • 打赏
  • 举报
回复
为什么不再继续写下去了?
weiym 2015-02-14
  • 打赏
  • 举报
回复
现在搞Windows客户端开发的不多了, 呵呵 http://www.cppblog.com/weiym/archive/2014/07/26/207819.html
zhousitiaoda 2015-02-13
  • 打赏
  • 举报
回复
迅雷的BOLT感觉也不怎么样,不开源,没文档(渣渣文档等于没有),做出来的效果感觉也不怎样。好用的影音软件UI倒是其次,别整一堆东西,广告满天飞,搜索个资源,点个按钮链接卡个几秒就行。
洗洗睡去 2015-02-13
  • 打赏
  • 举报
回复
1.mfc做的比较多,最近在看qt,的确像你说的,qt思路比mfc领先一代,简单的界面配置起来几乎可以不用懂c++,mfc应该是历史的包袱太多了,大象飞不起来了。 2.duilib似乎国内迅雷的blit做的很不错,还有我在csdn上看到的炫彩也还可以。不过他们的问题都是文档太少,真的做大型软件,可能开发起来没mfc效率高,毕竟mfc文档非常详细了。 3.建议整理成博客,帖子的话很快就找不到了 4.期待第三篇
Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序。它提供了很多方面的功能,比如依赖注入、面向方面编程(AOP)、数据访问抽象及ASP.NET扩展等等。Spring.NET以Java版的Spring框架为基础,将Spring.Java的核心概念与思想移植到了.NET平台上。 第一章 序言 第简介 2.1.概述 2.2.背景 2.3.模块 2.4.许可证信息 2.5.支持 第三章 背景 3.1.控制反转 第一部分 核心技术 第四章 对象、对象工厂和应用程序上下文 4.1.简介 4.2.IObjectFactory,IApplicationContext和IObjectDefinition接口介绍 4.2.1.The IObjectFactory和IApplicationContext 4.2.2.对象定义 4.2.3.对象的创建 4.2.3.1.通过构造器创建对象 4.2.3.2.通过静态工厂方法创建对象 4.2.3.3.通过实例工厂方法创建对象 4.2.4.泛型类的对象创建 4.2.4.1.通过构造器创建泛型类的对象 4.2.4.2.通过静态工厂方法创建泛型类的对象 4.2.4.3.通过实例工厂方法创建泛型类的对象 4.2.5.对象标识符(id和name) 4.2.6.Singleton和Prototype 4.3.属性,协作对象,自动装配和依赖检查 4.3.1.设置对象的属性和协作对象 4.3.2.构造器参数解析 4.3.2.1.根据参数类型匹配构造器参数 4.3.2.2.根据参数索引匹配构造器参数 4.3.2.3.根据名称匹配构造器参数 4.3.3.详细讨论对象属性和构造器参数 4.3.3.1.设置空值 4.3.3.2.设置集合值 4.3.3.3.设置泛型集合的值 4.3.3.4.设置索引器属性 4.3.3.5.内联对象定义 4.3.3.6.idref节点 4.3.3.7.引用协作对象 4.3.3.8.value和ref节点的简短格式 4.3.3.9.复合属性名 4.3.4.方法注入 4.3.4.1.查询方法注入 4.3.4.2.替换任意方法 4.3.5.引用其他对象或类型的成员 4.3.5.1.使用对象或类的属性值进行注入 4.3.5.2.使用字段值进行注入 4.3.5.3.使用方法的返回值进行注入 4.3.6.IFactoryObject接口的其它实现 4.3.6.1.Log4Net 4.3.7.使用depends-on 4.3.8.自动装配协作对象 4.3.9.检查依赖项 4.4.类型转换 4.4.1.枚举类型的转换 4.4.2.内置的类型转换器 4.4.3.自定义类型转换器 4.4.3.1.使用CustomConverterConfigurer类 4.5.自定义对象的行为 4.5.生命周期接口 4.5.1.1.IInitializingObject接口和init-method属性 4.5.1.2.IDisposable接口和destroy-method属性 4.5.2.让对象了解自己的容器 4.5.2.1.IObjectFactoryAware接口 4.5.2.2.IObjectNameAware接口 4.5.3.IFactoryObject接口 4.6.抽象与子对象定义 4.7.与IObjectFactory接口交互 4.7.1.获得IFactoryObject对象本身,而非其产品 4.8.使用IObjectPostProcessor接口自定义对象 4.9.使用IObjectFactoryPostProcessor定制对象工厂 4.9.1.PropertyPlaceholderConfigurer类 4.9.1.1.使用环境变量进行替换 4.9.2.PropertyOverrideConfigurer类 4.10.使用alias节点为对象添加别名 4.11.IApplicationContext简介 4.12.配置应用程序上下文 4.12.1.注册自定义解析器 4.12.2.创建自定义资源处理器 4.12.3.配置类型别名 4.12.4.注册类型转换器 4.13.IApplicationContext接口的扩展功能 4.13.1.上下文继承 4.13.2.使用IMessageSource接口 4.13.3.在Spring.NET内部使用资源 4.13.4.松耦合事件模型 4.13.5.IApplicationContext的事件通知 4.14.定制IApplicationContex中对象的行为 4.14.1.IApplicationContextAware标识接口 4.14.2.IObjectPostProcessor接口 4.14.3.IObjectFactoryPostProcessor接口 4.14.4.PropertyPlaceholderConfigurer类 4.15.从其它文件中导入对象定义 4.16.服务定位器访问 第五章. IObjectWrapper接口和类型转换 5.1.简介 5.2.使用IObjectWrapper接口管理对象 5.2.1.读、写普通及嵌套的属性 5.2.2.其它功能 5.3.类型转换 5.3.1.转换枚举类型 5.4.内置类型转换器 第六章. IResource接口 6.1.简介 6.2.IResource接口 6.3.内置的IResource实现类 6.4.IResourceLoader接口 6.5.IResourceLoaderAware接口 6.6.应用程序上下文和IResource路径 第七章. 多线程和并发操作 7.1.简介 7.2.线程本地存储 7.3.同步基础 7.3.1.ISync 7.3.2.SyncHolder 7.3.3.Latch 7.3.4.Semaphore 第八章. 对象池 8.1.简介 8.2.接口和实现 第九章. Spring.NET杂记 9.1.简介 9.2.PathMatcher 9.2.1.通用规则 9.2.2.匹配文件名 9.2.3.匹配子目录 9.2.4.大小写需要考虑,斜线可以任意 第十章. 表达式求值 10.1.简介 10.2.表达式求值 10.3.语言参考 10.3.1.文字表达式 10.3.2.属性,数组,列表,字典,索引器 10.3.2.1.定义内联的数组、列表和词典 10.3.3.方法 10.3.4.操作符 10.3.4.1.关系操作符 10.3.4.2.逻辑操作符 10.3.4.3.算术运算符 10.3.5.赋值 10.3.6.表达式列表 10.3.7.类型 10.3.8.类型注册 10.3.9.构造器 10.3.10.变量 10.3.10.1.'#this'和'#root'变量 10.3.11.三元操作符(If-Then-Else) 10.3.12.列表的投影(Projection)和选择(Selection) 10.3.13. 集合处理器和聚合器 10.3.13.1.Count聚合器 10.3.13.2.Sum聚合器 10.3.13.3.Average聚合器 10.3.13.4.Minimum聚合器 10.3.13.5.Maximum聚合器 10.3.13.6.nonNull处理器 10.3.13.7.distinct处理器 10.3.13.8.sort处理器 10.3.14.引用容器中的对象 10.3.15.Lambda表达式 10.3.16.空目标 10.4.本章使用的示例类型 第十一章. 验证框架 11.1.简介 11.2.用法示例 11.3.验证对象组 11.4.验证对象 11.4.1.条件验证对象 11.4.2.必需性验证对象 11.4.3.正则表达式验证对象 11.4.4.通用验证对象 11.4.5.条件型验证 11.5.验证行为 11.5.1.错误消息行为 11.5.2.通用行为 11.6.引用验证对象 11.7.在ASP.NET中的使用技巧 11.7.1.显示验证错误 11.7.1.1.配置错误显示类 第十章. 使用Spring.NET进行面向方面的编程 12.1.简介 12.1.1.AOP基本概念 12.1.2.Spring.NET AOP的功能 12.1.3.Spring.NET的AOP代理 12.2.Spring.NET中的切入点 12.2.1.概念 12.2.2.切入点的操作 12.2.3.Spring.NET提供的切入点实现类 12.2.3.1.静态切入点 12.2.3.2.动态切入点 12.2.4.自定义切入点 12.3.Spring.NET的通知类型 12.3.1.通知的生命周期 12.3.2.通知类型 12.3.2.1.拦截环绕通知 12.3.2.2.前置通知 12.3.2.3.异常通知 12.3.2.4.后置通知 12.3.2.5.引入通知 12.4.Spring.NET中的Advisor 12.5.使用ProxyFactoryObject创建AOP代理 12.5.1.基本原理 12.5.2.ProxyFactoryObject的属性 12.5.3.代理接口 12.5.4.代理一个类 12.6.使用ProxyFactory类以编程方式创建AOP代理 12.7.管理目标对象 12.8.使用“自动代理”功能 12.8.1.自动代理对象的定义 12.8.1.1.ObjectNameAutoProxyCreator 12.8.1.2.DefaultAdvisorAutoProxyCreator 12.8.1.3.AbstractAutoProxyCreator 12.8.2.使用特性驱动的自动代理 12.9.使用TargetSources 12.9.1.动态切换TargetSource 12.9.2.池化TargetSource 12.9.3.PrototypeTargetSource 12.10.定义新的通知类型 12.11.参考资源 第十三章.通用日志抽象层 13.1.简介 13.1.1.Logging API 13.2.实现与配置 13.2.1.控制台Logger 13.3.Log4Net 第部分. 中间层数据访问 第十四章. 事务管理 14.1.简介 14.2.动机 14.3.核心接口 14.4.用事务进行资源同步 14.4.1.高层次方法 14.4.2.低层次方法 14.5.声明式事务管理 14.5.1.理解Spring.NET声明式事务管理的实现 14.5.2.第一个例子 14.5.3.Transaction特性的设置 14.5.4.通过AutoProxyCreator使用声明式事务 14.5.5.通过TransactionProxyFactoryObject使用声明式事务 14.5.6. 通过ProxyFactoryObject使用声明式事务 14.5.7. Using Abstract object definitions 14.5.8. Declarative Transactions using ProxyFactoryObject 14.6. 编程方式的事务管理 14.6.1.使用TransactionTemplate 14.6.2.使用IPlatformTransactionManager 14.7.选择编程方式还是声明方式 第十五章. 数据访问对象 15.1.简介 15.2.统一的异常体系 15.3.为数据访问对象提供的统一抽象基类 第十六章. DbProvider 16.1.简介 16.1.1.IDbProvider和DbProviderFactory 16.1.2. XML配置 16.1.3.管理连接字符串 第十七章. 使用ADO.NET进行数据访问 17.1.简介 17.2.动机 17.3.Provider抽象 17.3.1.创建IDbProvider类型的实例 17.4.命名空间 17.5.数据访问的方式 17.6.AdoTemplate简介 17.6.1.执行回调 17.6.2.在.NET 2.0中执行回调 17.6.3. .NET 1.1 17.6.4.AdoTemplate方法指南 17.7.异常翻译 17.8.参数管理 17.8.1. IDbParametersBuilder 17.8.2. IDbParameters 17.9. Mapping DBNull values 17.10. Basic data access operations 17.10.1. ExecuteNonQuery 17.10.2. ExecuteScalar 17.11. Queries and Lightweight Object Mapping 17.11.1. ResultSetExtractor 17.11.2. RowCallback 17.11.3. RowMapper 17.11.4. Query for a single object 17.11.5. Query using a CommandCreator 17.12. DataTable and DataSet 17.12.1. DataTables 17.12.2. DataSets 17.13. Deriving Stored Procedure Parameters 17.14. Database operations as Objects 17.14.1. AdoNonQuery 17.14.2. AdoQuery 17.14.3. MappingAdoQuery 17.14.4. Stored Procedure 17.14.5. DataSetOperation 18. ORM集成 18.1. 简介 第三部分. Web框架 第十九章. Web框架 19.1.简介 19.2.自动装载应用程序上下文和应用程序上下文嵌套 19.2.1. 配置 19.2.2.上下文嵌套 19.3.为ASP.NET页面进行依赖注入 19.3.1.为Web控件进行依赖注入 19.4.Master Page 19.4.1.将子页面与Master Page关联 19.5.双向数据绑定 19.5.1.数据绑定的后台实现 19.5.1.1.绑定方向 19.5.1.2.Formatters 19.5.1.3.类型转换 19.5.1.4.数据绑定事件 19.6.本地化 19.6.1.使用Localizer进行自动本地化(“推”模型) 19.6.2.使用Localizer 19.6.3.手动应用资源(“拉”模型的本地化) 19.6.4.在Web应用程序中进行图像本地化 19.6.5.全局资源 19.6.6.用户语言文化管理 19.6.6.1. DefaultWebCultureResolver 19.6.6.2. RequestCultureResolver 19.6.6.3. SessionCultureResolver 19.6.6.4. CookieCultureResolver 19.6.7.更改语言文化 19.7.结果映射 19.8.客户端脚本 19.8.1.在HTML的head节点内注册客户端脚本 19.8.2.向节点中添加CSS定义 19.8.3.全局目录(Well-Known Directories) 第四部分. 服务 第十章. .NET Remoting 20.1.简介 20.2.在服务端发布SAO 20.2.1.SAO Singleton 20.2.2.SAO SingleCall 20.2.3.IIS应用程序配置 20.3.在客户端访问SAO 20.4.CAO 最佳实践 20.5.在服务端注册CAO 20.5.1.向CAO对象应用AOP通知 20.6.在客户端访问CAO 20.6.1.向客户端的CAO对象应用AOP通知 20.7. XML Schema for configuration 20.8.参考资源 第十一章. .NET企业服务 21.1.简介 21.2.服务组件 21.3.服务端 21.4.客户端章. Web服务 22.1.服务端 22.1.1.消除对.asmx文件的依赖 22.1.2.向web服务中注入依赖项 22.1.3.将PONO发布为web服务 22.1.4.将AOP代理发布为web服务 22.1.5.客户端的问题 22.2.客户端 22.2.1.WebServiceProxyFactory 22.2.2.WebServiceClientFactory 第十三章. Windows后台服务 23.1.备注 23.2.简介 23.3.Spring.Services.WindowsService.Process.exe应用程序 23.3.1.安装 23.3.2.配置 23.4.将应用程序上下文发布为Windows服务 23.4.1.service.config 23.4.1.1.让应用程序了解自身的位置 23.4.2.watcher.xml - 可选的配置 23.4.3.bin目录 - 可选 23.5.自定义或扩展 23.5.1. .config文件 第五部分. 与Visual Studio.NET集成 第十四章. 与Visual Studio.NET集成 24.1.XML编辑与验证 24.2.XML Schema的版本 24.3.集成API文档 第六部分. 快速入门程序 第十五章. IoC快速入门 25.1.简介 25.2.Movie Finder 25.2.1.开始建立MovieFinder应用程序 25.2.2.第一个对象定义 25.2.3.属性注入 25.2.4.构造器参数注入 25.2.5.总结 25.2.6.日志 25.3.应用程序上下文和IMessageSource接口 25.3.1.简介 25.4.应用程序上下文和IEventRegistry接口 25.4.1.简介 25.5.对象池示例 25.5.1.实现Spring.Pool.IPoolableObjectFactory 25.5.2.使用池中的对象 25.5.3.利用executor执行并行的grep 25.6.AOP 第十六章. AOP指南 26.1.简介 26.2.基础知识 26.2.1.应用通知 26.2.2.使用切入点-基本概念 26.3.深入探讨 26.3.1.其它类型的通知 26.3.1.1.前置通知 26.3.1.2.后置通知 26.3.1.3.异常通知 26.3.1.4.引入(mixins) 26.3.1.5.通知链 26.3.1.6.配置通知 26.3.2.使用特性定义切入点 26.4.The Spring.NET AOP Cookbook 26.4.1.缓存 26.4.2.性能监视 26.4.3.重试规则 Spring.NET AOP最佳实践 第十七章. .NET Remoting快速入门 27.1.简介 27.2.Remoting实例程序 27.3.实现 27.4.运行程序 27.5.Remoting Schema 27.6.参考资源 第十八章. Web框架快速入门 28.1.简介十九章. SpringAir - 参考程序 29.1.简介 29.2.架构 29.3.实现 29.3.1.业务层 29.3.2.服务层 29.3.3.Web层 29.4.总结 第三十章. 数据访问快速入门 30.1.简介 第三十一章. 事务管理快速入门 31.1.简介 31.2.应用程序概述 31.2.1.接口 第七部分. Java开发人员必读 第三十章. Java开发人员必读 32.1.简介 32.2.Beans和Objects 32.3.PropertyEditor和TypeConverter 32.4.ResourceBundle和ResourceManager 32.5.异常 32.6.应用程序配置 32.7.AOP框架

1,649

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧