C语言精要(第一章:C语言简介)

1.1  编程语言简介

    (1)机器语言。机器语⾔是直接通过⼗六进制数表⽰当前处理器架构的机器指令码。指令码包含了当前指令的功能(⽐如算术逻辑运算、移位、分⽀、中断、I/O等)、寄存器、⽴即数等多种元素。每种处理器架构所对应的机器码的字节长度也各不相同,有些是固定长度的(⽐如ARM、MIPS等架构),有些是可变长度的(⽐如x86架构)。

    (2)汇编语言。汇编语⾔(Assembly Language)通过简单的指令助记符(memonics)来表⽰对应机器指令的功能、寄存器编号、⽴即数(immediates)等元素。汇编语⾔是对机器指令的简单抽象,通过汇编器(assembler)可以将汇编语句翻译成对应的机器指令码。

    (3)高级语言。⾼级语⾔的表达形式更为抽象且贴近我们⽇常的语⾔表述。⽽且,⾼级语⾔⽐起汇编语⾔往往更具有表达⼒,且拥有更加丰富的语法特性,以便将程序进⾏结构化和模块化。⽐如,⾼级语⾔具有⾃定义变量标识符、⾃定义数据结构、分⽀与循环、更形象⾃然的表达式等。⾼级语⾔⼀般通过编译器(compiler)可直接将表达式翻译为对应的机器指令码;也可以将⾼级语⾔先翻译为中间语⾔(类似于汇编,但可能⽐汇编适⽤范围更⼴、更利于跨平台的字节码),最后将中间语⾔翻译为最终的机器指令码。C语言是一种高级语言。对于⾼级语⾔来说,从表达上又可分为命令式编程语⾔(imperative programming language)和陈述型编程语⾔(declarative programming language)。命令式语⾔主要包括过程式(procedural)、结构化(structured)以及⾯向对象(object-oriented)的编程语⾔;陈述型编程语⾔主要包括函数式(functional)以及逻辑型(logical)编程语⾔。⽽C语⾔则属于结构化的命令式编程语⾔。不过现在很多命令式编程语⾔也包含了⼀些函数式编程语⾔的特征。

1.2  C语言的历史

    1963年,英国剑桥大学推出了CPL(Combined Programming Langurage)语言,它是一种无类型(typeless)编程语言。1967年,剑桥大学的Matin Richards在CPL的基础上开发出了BCPL(Basic Combined Programming Language)语言。1969年,美国贝尔实验室的计算机科学家肯·汤普逊(Ken Thompson)在丹尼斯·利奇(Dennis Ritchie)的支持下设计出了B语言。1969年到1972年,Dennis Ritchie为了重新实现Unix操作系统,在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。

1.3  C语言的发展

    1989年,美国国家标准协会(ANSI)对C语言进行了标准化,这就是ANSI C。1990年,国际标准化组织(ISO)采纳了ANSI C,标准号为ISO/IEC 9899: 1990,这就是ISO C。ANSI C和ISO C是完全相同的标准,既可以称为C89,又可以称为C90。

    1994年,ANSI/ISO联合委员会开始着手修订C标准。1999年,这个委员会正式发布了ISO/IEC 9899:1999标准,即C99标准。C99标准引入了许多特性,包括内联函数(inline functions)、可变长度的数组、灵活的数组成员(用于结构体)、复合字面量、指定成员的初始化器、对IEEE754浮点数的改进、支持不定参数个数的宏定义,在数据类型上还增加了long long int以及复数类型。委员会的目标还不是添加新特性,而是为了达到新的目标。第一个目标是,支持国际化编程,例如提供多种方法处理国际字符集。第二个目标是,“调整现有实践致力于解决明显的缺陷”,因此,在遇到需要将C移植至64位处理器时,委员会根据现实需要来添加标准。第三个目标是,为适应科学和工程项目中的关键数字计算,提高C的适应性,让C比Fortran更有竞争力。虽然C99标准已经发布了很长时间,但并非所有的编译器都完全实现了C99标准的内容,即便是GCC和Clang编译器也只支持到90%以上,而微软的Visual Studio中的C编译器只能支持到70%左右。

    2007年,C语言标准委员会又开始修订C语言标准,直到2011年正式发布了ISO/IEC 9899:2011,即C11标准。C11标准新引入的特征尽管没C99相对C90引入的那么多,但是这些也都十分有用,比如:字节对齐说明符、泛型机制(generic selection)、对多线程的支持、静态断言、原子操作以及对Unicode的支持。此次,委员会提出了一些新的指导原则。出于对当前编程安全的担忧,不那么强调“信任程序员”的目标了。而且,供应商并未像C90那样很好地接受和支持C99,这使得C99的一些特性成为C11的可选项。因为委员会认为,不应要求服务小型机市场的供应商支持其目标环境中用不到的特性。另外需要强调的是,修订标准的原因不是因为原标准不能用,而是需要跟进新的技术。例如,新标准添加了可选项支持当前多处理器的计算机。

1.4  为什么要使用C语言

    在过去40多年里,C语言已经成为最重要、最流行的编程语言之一。它的成长归功于使用过的人都对它很满意。过去20多年里,虽然出现了很多新兴的编程语言(例如C++、Objective C、Java、Go、Swift、Rust等),但是C语言仍凭借自身实力做到了屹立不倒,在最新的世界编程语言排行榜(TOIBE)上,C语言仍然是数一数二的编程语言。

    使用C语言的理由:

    (1)可移植性。C是可移植的语言。这意味着,在一种系统中编写的C程序稍作修改甚至不用修改就能在其它系统运行。C语言被设计出来的一大初衷就是为了能将同一个源代码放到各个不同的平台运行。因此,如果我们的代码要在多种不同架构的处理器上运行的话,我们就得注意C语言标准规定了哪些特性是编译器必须遵守的,哪些特性是平台或编译器自己实现的。我们要尽量使用标准中已明文规定的编程规范,尽可能避免在不同平台可能会产生不同行为的语法特性。当然,由于上面提到的处理器种类太过多样,尤其在嵌入式开发领域,很多MCU用的还都是8位处理器,这种情况下C源代码就很难被移植到32位或64位系统下了。

    (2)可维护性。可维护性在实际工程项目的研发中非常重要。它体现在最初工程架构的设计、对各个功能模块的划分、相应的开发人员安排,还有后期的测试。一般来说,现在一个工程如果是从无到有进行开发的话会采用螺旋式开发模型。也就是说,一个项目启动后,可以先做一个功能简单但能正常工作的产品原型。然后在此基础上不断地为它增加更多功能,或对之前的功能进行修改。在此期间,我们如何对整个工程进行模块化划分,从而能安排不同开发人员针对不同功能模块进行开发就变得尤为重要。另外,在工程开发过程中,如果有人员流动,那么如何将即将离职的开发人员手中的工作交付给新人也关系到整个项目的进展。因此,一个良好的C语言代码应该具有可读性、良好的文档化注释风格,以及较详细的设计文档。对于一个较大的工程项目来说,开发人员不仅仅需要把自己的代码写好,而且要写得能让别人看懂,并且要做好详细的设计文档,这样才能把项目风险降低。

    (3)可延展性。大家或许已经知道,像微软的Windows操作系统由数千名工程师合作研发;Linux操作系统对外开源,参与其中的研发人员也有数百上千人。如果我们在一个开发团队中负责一个需要由多人合作开发的工程项目,那么我们写的功能模块需要与其他人写的功能模块进行对接。所以,我们在开发一个较大工程项目时,需要协调好各自对外的模块接口(Application Program Interface,API)。由于C语言没有全局名字空间(namespace)这个概念,所以命名一个对外接又也是非常重要的,否则可能会与其他功能模块的接又名发生冲突。

    (4)性能。性能是提升程序使用者效率和生产力的体现。一个应用程序的性能越高,那么计算一个任务所花费的时间越短,也越节省计算机的耗电。而对于如何提升性能,一方面需要程序员对处理器架构、硬件特性有一定了解;另一方面需要程序员拥有比较丰富的算法知识,能针对实际需求灵活采用高效的算法。而像C语言这种十分接近硬件底层的高级编程语言,能极大限度地发挥处理器的特长,从而达到高效的运行性能。

1.5  C语言的缺点

    人无完人,金无足赤。C语言也有一些缺点。例如,要享受用C语言自由编程的乐趣,就必须承担更多的责任。特别是,C语言使用指针,而涉及指针的编程错误往往难以察觉。有句话说的好:想拥有自由就必须时刻保持警惕。

1.6  C语言的应用范围

    虽然这些年来C++和JAVA非常流行,但是C语言仍是软件业中的核心技能。在最想具备的技能中,C语言通常位居前十。特别是,C语言已成为嵌入式系统编程的流行语言。也就是说,越来越多的汽车、照相机、DVD播放机和其他现代化设备的微处理器都用C语言进行编程。除此之外,C语言还从长期被FORTRAN独占的科学编程领域分得一杯羹。最终,作为开发操作系统的卓越语言,C在Linux开发中扮演着极其重要的角色。因此,在进入21世纪的第2个10年中,C语言仍然保持着强劲的势头。

1.7  主流C语言编译器介绍

    对于当前主流桌面操作系统而言,可使用Visual C++、GCC以及LLVM Clang这三大编译器。其中,Visual C++(简称MSVC)只能用于Windows操作系统;其余两个,除了可用于Windows操作系统之外,主要用于Unix/Linux操作系统。像现在很多版本的Linux都默认使用GCC作为C语言编译器。而像FreeBSD、macOS等系统默认使用LLVM Clang编译器。由于当前LLVM项目主要在Apple的主推下发展的,所以在macOS中,Clang编译器又被称为Apple LLVM编译器。MSVC编译器主要用于Windows操作系统平台下的应用程序开发,它不开源。用户可以使用VisualStudio Community版本来免费使用它,但是如果要把通过Visual Studio Community工具生成出来的应用进行商用,那么就得好好阅读一下微软的许可证和说明书了。而使用GCC与Clang编译器构建出来的应用一般没有任何限制,程序员可以将应用程序随意发布和进行商用。不过由于MSVC编译器对C99标准的支持就十分有限,加之它压根不支持任何C11标准,所以本书的代码例子不会针对MSVC进行描述。所幸的是,Visual Studio Community 2017加入了对Clang编译器的支持,官方称之为——Clang with Microsoft CodeGen,当前版本基于的是Clang 3.8。也就是说,应用于Visual Studio集成开发环境中的Clang编译器前端可支持Clang编译器的所有语法特性,而后端生成的代码则与MSVC效果一样,包括像long整数类型在64位编译模式下长度仍然为4个字节,所以各位使用的时候也需要注意。

    而在嵌入式系统方面,可用的C语言编译器就非常丰富了。比如用于Keil公司51系列单片机的Keil C51编译器;当前大红大紫的Arduino板搭载的开发套件,可用针对AVR微控制器的AVR GCC编译器;ARM自己出的ADS(ARM Development Suite)、RVDS(RealView Development Suite)和当前最新的DS-5 Studio;DSP设计商TI(Texas Instruments)的CCS(Code Composer Studio);DSP设计商ADI(Analog Devices,Inc.)的Visual DSP++编译器,等等。通常,用于嵌入式系统开发的编译工具链都没有免费版本,而且一般需要通过国内代理进行购买。所以,这对于个人开发者或者嵌入式系统爱好者而言是一道不低的门槛。不过Arduino的开发套件是可免费下载使用的,并且用它做开发板连接调试也十分简单。Arduino所采用的C编译器是基于GCC的。还有像树莓派(Raspberry Pi)这
种迷你电脑可以直接使用GCC和Clang编译器。此外,还有像nVidia公司推出的Jetson TK系列开发板也可直接使用GCC和Clang编译器。树莓派与Jetson TK都默认安装了Linux操作系统。在嵌入式领域,一般比较低端的单片机,比如8位的MCU所对应的C编译器可能只支持C90标准,有些甚至连C90标准的很多特性都不支持。因为它们一方面内存小,ROM的容量也小;另一方面,本身处理器机能就十分有限,有些甚至无法支持函数指针,因为处理器本身不包含通过寄存器做间接过程调用的指令。而像32位处理器或DSP,一般都至少能支持C99标准,它们本身的性能也十分强大。而像ARM出的RVDS编译器甚至可用GNU语法扩展。

1.8  GNU规范的语法扩展

    GNU是一款能用于构建类Unix操作系统的计算机软件合集,由自由软件之父Richard Stallman开创,于1983年9月27日对外发布。GNU完全由自由软件(free software)构成。GNU语法扩展源自于GCC编译器,在1987年发布1.0版本,称为GNU C Compiler。随后,GCC编译器前端支持了C++、Objective-C/C++、Fortran、Ada、Java以及最近跃升的Go等编程语言,因此现在GCC被称为GNU Compiler Collection。由于在20世纪90年代,GNU C编译器就对C90标准做了相当多的语法扩展,包括复合字面量、匿名结构体和数组、可指定的初始化器等,这些语法扩展被广泛使用,尤其是大量用于Linux内核代码中,因此C99标准将这些语法特性全都列入标准之中。
    正因为GCC本身是开源自由软件,因此很多商用编译器也基于GCC进行扩展。像ARM的RVCT(RealView Compiler Toolkit)本身就支持GNU扩展。还有不少开发平台本身就直接使用GCC编译工具。由于有不少大公司顶级开发人员的参与,因此GCC编译器的目标代码优化能力相当高,而且还支持许多不同的处理器。所以,GCC当前被广泛使用并博得开发者的好评。像Linux操作系统基本默认使用GCC作为默认编译器,包括Android的NDK开发工具一开始也是如此。
    然而,由于GCC基于比较严格的GPL许可证,许多大型商业开发商对它望而却步。该许可证允许使用者免费使用软件,但是要求不能随意对它进行篡改并重新发布。如果开发者对它进行篡改,然后发布自己修改之后的软件,那么必须要把自己修改的那部分也开源出来。因此,在2003年诞生了一个LLVM开源项目,基于更为宽松的BSD许可证,其编译器称为Clang。BSD许可证允许开发者随意对软件进行修改并重新发布,甚至可以将修改过的版本作为自主版权,因而这个许可证深受大公司的欢迎。现在Apple对LLVM项目的投入非常大。macOS上的开发工具Xocde从4.0版本起就开始使用Clang编译工具链,随后Apple将自己改写的Clang编译器称为Apple LLVM。当前最新的Xcode 8所使用的Apple LLVM版本为8.x。而当前Android NDK也支持了Clang编译器工具链。Clang编译器并非基于GCC,它是从头开始写的。但是它的目标是尽量与GCC编译器兼容,所以Clang编译器包含大部分GNU语法扩展,除此之外还含有它自己特有的C语言扩展。当然也有一些特性是GCC含有而Clang不具备的,不过这些特性一般很少使用。
    我们现在可以看到GNU语法扩展适用性十分广泛。如果读者当前在做Linux/Unix或Windows上的C语言编程开发,或者是在开发macOS/iOS应用,又或者是在开发Android应用,那么完全可以毫无顾忌地使用GNU语法扩展。Clang编译器已经包含了大部分GNU语法扩展,因此在介绍GCC语法扩展的时候,如果当前特性Clang不支持,则会指明。

1.9  使用C语言的流程步骤

    C是编译型语言。如果之前使用过编译型语言(如,Pascal、Fortran、C++、Go、Rust),就会很熟悉组建C程序的几个基本步骤。但是,如果以前使用的是解释型语言(如,Basic、JavaScript、Java、C#、Python、Ruby)或面向图形界面语言(如,Visual Basic),或者甚至没接触过任何编程语言,就有必要学习如何编译。

    C语言编程一般分为7步:

    第1步:定义程序的目标。

    在动手写程序之前,要在脑中有清晰的思路。想要程序去做什么首先自己要明确自己想做什么,思考你的程序需要哪些信息,要进行哪些计算和控制,以及程序应该要报告什么信息。在这一步骤中,不涉及具体的计算机语言,应该用一般术语来描述问题。

    第2步:设计程序。

    对程序应该完成什么任务有概念性的认识后,就应该考虑如何用程序来完成它。例如,用户界面应该是怎样的?如何组织程序?目标用户是谁?准备花多长时间来完成这个程序?
    除此之外,还要决定在程序(还可能是辅助文件)中如何表示数据,以及用什么方法处理数据。学习C语言之初,遇到的问题都很简单,没什么可选的。但是,随着要处理的情况越来越复杂,需要决策和考虑的方面也越来越多。通常,选择一个合适的方式表示信息可以更容易地设计程序和处理数据。
    再次强调,应该用一般术语来描述问题,而不是用具体的代码。但是,你的某些决策可能取决于语言的特性。例如,在数据表示方面,C的程序员就比Pascal的程序员有更多选择。

    第3步:编写代码。

    设计好程序后,就可以编写代码来实现它。也就是说,把你设计的程序翻译成C语言。这里是真正需要使用C语言的地方。可以把思路写在纸上,但是最终还是要把代码输入计算机。这个过程的机制取决于编程环境,我们稍后会详细介绍一些常见的环境。一般而言,使用文本编辑器创建源代码文件。该文件中内容就是你翻译的C语言代码。程序清单1.1是一个C源代码的示例。

    程序清单1.1  C源代码示例

#include <stdio.h>

int main(void)
{
	int cats;
	printf("How many cats do you have?\n");
	scanf("%d", &cats);
	printf("So you have %d cat(s)!\n", cats);
	return 0;
}

在这一步骤中,应该给自己编写的程序添加文字注释。最简单的方式是使用C的注释工具在源代码中加入对代码的解释。

    第4步:编译。

    接下来的这一步是编译源代码。再次提醒读者注意,编译的细节取决于编程的环境,我们稍后马上介绍一些常见的编程环境。现在,先从概念的角度讲解编译发生了什么事情。
    前面介绍过,编译器是把源代码转换成可执行代码的程序。可执行代码是用计算机的机器语言表示的代码。这种语言由数字码表示的指令组成。如前所述,不同的计算机使用不同的机器语言方案。C编译器负责把C代码翻译成特定的机器语言。此外,C编译器还将源代码与C库(库中包含大量的标准函数供用户使用,如printf()和scanf())的代码合并成最终的程序(更精确地说,应该是由一个被称为链接器的程序来链接库函数,但是在大多数系统中,编译器运行链接器)。其结果是,生成一个用户可以运行的可执行文件,其中包含着计算机能理解的代码。
    编译器还会检查C语言程序是否有效。如果C编译器发现错误,就不生成可执行文件并报错。理解特定编译器报告的错误或警告信息是程序员要掌握的另一项技能。

    第5步:运行程序。

    传统上,可执行文件是可运行的程序。在常见环境(包括Windows命令提示符模式、UNIX终端模式和Linux终端模式)中运行程序要输入可执行文件的文件名,而其他环境可能要运行命令(如,在VAX中的VMS[2])或一些其他机制。例如,在Windows和Macintosh提供的集成开发环境(IDE)中,用户可以在IDE中通过选择菜单中的选项或按下特殊键来编辑和执行C程序。最终生成的程序可通过单击或双击文件名或图标直接在操作系统中运行。

    第6步:测试和调试程序。

    程序能运行是个好迹象,但有时也可能会出现运行错误。接下来,应该检查程序是否按照你所设计的思路运行。你会发现你的程序中有一些错误,计算机行话叫作bug。查找并修复程序错误的过程叫调试。学习的过程中不可避免会犯错,学习编程也是如此。因此,当你把所学的知识应用于编程时,最好为自己会犯错做好心理准备。随着你越来越老练,你所写的程序中的错误也会越来越不易察觉。
    将来犯错的机会很多。你可能会犯基本的设计错误,可能错误地实现了一个好想法,可能忽视了输入检查导致程序瘫痪,可能会把圆括号放错地方,可能误用C语言或打错字,等等。把你将来犯错的地方列出来,这份错误列表应该会很长。
    看到这里你可能会有些绝望,但是情况没那么糟。现在的编译器会捕获许多错误,而且自己也可以找到编译器未发现的错误。在学习本书的过程中,我们会给读者提供一些调试的建议。

    第7步:维护和修改代码。

    创建完程序后,你发现程序有错,或者想扩展程序的用途,这时就要修改程序。例如,用户输入以Zz开头的姓名时程序出现错误、你想到了一个更好的解决方案、想添加一个更好的新特性,或者要修改程序使其能在不同的计算机系统中运行,等等。如果在编写程序时清楚地做了注释并采用了合理的设计方案,这些事情都很简单。

1.10  C语言程序的组成

    C编程的基本策略是,用程序把源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码)。典型的C实现通过编译和链接两个步骤来完成这一过程。编译器把源代码转换成中间代码,链接器把中间代码和其他代码合并,生成可执行文件。C使用这种分而治之的方法方便对程序进行模块化,可以独立编译单独的模块,稍后再用链接器合并已编译的模块。通过这种方式,如果只更改某个模块,不必因此重新编译其他模块。另外,链接器还将你编写的程序和预编译的库代码合并。
    中间文件有多种形式。我们在这里描述的是最普遍的一种形式,即把源代码转换为机器语言代码,并把结果放在目标代码文件(或简称目标文件)中(这里假设源代码只有一个文件)。虽然目标文件中包含机器语言代码,但是并不能直接运行该文件。因为目标文件中储存的是编译器翻译的源代码,这还不是一个完整的程序。
    目标代码文件缺失启动代码(startup code)。启动代码充当着程序和操作系统之间的接口。例如,可以在MS Windows或Linux系统下运行IBM PC兼容机。这两种情况所使用的硬件相同,所以目标代码相同,但是Windows和Linux所需的启动代码不同,因为这些系统处理程序的方式不同。
    目标代码还缺少库函数。几乎所有的C程序都要使用C标准库中的函数。例如,concrete.c中就使用了printf()函数。目标代码文件并不包含该函数的代码,它只包含了使用printf()函数的指令。printf()函数真正的代码储存在另一个被称为库的文件中。库文件中有许多函数的目标代码。
    链接器的作用是,把你编写的目标代码、系统的标准启动代码和库代码这3部分合并成一个文件,即可执行文件。对于库代码,链接器只会把程序中要用到的库函数代码提取出来。

1.11  集成开发环境(IDE)和编辑器

   集成开发环境(IDE)提供了一整套的工具链,提供了从编写代码到编译程序和调试程序一条龙服务。而编辑器只提供了编写代码的功能,编译程序和调试程序要在命令行(也称终端)来做。

    大家可能会问,既然有了如此方便的集成开发环境,为什么还要学习编辑器和命令行呢?原因有二:

    (1)熟悉命令行是一项必要的技能。不要过于依赖IDE,在Linux/Unix这类操作系统上尤其如此。诚然,我们有Visual Studio、Eclipse、IDEA、NetBeans等方便的IDE可以用,但是,对于C语言编程的内部原理我们也需要了解,编辑器和命令行工具能为我们揭示其中的奥秘。编辑器分为基于图形用户界面(GUI)的编辑器和基于命令行(终端)的编辑器。比如,Windows上的记事本(notepad)和macOS上的文本编辑和Linux上的gedit就是一些具有基本功能的,基于图形用户界面的文本编辑器(当然,还有许多专门为编程而开发的文本编辑器)。基于命令行(终端)界面的编辑器有macOS和Linux上的nano/pico,当然,如果你愿意花更多的时间去学习vi/vim,也是不错的。在macOS/Linux上,C语言编译的任务用clang/gcc来完成,调试的任务用lldb/gdb来完成,这些都是基于命令行的工具。

    (2)命令行适合于远程开发和调试。比如,有一个程序的源代码需要(远程)修改,你总不能说,等我开个远程桌面,打开Visual Studio来修改吧,当然这样是可以的,但是对于服务器来说,太消耗资源了,效率也很低下,而且,很多服务器的操作系统根本就没有图形界面。这时候,开个ssh,使用命令行工具编辑、编译并调试就是理所当然的事了。

1.12  本书使用的开发环境

    操作系统是64位的Ubuntu Linux 18.10,编译器是Clang 7.0或GCC 8.2,集成开发环境使用的是安装了C/C++开发插件的Eclispe,当然,你可以直接使用Eclipse C/C++开发套件。

转载于:https://my.oschina.net/u/943779/blog/2245349

天梯(tianti) Java 轻量级的 CMS 解决方案-天梯。天梯是一个用 Java 相关技术搭建的后台 CMS 解决方案,用户可以结合自身业务进行相应扩展,同时提供了针对 dao、service 等的代码生成工具。技术选型:Spring Data JPA、Hibernate、Shiro、 Spring MVC、Layer、MySQL 等。 简介: 1、天梯是一款使用Java编写的免费的轻量级CMS系统,目前提供了从后台管理到前端展现的整体解决方案。 2、用户可以不编写一句代码,就制作出一个默认风格的CMS站点。 3、前端页面自适应,支持PC和H5端,采用前后端分离的机制实现。后端支持天梯蓝和天梯红换肤功能。 4、项目技术分层明显,用户可以根据自己的业务模块进行相应地扩展,很方便二次开发。 核心框架:Spring Framework 4.2.5.RELEASE 安全框架:Apache Shiro 1.3.2 视图框架:Spring MVC 4.2.5.RELEASE 数据库连接池:Tomcat JDBC 缓存框架:Ehcache ORM框架:Spring Data JPA、hibernate 4.3.5.Final 日志管理:SLF4J 1.7.21、Log4j 编辑器:ueditor 工具类:Apache Commons、Jackson 2.8.5、POI 3.15 view层:JSP 数据库:mysql、oracle等关系型数据库 前端 dom : Jquery 分页 : jquery.pagination UI管理 : common UI集成 : uiExtend 滚动条 : jquery.nicescroll.min.js 图表 : highcharts 3D图表 :highcharts-more 轮播图 : jquery-swipe 表单提交 :jquery.form 文件上传 :jquery.uploadify 表单验证 :jquery.validator 展现树 :jquery.ztree html模版引擎 :template
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值