javaweb企业级java web开发技术大全用到什么技术

在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了。但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平。&
Java程序员
&&&&&&&&&&&&&&反射、泛型、注释符、自动装箱和拆箱、枚举类、可变
&&&&&&&&&&&&&&参数、可变返回类型、增强循环、静态导入
&&&&&&&&核心编程
&&&&&&&&&&&&&IO、多线程、实体类、
&&&&&&&&&&&&&集合类、正则表达式、
&&&&&&&&&&&&&XML和属性文件
&&&&&&&&&&&&&图形编程
&&&&&&&&&&&&&AWT(Java2D/JavaSound/JMF)、Swing、SWT、JFace
&&&&&&&&网路编程
&&&&&&&&&&&&Applet、Socket/TCP/UDP、NIO、RMI、CORBA
&&&&&&&Java语法基础
&&&&&&&&&&&类、抽象类、接口、最终类、静态类、匿名类、内部类、异常类、编码规范
&&&&&&Java开发环境
&&&&&&&&&&JDK、JVM、Eclipse、Linux
Java核心编程技术
Java,设计而又非常精巧的语言。学习Java,须从Java开发环境开始,到Java语法,再到Java的核心API。
&&&&&&&&1.Java开发入门:Java开发环境的安装与使用,包括JDK命令、EclipseIDE、Linux下Java程序的开发和部署等。
&&&&&&&&2.Java语法基础:基于JDK和Eclipse环境,进行Java核心功能开发,掌握Java面向对象的语法构成,包括类、抽象类、接口、最终类、静态类、匿名类、内部类、异常的编写。
&&&&&&&&3.Java核心API:基于JDK提供的类库,掌握三大核心功能:
&&&&&&&&A。Java核心编程:包括Java编程的两大核心功能&&Java输入/输出流和多线程,以及常用的辅助类库&&实体类、集合类、正则表达式、XML和属性文件。
&&&&&&&&B。Java图形编程:包括Sun的GUI库AWT(Java2D、JavaSound、JMF)和Swing,IBM和GUI库SWT和J
&&&&&&&&C. Java网路编程:Applet组件编程,Socket编程,NIO非阻塞Socket编程、RMI和CORBA分布式开发。
&&&&&&&&4.Java高级特性:掌握JDK1.4、JDK5.0、JDK6.0中的Java高级特性,包括反射、泛型、注释,以及java高级特性&&自动装箱和拆箱、枚举类、可变参数、可变返回类型、增强循环、静态导入等。
JavaEE初级软件工程师
JSF框架开发技术
&&&&&&&配置文件(页面导航、后台Bean)、JSF组件库(JSF EL语言、HTML标签、事件处理、)、JSF核心库(格式转换、输入验证、国际化)
Javaweb核心开发技术&&&&&&&
&&&&&&&开发环境(Eclipse、Linux)
&&&&&&&三大组件(JSP、JavaBean、Servlet)
&&&&&&&扩展技术(EL、JSTL、Taglib)
网页开发技术
&&&&&&&HTML、XML、CSS、JavaScript、AJAX
&&&&&&&数据库设计技术
&&&&&&&SQL、MySql、Oracle、SQLServer、JDBC
Web服务器(Tomcat/Jetty/Resin/JBossWeb)
JavaWeb核心技术:
&&&&&&&&JavaWeb项目开发的全过程可以分解为:
&&&&&&&网页开发+数据库设计&&&JavaWeb项目开发,其中,javaWeb由6项基本技术组成:JSP+JavaBean+Servlet+EL+JSTL+Taglib,而JSF正是将这6种技术进行有机结合的技术框架:
JavaEE中级软件工程师
四种经典架构SSH1、SSI1、SSH2、SSI2
&&&&&&&&Struts1表现层框架
&&&&&&入门配置、核心组件、标签库、国际化、数据检验、数据库开发、Sitemesh集成、集成Hibernate/iBATIS
&&&&&&&&Struts2表现层框架
&&&&&&&&&&&&&&&入门配置、核心组件、标签库、国际化、数据校验、Sitemesh集成转换器、拦截器、集成Hibernate/iBATIS
&&&&&&&&Spring业务层框架
&&&&&&&&&&&&&&入门配置、IoC容器、MVC、标签库、国际化、数据校验、数据库开发
&&&&&&&&Hibernate持久层框架
&&&&&&&&&&&&MySQL、Oracle、SQLServer iBATIS持久层框架
&&&&&&&&&&&&MySQL、Oracle、SQLServer
Web服务器(Tomcat/Jetty/Resin/JBossWeb)
Java高级软件工程师
javaWeb开源技术与框架
&&&&&&&&工作流、
搜索引擎、
缓存引擎 、
&&&&&&&&任务调度、
&&&&&&&&报表服务、
系统测试、
&&&&&&&&集群、
负载平衡、
JavaWeb分布式开发技术
JTA(Java事物管理)
&&&&&&JAAS(Java验证和授权服务)
&&&&&&JNDI(Java命名和目录服务)
&&&&&&JavaMail(Java邮件服务)
JMS(java信息服务)
WebService(web服务)
JCA(java连接体系)
JMS(java管理体系)
应用服务器(JBossAS/WebLogic/WebSphere)
JavaEE系统架构师
&&&&&&&&面向云架构(COA)
&&&&&&&&&&&&COA、SaaS、网格计算、集群计算、分布式计算、云计算
&&&&&&&&面向资源架构(ROA)
&&&&&&&&&&&&ROA、RESI
&&&&&&&&面向web服务架构(SOA)
&&&&&&&&&&&WebService、SOA、SCA、ESB、OSGI、EAI
&&&&&&&&Java设计模式
&&&&&&&&&&创建式模式:抽象工厂/建造者/工厂方法/原型/单例
&&&&&&&&&&构造型模式:适配器/桥接/组合/装饰/外观/享元/代理
&&&&&&&&&&行为型模式:责任链/命令/解释器/迭代子/中介者/备忘录/观察者/状态/策略/模板方法/访问者
&&&&&&&Java与UML建模
&&&&&&&&&&对象图、用例图、组件图、部署图、序列图、交互图、活动图、正向工程与逆向工程
CTO首席技术官
&&&&&&&&&发展战略
&&&&&&&&&技术总监
&&&&&&&&&团队提升
&&&&&&&&&团队建设
&&&&&&&&&项目管理
&&&&&&&&&产品管理
企业级项目实战(带源码)地址:
收集五年的开发资料下载地址:&&
&下面的更深入的有兴趣可以了解一下,我的目的不是要大家掌握下面的知识,只是希望扩展自己的思维,摘自牛人的技术博客。
/**************************************************牛人必看*****************************************************************/
系统后台框架:
前端工程师技能:
B2C电子商务基础系统架构解析运营B2C日 久,越来越深刻的意识到IT系统对确保规范化业务流转,支撑消费者端的均一服务有着决定性的作用。于是,一直想好好整理下相关的系统架构,怎奈俗务缠身, 一直拖到今日,猛然发现下周娃很可能就要出生,拖无可拖,快马加笔,居然整出来了。本文的重点是理清系统的逻辑关系,详细的功能模块请参见结尾附上的系统 架构图。首先,聊下对系统逻辑架构的看法;我个人始终坚持认为,系统的开发与演化,前台严格follow消费者的购买流程,后台则盯牢订单流转,牢牢抓住这两条主线,才能高屋建瓴的看清B2C的逻辑链和数据流,更深刻的规划功能模块,从而更有效支撑实际业务的流转。前台系统包括:商品展示,内容展示,订单确认,支付系统,用户中心四大模块一,商品展示按照Ebay的内部分类,任何将商品以单个或批量的方式展示给消费者的功能均应归入此系统。因此,该系统至少包括:A,站内搜索(搜索提示,搜索规则,搜索成功页,搜索不成功页,相似推荐)B,导航(频道导航,其他导航如销售排行,广告位,推荐位,文字链,Also buy等)C,商品分类(品牌分类,品类分类,属性分类如剪裁形式)D, 登陆页(商品列表页,商品详细页,商品活动页)这里的访问逻辑是:A /B/C分流消费者去往相对个性化的页面,由登陆页体现商家的核心诉求和价值传递,完成call-to-action的第一步。二,内容展示内容展示较为简单,对纯购物品牌而言包括:A,公告区B,帮助中心C,论坛(如需商城与论坛发生交互,则需自行开发,否则可集成discuz做同步登陆即可)大家都知道,就不多说了。三,订单确认订单确认,就是帮助消费者正确提交订单信息的环节,看似简单,实则非常复杂,需要对很多信息逻辑判断和处理,一般由2个部分组成:A,购物车(购物车浮层,购物车页面,无注册购买)无注册购买是需要慎用的功能,除非刻意追求用户的短平快下单,如团购/换购,一般不推荐使用,会造成系统异常复杂,开发量也很大。B,订单提交(返回购物车,收货地址&地址薄,支付方式判断,配送方式,发票,订单标记,实付金额计算等等)值得一提的是,几乎大多数的促销逻辑运算在这个环节完成,充分考虑各种促销方式之间的互斥与重叠是系统设计的核心,需要充分考虑各种情况,避免出现逻辑漏洞。四,支付系统与一般的想象不同,支付系统其实并不简单等于第三方支付工具接入:A,外部支付系统(支付宝将接口,财付通接口,网银直联端口,信用ka分期端口)B,内部支付系统(账户余额,积分,礼品卡,优惠券)支付系统的逻辑设计不但需要考虑到各种极端情况的发生(如一张订单先用礼品卡,再用积分,最后网银支付),还要预留财务做账所需的相关字段,并充分考虑订单取消之后如何回滚各类内部账户。五,用户中心用户中心的实质是用户自助功能的dashboard,一般4个部分组成:A,注册&登陆(快速注册,完整注册,注册有礼,推荐注册,密码找回,主站id登陆,open-id登陆如QQ,新浪微博等)B,订单中心(历史订单状态,中间状态订单修改,物流追踪)C,服务中心(各类自助服务如退款申请,退换货申请,建议与投诉等)D, 信息管理(用户基本信息管理和账户信息管理)用户中心的价值在于:尽可能引导用户自行获取所需的信息并提交所需的服务,在提升服务准确率,及时性的同时降低对人工成本。后台系统包括:商品&促销,CRM,订单处理,WMS,采购管理,财务管理,报表管理,系统设置,WA系统9大模块一, 商品&促销商品&促销模块的核心在于确保消费者下单之前,前台内容所见即所得A, 商品管理(品类管理,品牌管理,单品管理)B, 促销管理(活动管理和自定义活动模板管理)在上述模块中,最重要的是2个部分:单品管理中的批量产品生成的自动程序和活动管理中&共享与互斥&管理。前者用于大幅提升上新速度,后者避免促销活动失控。二, CRMCRM是对B2C核心资源&会员的管理,服务与再营销系统,包括如下部分:A,会员管理(会员信息的增删改查和到其他系统的链接)B,用户关怀(条件触发和人工触发相关EDM & 短信 & OB)C,定向营销(会员分组和营销活动管理)D, 客服管理(内容非常多,集成所有需前台与后台交互的功能,详情还是看图吧)E, 呼叫中心(IVR,坐席管理,统计报表,参数传递与窗口嵌入)值得注意的,EDM和短信通道市面上已经有成熟的外包服务商,一般都会外包;呼叫中心和在线客服自行开发成本太高,特别是呼叫中心系统,业务初期也都是外包的。三, 订单处理订单处理是在订单未正式进入仓储部门处理之前,对订单的前置性处理环节。A,订单录入(电话订购,网上下单,外部团购订单,无金额订单录入如礼品单)B,订单审核(自动审核和人工审核)C,RMA处理(RMA申请单和RMA处理单)RMA的逻辑也异常复杂,需要在效率和成本之间找平衡,确保在不拖垮仓储部门的正常出入库的前提下对消费者端快速有效close工单;对内部则需要控制成本,货损不能超过预算上限。四, WMS(Warehouse Management system仓库管理系统)WMS的流程很长,功能模块也很多,大致分为入库管理,库存管理,出库管理和票据管理4个模块四个模块,细细道来就是另外一篇文章了,各位可以参考 这篇文章:庖丁解牛&B2C仓储内部运作解密(上,中,下)五, 采购管理采购管理的核心是有效跟进采购合同/发票的状态,大货的采购入库/退库,财务结算和在仓库存查询和处理。A,供应商管理(供应商信息管理,合同发票管理)B,采购单管理(PO单管理,负PO单管理)C,库存管理(库存查询,库存占用单,库存变动log)六, 财务管理B2C的财务管理,主要是对供应商,渠道和内部费用支出的成本控制。A,供应商结算B,渠道结算C,配送结算D, 内部结算说实在的,哥对财务这块也不算很了解,大家将就看看,图片上有明细。七, 报表管理报表是B2C业务的宏观表现,理论上说,每个部门的KPI都应该从中找到。A,搜索报表(站内搜索量查询)B,销售报表(多个维度销量查询,优惠券使用情况,报表导出)C,财务报表D, 客服报表(客服日报和坐席报表)前者反映与消费者发生的日常交互(包括正常与异常),后者考核客服的工作绩效E, 仓储物流报表这几块报表,是业务运作的核心,涉及到公司机密,就不能写的太细了,见谅。八, 系统设置这块大家都知道是干嘛的,也就不多说了,分成三块。A,基础设置(和业务有关的一些字段值)B,权限设置(不同账号的操作权限和操作记录)C,其他设置九, WA系统(Web Analytcis)网站分析系 统,几乎全是外购,很少有能够自建的,即使自建,最多做几个简单的模块。用于实战的,要么是免费的GA(Google Analytics),要么是昂贵的Omniture。这块的知识,细细说来也是另外一篇文章了,有兴趣的同学可以看我这篇科普文章:揭秘&我所知道的网 站分析(上,下)&最后,上全系统大图,再感慨一句,B2C系统,真是一个大工程啊。
阅读(...) 评论()Java企业应用开发框架Spring框架简介 - 知乎专栏
{"debug":false,"apiRoot":"","paySDK":"/api/js","wechatConfigAPI":"/api/wechat/jssdkconfig","name":"production","instance":"column","tokens":{"X-XSRF-TOKEN":null,"X-UDID":null,"Authorization":"oauth c3cef7c66aa9e6a1e3160e20"}}
{"database":{"Post":{"":{"contributes":[{"sourceColumn":{"lastUpdated":,"description":"我是天码营的David老师,为大家提供编程开发技术学习的内容、工具与服务,帮助你迅速掌握实战技能!","permission":"COLUMN_PUBLIC","memberId":,"contributePermission":"COLUMN_PUBLIC","translatedCommentPermission":"all","canManage":true,"intro":"更多实战项目请关注天码营网站()","urlToken":"tianmaying","id":11077,"imagePath":"327efd931bc33.jpeg","slug":"tianmaying","applyReason":"","name":"David教你学Java Web开发","title":"David教你学Java Web开发","url":"/tianmaying","commentPermission":"COLUMN_ALL_CAN_COMMENT","canPost":true,"created":,"state":"COLUMN_NORMAL","followers":3986,"avatar":{"id":"327efd931bc33","template":"/{id}_{size}.jpeg"},"activateAuthorRequested":false,"following":false,"imageUrl":"/327efd931bc33_l.jpeg","articlesCount":152},"state":"accepted","targetPost":{"titleImage":"/bcf4fa3e1d3d2_r.png","lastUpdated":,"imagePath":"bcf4fa3e1d3d2.png","permission":"ARTICLE_PUBLIC","topics":[],"summary":"由发表在Spring是什么?Spring是一个开源的轻量级的Java企业应用开发框架,其初衷是为了替代当时非常笨重的Java EE(当时还称为J2EE)组件技术EJB(Enterprice Java Beans),让Java EE开发更加简单灵活。Spring起源于Rod Jahnson 2002年出版的…","copyPermission":"ARTICLE_COPYABLE","translatedCommentPermission":"all","likes":0,"origAuthorId":,"publishedTime":"T19:21:41+08:00","sourceUrl":"","urlToken":,"id":430189,"withContent":false,"slug":,"bigTitleImage":false,"title":"Java企业应用开发框架Spring框架简介","url":"/p/","commentPermission":"ARTICLE_ALL_CAN_COMMENT","snapshotUrl":"","created":,"comments":0,"columnId":11077,"content":"","parentId":0,"state":"ARTICLE_PUBLISHED","imageUrl":"/bcf4fa3e1d3d2_r.png","author":{"bio":"天码营-实战开发技术学习平台-创始人","isFollowing":false,"hash":"acd41dfe43fcc818e301fef16a0c008c","uid":437300,"isOrg":false,"slug":"tianmaying","isFollowed":false,"description":"天码营创始人(官方网站:),致力于打造新一代的技术学习服务平台,提供创新并且专业的内容、工具与服务,帮助学习者与从业者实现个人价值。","name":"David","profileUrl":"/people/tianmaying","avatar":{"id":"799df728d7d9e8e52b9eb","template":"/{id}_{size}.png"},"isOrgWhiteList":false},"memberId":,"excerptTitle":"","voteType":"ARTICLE_VOTE_CLEAR"},"id":332547}],"title":"Java企业应用开发框架Spring框架简介","author":"tianmaying","content":"由发表在Spring是什么?Spring是一个开源的轻量级的Java企业应用开发框架,其初衷是为了替代当时非常笨重的Java EE(当时还称为J2EE)组件技术EJB(Enterprice Java Beans),让Java EE开发更加简单灵活。Spring起源于Rod Jahnson 2002年出版的著作《Expert One-on-One J2EE Design and Development》,书中分析了Java EE的开发效率和实际性能等方面的问题,从实践和架构的角度探讨了简化开发的原则和方法。以此为基础,他实现了一个名为interface21的轻量级开发框架,成为Spring框架的前身。2004年,Spring正式发布1.0版本,同年Rod Jahnson推出了另一部影响深远的经典著作《Expert one-on-one J2EE Development without EJB》,Spring开始逐步在Java领域流行。现在Spring框架的版本已经演化到了4.x,它已经成为Java开发框架的一种事实标准,对Java EE规范本身也产生了重要影响。比如EJB规范就在发展中逐渐引入了众多Spring框架的优秀特征。Spring最重要的两个核心功能是依赖注入(DI,Dependency Injection)和面向切面编程(AOP,Aspect Oriented Programming)。其中DI用于管理Java对象之间的依赖关系,AOP用于解耦业务代码和公共服务代码(如日志,安全,事务等)。DI和AOP能够让代码更加简单,具有良好的松耦合特性和可测试性,极大地简化开发。理解这两者是使用Spring框架的基础。Spring框架本身具有模块化的分层架构,开发者可以根据需要使用其中的各个模块。Spring框架对Java企业应用开发中的各类通用问题都进行了良好的抽象,因此也能够把应用各个层次所涉及的特定开发框架(如MVC框架、ORM框架)方便得组合到一起。Spring是一个极其优秀的一站式的Full-Stack集成框架。Spring的基本思想Spring的目标是简化Java应用开发,那么它是通过什么方式来实现这一目标的呢?前面我们说过DI和AOP是Spring的核心功能,更准确地说,Spring通过为DI和AOP这两种编程技术提供支持,来让应用更方便的进行开发。此外,Spring提倡基于POJO(Plain Old Java Object)的编程模型,提供了针对企业开发且屏蔽重复代码的工具类。在开始正式进入代码编写之前,我们先了解Spring简化开发的几个基本思想。DI面向对象的程序通过一组对象之间相互通信来实现特定功能,这里的通信具体来说就是一个对象对另一个对象的方法调用或者属性访问。比如有一个BlogRespositry类负责将博客内容存储到数据库,一个BlogController负责解析前端的Web请求。BlogController接受到新建博客的请求之后,需要调用BlogRespositry的方法来保存博客内容。这里BlogRespositry就是BlogController的一个依赖,具体体现在BlogController会包含一个BlogRespositry类型的成员变量。class BlogController {\n
private BlogRepository blogR\n\n
public BlogController() {\n
this.blogRepository = new BlogRepository();\n
...\n}\n在上面的代码中,BlogRespositry在构造函数中自己去创建BlogRepository类的实例。而使用依赖注入技术,则BlogRespositry的依赖(即BlogRepository类)是由外部实例化之后注入给它的。依赖注入也称为控制反转(IoC,Inversion of Controll)。当创建一个对象时,它所依赖的对象由外部传递给它,而非自己去创建所依赖的对象(向例子中这样通过new操作)。因此,也可以说在对象如何获取它的依赖对象这件事情上,控制权反转了。这便是控制反转和依赖注入这两个名字的由来了。DI可以让对象之间的关系更加松耦合,而且会促使你使用面向接口编程,同时也让测试更加方便。如果现在对这个概念还不是太理解没关系,下一节中我们将基于代码实例来深入了解DI的工作原理。AOP面向切面编程(Aspect Oriented Programming,AOP)是一种关注点分离的技术,通俗的说就是有机地将各部分代码进行分离,各司其职,互不干扰。软件开发中经常提一个词,叫做“业务逻辑”或者“业务功能”,我们的代码主要就是实现某种特定的业务逻辑。但是我们往往不能专注于业务逻辑,比如我们写业务逻辑代码的同时,还要关注事务管理、缓存、日志等一系列通用功能,如果每个业务功能都要和这些通用功能混在一起,是一件非常低效和痛苦的事情。所以,为了将业务功能的关注点和通用化功能的关注点分离开来,就需要AOP技术了。通用功能的代码实现,对应的就是我们说的切面(Aspect)。简而言之,AOP就是一种在开发时将业务相关代码和业务无关的通用功能代码有机分离,而运行时又能够整合到一起形成完整功能的一整套技术。Spring框架中一些模块本身就是基于AOP技术来实现的,例如事务处理和安全相关的模块。基于POJO的编程模型Java开发领域的一大特色就是有大量开源框架可供我们选择和使用。通常情况下,使用一种开发框架,我们编写的业务类都需要去继承框架提供的类或者接口,如此方能使用框架提供的基础功能。而对于Spring框架,只需POJO就能使用其强大的功能。Spring不强制我们依赖于其特定的API,这称之为“非侵入式”开发,能够让代码更加简单并且更容易复用。POJO是Plain Old Java Object的缩写,是软件开发大师Martin Fowler提出的一个概念,指的是一个普通Java类。也就说,你随便编写一个Java类,就可以称之为POJO。之所以要提出这样一个专门的术语,是为了与基于重量级开发框架的代码相区分,比如EJB,我们编写的类一般都要求符合特定编码规范,实现特定接口、继承特定基类,而POJO则可以说是百无禁忌,灵活方便。大家在学习过程中会经常遇到另外两个概念:JavaBeans和Spring Bean。这两者和POJO这个概念经常联系在一起,这里简单介绍一下。JavaBeans是一种Java规范定义的一种组件模型,它包含了一些类编码的约定。简单来说,一个类如果拥有一个默认构造函数,由国有访问内部属性且符合命名规范的setter和getter方法,同时实现了io.Serializable接口,就是一个JavaBean。那么为什么要这些约定呢? 因为大家都遵守这些约定,在编写或者修改一个类的时候,就能很容易在可视化的开发环境中进行操作,也更方便地分发给他人。Spring Bean是被Spring维护和管理的POJO。最早Spring只能管理符合JavaBeans规范的对象,这也是为什么称之为Spring Bean的原因。但是现在只要是POJO就能被Spring容器管理起来,而且这也是最为常见的情况。模板代码在开发过程中,很多的功能的实现,都会涉及到完全相同的代码,最典型的例子就是JDBC的使用。public Employee getEmployeeById(long id) {\n
Connection conn =\n
PreparedStatement stmt =\n
ResultSet rs =\n
conn = dataSource.getConnection();\n
stmt = conn.prepareStatement(\"select id, name from employee where id=?\");\n
stmt.setLong(1, id);\n
rs = stmt.executeQuery();\n
Employee employee =\n
if (rs.next()) {\n
employee = new Employee();\n
employee.setId(rs.getLong(\"id\"));\n
employee.setName(rs.getString(\"name\"));\n
} catch (SQLException e) {\n
} finally {\n
if (rs != null) {\n
rs.close();\n
} catch (SQLException e) {\n
if (stmt != null) {\n
stmt.close();\n
} catch (SQLException e) {\n
if (conn != null) {\n
conn.close();\n
} catch (SQLException e) {\n
}\\n}\n而Spring通过Template这样一种设计模式来解决这样的问题。Template模式,就是把固定的逻辑放到一个模板类中,变化的部分放到自己实现的类中,通过继承或者回调的方式把固定逻辑和变化部分结合到一起。比如在面的代码中,数据库连接和数据库异常处理的大量代码都是一模一样的,不同的数据库访问操作只有数据查询部分的逻辑是不一样的。Spring将这些代码被放在了JdbcTemplate这个模板类中,大大简化了数据访问的开发工作。public Employee getEmployeeById(long id) {\n
return jdbcTemplate.queryForObject(\n
\"select id, name from employee where id=?\",\n
new RowMapper&Employee&() {\n
public Employee mapRow(ResultSet resultSet, int i) throws SQLException {\n
Employee employee = new Employee();\n
employee.setId(resultSet.getLong(\"id\"));\n
employee.setName(resultSet.getString(\"name\"));\n
});\n}\nSpring框架中的模块使用Spring框架之前,我们简单了解一下这个框架由哪些模块构成。Spring本身具有非常好的模块化架构,包含了20多个模块。这些模块划分为六大部分,可以单独使用,也可以组合使用。下面这张图是Spring官方文档给出的Spring概览图。简单地说,这六部份实现的功能功能分别为:核心容器:核心模块,提供了IoC/DI容器AOP:AOP的实现和AspectJ的支持消息:提供对基于消息应用的支持,提供与Spring Integration的集成数据访问与集成:JDBC访问的简化、事务的支持,ORM(Object Relation Mapping)框架(如JPA、Hibernate和Mybatis等)与OXM(Object XML Mapping)框架的集成Web:Spring MVC的实现,能集成众多模板引擎技术(如Thymeleaf、JSP与Velocity等)测试:提供大量Mock对象,支持单元测试;提供Spring Context的测试支持,支持集成测试 更多文章请访问","updated":"T11:21:41.000Z","canComment":false,"commentPermission":"anyone","commentCount":1,"collapsedCount":0,"likeCount":9,"state":"published","isLiked":false,"slug":"","isTitleImageFullScreen":false,"rating":"none","titleImage":"/bcf4fa3e1d3d2_r.png","links":{"comments":"/api/posts//comments"},"reviewers":[],"topics":[],"adminClosedComment":false,"titleImageSize":{"width":600,"height":450},"href":"/api/posts/","excerptTitle":"","column":{"slug":"tianmaying","name":"David教你学Java Web开发"},"tipjarState":"inactivated","annotationAction":[],"sourceUrl":"","pageCommentsCount":1,"hasPublishingDraft":false,"snapshotUrl":"","publishedTime":"T19:21:41+08:00","url":"/p/","lastestLikers":[{"bio":"工程师","isFollowing":false,"hash":"0e7e8d76ffba39de2a64cda","uid":36,"isOrg":false,"slug":"yangnk","isFollowed":false,"description":"winter is coming.","name":"阳宁凯","profileUrl":"/people/yangnk","avatar":{"id":"v2-b3ad04b38ade90c6fa6c6dca","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"雪没有说一句话,大地却已泪流满面","isFollowing":false,"hash":"ad5be5fef3e10d","uid":20,"isOrg":false,"slug":"wang-yue-54-29","isFollowed":false,"description":"北京天冷了,多穿点。","name":"王越","profileUrl":"/people/wang-yue-54-29","avatar":{"id":"2c4c2ba5df","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"原子弹制造与维修","isFollowing":false,"hash":"a68646bced1a408c696f04eb8f419512","uid":96,"isOrg":false,"slug":"zhihu_terry","isFollowed":false,"description":"A True Believer of the Flying Spaghetti Monsterism","name":"王浩然","profileUrl":"/people/zhihu_terry","avatar":{"id":"2df8dd62e00c24bd180767","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":null,"isFollowing":false,"hash":"7000385ebb75e3a81abbef035fc102ee","uid":822300,"isOrg":false,"slug":"freestylewill","isFollowed":false,"description":"","name":"freestylewill","profileUrl":"/people/freestylewill","avatar":{"id":"da8e974dc","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false},{"bio":"爱吉他的madao","isFollowing":false,"hash":"ca3ec3a51cca5c604b714f1","uid":24,"isOrg":false,"slug":"zhao-zhi-hong-47","isFollowed":false,"description":"知识给你力量\n自律带来自由","name":"jj酱","profileUrl":"/people/zhao-zhi-hong-47","avatar":{"id":"fb4edd923baf095e2f226d61","template":"/{id}_{size}.jpg"},"isOrgWhiteList":false}],"summary":"由发表在Spring是什么?Spring是一个开源的轻量级的Java企业应用开发框架,其初衷是为了替代当时非常笨重的Java EE(当时还称为J2EE)组件技术EJB(Enterprice Java Beans),让Java EE开发更加简单灵活。Spring起源于Rod Jahnson 2002年出版的…","reviewingCommentsCount":0,"meta":{"previous":{"isTitleImageFullScreen":false,"rating":"none","titleImage":"/50/97cdae7eb1aed_xl.jpg","links":{"comments":"/api/posts//comments"},"topics":[],"adminClosedComment":false,"href":"/api/posts/","excerptTitle":"","author":{"bio":"天码营-实战开发技术学习平台-创始人","isFollowing":false,"hash":"acd41dfe43fcc818e301fef16a0c008c","uid":437300,"isOrg":false,"slug":"tianmaying","isFollowed":false,"description":"天码营创始人(官方网站:),致力于打造新一代的技术学习服务平台,提供创新并且专业的内容、工具与服务,帮助学习者与从业者实现个人价值。","name":"David","profileUrl":"/people/tianmaying","avatar":{"id":"799df728d7d9e8e52b9eb","template":"/{id}_{size}.png"},"isOrgWhiteList":false},"column":{"slug":"tianmaying","name":"David教你学Java Web开发"},"content":"由发表在在Web早期样式和内容是不区分的,比如可以通过&bold&标签来显示加粗字体。随着页面内容的丰富,浏览器性能的提高,内容和样式的耦合使得HTML文件难以理解和维护。CSS的出现正是为了将样式分离到独立的文件中。(Cascading Style Sheets,CSS),又称串样式列表、层次结构式样式表文件,一种用来为结构化文档(如HTML文档或XML应用)添加样式(字体、间距和颜色等)的计算机语言,由W3C定义和维护。CSS 的历史最初主流浏览器为了显示更丰富的web文档,不断地将新的标签和属性添加到HTML标签中。这最终使得文档内容与文档样式偶合在一起,难以创建内容清晰的文档。为了解决这个问题,万维网联盟在 HTML 4.0 之外提出层叠样式表(CSS),使用CSS完成样式与内容的分离。样式与内容分离是计算机软件开发中的一条重要原则。不仅可以更清晰地分别表达样式或者内容,更重要的是这一分离使得二者不再耦合,样式变得可复用、组件化。引入 CSS我们知道HTML文件中根节点是&html&标签,它包含&head&和&body&。我们在&head&中可以引入外部的样式文件,文件中的样式将被应用到当前HTML。例如在上一章中的hello.html中引入我们写好的hello.css:&link rel=\"stylesheet\" href=\"./hello.css\"&\n引入前后的变化如下图:其他引入方式除了在&head&中引入外部CSS文件,还有两种方式可以引入样式:设置标签的style属性,例如: &a style=\"color: red\"&Strawberry&/a&\n在&html&的任何地方,添加&style&标签,语法同外部CSS文件。例如: &style&\n
}\n &/style&\n在实际项目中,一般在&head&引入外部样式文件。相比于上述两种方式,样式文件的分离:利于协同工作。样式往往由设计师负责,而内容往往由前端工程师负责。这样的分离有利于他们的分工。样式可复用。引入样式时,可以对不同的样式文件进行组合,便于网站风格的建立和管理。一个 CSS 文件这是一个简单的 CSS 文件,先不必在意其细节,大致观察一下CSS的语法。div p{\n
padding-left: 20\n}\n\nbody img, body div{\n
float:\n}\n\n.avatar{\n
width: 100\n
height: 100\n}\n可以观察到上述文件分为3部分内容,每一内容都包含一行逗号分隔的字符串、紧接着的一组大括号、以及大括号内的内容。每一部分称为一个规则(rule),CSS是由多组“规则”组成的;大括号前的字符串称为选择器(selector),它用来指定该规则用于怎样的元素;大括号内是“特性”列表,每个特性都用分号结束。“特性”由“属性”(property)和“值”(value)组成,以冒号分隔:属性(property):某一种特性的名称;值(value):该特性的设置值。类型选择器类型选择器是最常用的CSS选择器,用于选择指定类型的HTML标签。请看:body{\n
margin: 50\n}\n\ndiv p{\n
padding-left: 20\n}\n\nbody img, body div{\n
float:\n}\n设置body:为50像素;设置body下的p:为20像素;设置body下的img和body下的div:向左。现在页面便有了边距,并且图片和下面的文字排成了一行:类选择器类选择器用于选择指定class的HTML标签,在CSS库中很常见。首先需要给HTML标签设置class:&img src=\"./catty.jpeg\" class=\"avatar\"&\n然后在CSS中用.来选择对应的类:.avatar{\n
width: 100\n
height: 100\n
border-radius: 50\n}\n我们设置&img&的长和高使之变成矩形,再把边框圆角设为半边长,此时图片就变成了圆形:ID选择器ID选择器用于选择指定id(这是任何HTML标签都可以有的属性,其定义方式见下面的代码)的HTML标签,常用于自定义样式。同样地,先给HTML标签设置id:&h2 id=\"subtitle\"&i am a little, cute catie...&/h2&\n在CSS中使用ID选择器:#subtitle{\n
font-style:\n
color:\n}\n这样便可以改变h2的字体和颜色了:伪类选择器顾名思义,伪类选择器用于选择伪类。伪类(如:hover,:focus)是浏览器生成的,不出现在HTML文件中,主要用于标识用户操作造成的元素状态改变。例如鼠标悬停时,鼠标所在的元素便会拥有:focus伪类。继续给.avatar类添加一个伪类:.avatar:hover{\n
filter: blur(20px);\n
-webkit-filter: blur(5px);\n
cursor:\n}\n在鼠标悬停在图片上时:图片会应用一个滤光器:以5像素的尺度进行模糊;-webkit-是一种CSS前缀,用来支持webkit核心的浏览器;鼠标指针会变成手形。请使用 Chrome 内核的浏览器!鉴于优秀的兼容性和对HTML5、CSS3的支持,请您在整个课程的学习过程中都使用Chrome浏览器。说起CSS前缀,一般CSS属性名都是以字母起始的,它们由W3C标准化。浏览器厂商为了支持一些新的尚未标准化的特性,会提供一些额外的CSS属性。这些属性都会添加该厂商定义的前缀。有四种常见的CSS前缀:-moz-:支持Firefox-webkit-:支持Safari、Chrome-o-:支持Opera-ms-:支持Internet Explorer其他选择器事实上CSS共有5种基本选择器和2种伪类选择器。基本选择器类型选择器(h1,p等):用于选择指定类型的HTML标签;类选择器(.classname):用于选择指定class的HTML标签;ID选择器(#idname):用于选择指定id的HTML标签;通配符选择器(*):用于选择所有类型的HTML标签;属性选择器([foo='bar']):用于选择某属性为指定值的HTML标签;属性选择器 用来选择特定属性值的元素,例如div[class=avatar]可以选择class属性为avatar的&div&元素,当然HTML元素的属性很多,属性选择器可以匹配任何属性。属性选择器还支持更复杂的匹配,例如 [name^=\"sz_\"] 表示属性 name 的值具有前缀:sz_。伪选择器伪类选择器:用于选择特定状态的元素。:如:before,:first-letter,用于向某些选择器设置特殊效果,以实现复杂的样式。组合选择符 可描述元素之间的层级关系,例如:A & B 将会选择 A 下一层的元素 B。如果以空格间隔,则会匹配任何一级的子元素。更多CSS选择器的信息可参考:。更多文章请访问","state":"published","sourceUrl":"","pageCommentsCount":0,"canComment":false,"snapshotUrl":"","slug":,"publishedTime":"T22:35:27+08:00","url":"/p/","title":"快速学习Web前端:CSS入门","summary":"由发表在在Web早期样式和内容是不区分的,比如可以通过&bold&标签来显示加粗字体。随着页面内容的丰富,浏览器性能的提高,内容和样式的耦合使得HTML文件难以理解和维护。CSS的出现正是为了将样式分离到独立的文件中。(Cascading Sty…","reviewingCommentsCount":0,"meta":{"previous":null,"next":null},"commentPermission":"anyone","commentsCount":0,"likesCount":8},"next":{"isTitleImageFullScreen":false,"rating":"none","titleImage":"/50/6b0aeb06641f53adf817_xl.jpg","links":{"comments":"/api/posts//comments"},"topics":[],"adminClosedComment":false,"href":"/api/posts/","excerptTitle":"","author":{"bio":"天码营-实战开发技术学习平台-创始人","isFollowing":false,"hash":"acd41dfe43fcc818e301fef16a0c008c","uid":437300,"isOrg":false,"slug":"tianmaying","isFollowed":false,"description":"天码营创始人(官方网站:),致力于打造新一代的技术学习服务平台,提供创新并且专业的内容、工具与服务,帮助学习者与从业者实现个人价值。","name":"David","profileUrl":"/people/tianmaying","avatar":{"id":"799df728d7d9e8e52b9eb","template":"/{id}_{size}.png"},"isOrgWhiteList":false},"column":{"slug":"tianmaying","name":"David教你学Java Web开发"},"content":"由发表在是动态的,弱类型的,解释执行的程序设计语言。Javascript极其灵活,支持多种程序设计范式:面向对象、指令式、函数式。JavaSCript最初被用于浏览器脚本,现在已经是所有主流浏览器的默认脚本语言。浏览器脚本的作用包括用户交互、DOM操作、以及与服务器通信。的流行已经将JavaScript从浏览器端引入到服务器端,并显示出卓越的并发性能。Javascript 由 Netscape 浏览器首次引入到Web文档中。Javascript的出现使web文档变得更像动态的App,而不是静态的文档。现在主流的浏览器都有javascript支持。Javascript核心被标准化为。JavaScript作为一门通用编程语言(general purpose),其语法、内置对象、以及工具库需要大量的精力才能掌握,但JavaScript有着直观的语法,是一门非常容易上手的编程语言。本章中介绍JavaScript最基本的语法,然后编写一个简单的Javascript程序。Hello World使用你喜欢的文本编辑器,建立一个javascript文件(后缀命名为.js即可),输入以下的内容:console.log('Hello, world!')\nconsole为多数JavaScript的宿主环境都会提供的全局对象,它的log方法用来输出(到标准输出)一个字符串。为了运行这段程序,可以打开Chrome浏览器的开发者工具(右上角的设置按钮-&更多工具-&开发者工具),进入Console页面。拷贝这段代码进去,按下回车,你会看到在控制台的输出:Hello, world!。正如你所见,javascript代码非常直观易懂。相信你有一定的C++、Java或Python基础,Javascript远比这些语言要简单。本节课中将不再介绍运算符、表达式、语句等内容,而使取javascript的特点,以及常用实践加以介绍。数据类型Javascript 是一门弱类型和动态类型的语言。弱类型意味着允许隐式类型转换,不同类型的变量间可以直接赋值和运算;动态类型则意味着只在运行时才会进行类型检查,于是包含错误的文件仍然能够得到执行,直到运行至包含类型错误的语句,JavaScript程序才异常退出。Javascript中包含5种基本类型(primitive types):字符串(String):其取值为字符序列。字符串可以用单引号或双引号分隔,二者完全等价。var str1 = \"str1\",\nstr2 = '\"str1\" is a string';\n数字(Number):它是实数?整数?无符号数?这些都不需要考虑!Javascript中,数字就是数字!var n = 1;\nn = n/3;
// 0.33333...\n布尔类型(Boolean):只有两种取值:true, false。空(Null):该类型只有一个值可取,它就是null。在多数Javascript运行时中,null是一种特殊的 object。未定义(Undefined):该类型也只有一个值可取,它就是undefined。有趣的是,你可以把一个变量声明为未定义:var foo =\n除了基本数据类型,还有一种对象(object)类型,Object是JavaScript中所有其他对象的原型(如果你熟知Java等基于类继承的语言,可以理解为Object是其他所有对象的公共父类)。日期、数组、函数都是JavaScript内置的特殊对象。ECMAScript将对象定义为属性的集合(Collection),创建一个对象的语法就像创建一个集合:var student = {name: '小明', age: 23};\n我们看到:所有的变量都是以var声明的,如果你忘记了写var,那么这个变量将成为整个运行时的全局变量。另外,Javascript与C++使用同样的注释风格,即/**/用于多行注释,//用于单行注释。更多关于Javascript数据类型的信息,请参考 、 。对象Javascript是面向对象的编程语言,对象是javascript中最重要的概念。上一节我们通过一对大括号创建了一个对象:var student = {name: '小明', age: 23};\n如果你熟悉构造函数,JavaScript也支持这种方式:function Student(name){\n
this.name =\n
this.age = 23;\n}\nvar student = new Student('小明');\nstudent.school = 'PKU';\n在Javascript中,通过this来访问自己的属性。有趣的是,访问属性前不需声明:如果直接读取未声明属性,会得到undefined;如果直接写入未声明属性,则会声明并用指定的值初始化该属性。如果你熟悉设计模式,你可能会需要这样的对象创建方式:function StudentFactory(_school){\n
var school = _\n\n
this.create = function(name, age){\n
return {\n
name: name,\n
age : age,\n
school: school\n
}\n}\nvar factory = new StudentFactory('PKU');\nvar student = factory.create('小明', 23);\n上述代码中,首先声明了一个工厂对象(function是一种特殊的对象),并用school来配置该工厂。此后用该工厂生产一个学生对象:小明。这段代码在参考代码的factory.js中。现在,你已经熟悉了Javascript中对象的创建。如果你曾开发过C++或者Java,你可能会关心Javascript中如何进行继承,以及实现多态。不错,Javascript是面向对象语言。但没有类的声明和实例化机制,Javascript使用原型继承的方式(prototype)。看到下面的例子也许就清楚了:// file: prototype.js\n\nvar Person = {\n
sayhi : function(){\n
console.log(\"hi! I'm\", this.name)\n
}\n};\n\nfunction Student(name){\n
this.name =\n
this.school = 'pku';\n}\nStudent.prototype = P\n\nvar student = new Student('alice');\n\n// hi! I'm alice\nstudent.sayhi();\n上述代码中,首先声明了Person对象,他有一个sayhi属性,该属性的值为function类型(还记得吗?函数是一种特殊的对象)。然后将构造函数Student的原型设为Person,便实现了对象继承。prototype 对象是个模板,要实例化的对象都以这个模板为基础(属性和方法都被传递给那个类的所有实例)。prototype是可以传递的,最终形成原型链。函数JavaScript 最令人感兴趣的可能莫过于函数实际上是功能完整的对象,通过function来声明函数。在JavaScript中的函数是一级公民,这意味着函数和其他变量一样,可以被传参、赋值、以及返回。函数有如下几个默认属性:length:参数个数 function func(arg1, arg2){}\n\n // 2\n console.log(func.length)\ntoString:这是所有对象共有的方法,将会输出函数的源代码 // function func(arg1, arg2){}\n console.log(func.toString())\narguments在函数体中,JavaScript提供了一个特殊对象 arguments,它是当前函数被调用时传入的参数数组,通过访问arguments不仅可以访问所有实参,还可以获得实参的数目,从而实现其他编程语言中可变参数的机制:// file: arguments.js\n\nfunction sayHi(){\n
if(arguments.length == 1)\n
console.log(\"I'm\", arguments[0]);\n
if(arguments.length == 2)\n
console.log(\"I'm\", arguments[0], 'aged', arguments[1]);\n}\n// I'm alice\nsayHi('alice');\n// I'm alice aged 23\nsayHi('alice', 23);\nJavascript并未提供函数重载、默认参数机制。但我们可以直接访问arguments参数列表,sayHi其 实模仿了函数重载。call & applycall和apply是函数对象的两个函数属性,一般用于对象冒充、包装或者代理。可能在教学中不会用到太多,但在JS库的开发中会经常用到。这两个函数的功能均为用一个对象去调用一个函数,而该函数并非该对象的属性,例如:// file: call.js\nfunction sayHi(age){\n
console.log(\"I'm\", this.name, 'aged', age)\n}\nvar student = {\n
name: 'alice'\n};\n// I'm alice aged 23\nsayHi.call(student, 23)\ncall的第一个参数是用作 this 的对象。其他参数都直接传递给函数自身。既然如此,如果我们希望实现一个自己的log函数,来包装console.log:// file: log.js\nfunction log(){\n
var str = '';\n
for(var i = 0; i & arguments. i++){\n
str += ' ' + arguments[i]\n
console.log(str);\n}\n// a b c\nlog('a', 'b', 'c');\n这里我们不能使用call函数,因为我们不知道参数个数。这便是apply的用武之地:// file: log.js\nfunction log(){\n
console.log.apply(this, arguments)\n}\n// a b c\nlog('a', 'b', 'c');\napply接受的第二个参数为参数数组,而非call的参数列表。这便为上述的情况提供了便利。回调与异步因Javascript最初运行于浏览器端,与服务器的通信必然要异步执行(否则,将会阻塞主控制流,此时浏览器会不响应用户操作)。于是,Javascript天生就是异步的,也是采用异步事件而大幅提高I/O密集型任务的效率。异步是计算机在执行任务的过程中,某些任务可以独立于主控制流执行,使得主控制流得以继续执行,是一种非阻塞的控制方案。在Javascript中有多种异步的实现方案,它们无一例外地需要回调函数。回调函数就是将函数作为参数传递到其他代码(例如:某一个异步任务),这一设计允许了该异步任务完成时执行传入的函数。例如:// file: async.js\nfunction taskFinished(){\n
console.log('Task finished!')\n}\nsetTimeout(taskFinished, 3000);\n上述代码中,首先定义了一个任务完成时需要执行的函数taskFinished。setTimeout是Javascript提供的一个全局对象(还记得吗?函数是一种特殊的对象),它是一个计时器,在到达指定的时间后调用某个函数。上述例子中,在5000毫秒后运行taskFinished函数。变量作用域与闭包Javascript的变量作用域不同于其他的主流编程语言。包括变量的定义方式、作用域的划分、作用持续时间等。在javascript中使用赋值语句即可定义一个对象,而不需要对象声明(也不需要指定变量的类型)。使用var可以定义局部变量,而省略var则可以定义全局变量。例如:// 定义局部变量 foo\nvar foo = 'bar'\n\n// 定义全局变量 bar\nbar = 'foo'\n上述的全局变量作用域不是当前对象,也不是当前文件,而是整个运行时进程!实际项目中,应尽量避免引入全局变量。众所周知,全局变量会使得代码高度耦合、难以复用和维护、复杂化团队协作。那么,局部变量的作用域是怎样的呢?局部作用域即当前函数,不同于C++或Java的当前代码块(以大括号分隔)。正因为javascript的这一点特殊性质,引出了javascript中的一个重要概念:闭包(closure)。闭包是指是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了它最初被创建的环境。闭包之所以如此重要,是因为它完成了javascript的诸多面向对象特性:数据封装、运行时多态。我们看一个闭包:// file: closure.js\nfunction Count(){\n
var num=0;\n
this.add = function(){\n
console.log(num++);\n
}\n}\nvar c = new Count();\nc.add();\nc.add();\nCount是函数,而函数是对象,对象可以有属性和方法。add是方法属性(类型为方法的属性),而num则只是函数的局部变量。首先,我们定义一个构造函数Count,并在其中定义一个局部变量num。接着,我们调用该构造函数创建一个对象c,并调用两次它的add方法。不出所料,程序的输出将是:0\n1\n你可能已经注意到:第二次调用add方法时,add中引用的num仍然保持着上次调用后的值。事实上,num是被add方法引用的一个自由变量,其作用域会一直跟随add而存在。不要混淆局部变量和对象属性。这里的num是局部变量,其作用域仍然存在是闭包现象,而非对象属性。对象属性需要用this关键字来定义。如果你希望进一步学习Javascript,和都提供了很好文档。如果你愿意深究Javascript语法规则,请参考ECMAScript标准:。更多文章请访问","state":"published","sourceUrl":"","pageCommentsCount":0,"canComment":false,"snapshotUrl":"","slug":,"publishedTime":"T12:25:38+08:00","url":"/p/","title":"10分钟了解Javascript","summary":"由发表在是动态的,弱类型的,解释执行的程序设计语言。Javascript极其灵活,支持多种程序设计范式:面向对象、指令式、函数式。JavaSCript最初被用于浏览器脚本,现在已经是所有主流浏览器的默认脚本语言。浏览器脚本的作用包括用户…","reviewingCommentsCount":0,"meta":{"previous":null,"next":null},"commentPermission":"anyone","commentsCount":1,"likesCount":5}},"annotationDetail":null,"commentsCount":1,"likesCount":9,"FULLINFO":true}},"User":{"tianmaying":{"isFollowed":false,"name":"David","headline":"天码营创始人(官方网站:),致力于打造新一代的技术学习服务平台,提供创新并且专业的内容、工具与服务,帮助学习者与从业者实现个人价值。","avatarUrl":"/799df728d7d9e8e52b9eb_s.png","isFollowing":false,"type":"people","slug":"tianmaying","bio":"天码营-实战开发技术学习平台-创始人","hash":"acd41dfe43fcc818e301fef16a0c008c","uid":437300,"isOrg":false,"description":"天码营创始人(官方网站:),致力于打造新一代的技术学习服务平台,提供创新并且专业的内容、工具与服务,帮助学习者与从业者实现个人价值。","profileUrl":"/people/tianmaying","avatar":{"id":"799df728d7d9e8e52b9eb","template":"/{id}_{size}.png"},"isOrgWhiteList":false,"badge":{"identity":null,"bestAnswerer":null}}},"Comment":{},"favlists":{}},"me":{},"global":{"experimentFeatures":{"ge3":"ge3_9","ge2":"ge2_1","nwebStickySidebar":"sticky","newMore":"new","liveReviewBuyBar":"live_review_buy_bar_2","liveStore":"ls_a2_b2_c1_f2","isOffice":"false","homeUi2":"default","answerRelatedReadings":"qa_recommend_with_ads_and_article","remixOneKeyPlayButton":"headerButton","qrcodeLogin":"qrcode","newBuyBar":"livenewbuy3","newMobileColumnAppheader":"new_header","zcmLighting":"zcm","favAct":"default","appStoreRateDialog":"close","mobileQaPageProxyHeifetz":"m_qa_page_nweb","iOSNewestVersion":"4.2.0","default":"None","wechatShareModal":"wechat_share_modal_show","qaStickySidebar":"sticky_sidebar","androidProfilePanel":"panel_b"}},"columns":{"next":{},"tianmaying":{"following":false,"canManage":false,"href":"/api/columns/tianmaying","name":"David教你学Java Web开发","creator":{"slug":"tianmaying"},"url":"/tianmaying","slug":"tianmaying","avatar":{"id":"327efd931bc33","template":"/{id}_{size}.jpeg"}}},"columnPosts":{},"columnSettings":{"colomnAuthor":[],"uploadAvatarDetails":"","contributeRequests":[],"contributeRequestsTotalCount":0,"inviteAuthor":""},"postComments":{},"postReviewComments":{"comments":[],"newComments":[],"hasMore":true},"favlistsByUser":{},"favlistRelations":{},"promotions":{},"switches":{"couldAddVideo":false},"draft":{"titleImage":"","titleImageSize":{},"isTitleImageFullScreen":false,"canTitleImageFullScreen":false,"title":"","titleImageUploading":false,"error":"","content":"","draftLoading":false,"globalLoading":false,"pendingVideo":{"resource":null,"error":null}},"drafts":{"draftsList":[],"next":{}},"config":{"userNotBindPhoneTipString":{}},"recommendPosts":{"articleRecommendations":[],"columnRecommendations":[]},"env":{"edition":{},"isAppView":false,"appViewConfig":{"content_padding_top":128,"content_padding_bottom":56,"content_padding_left":16,"content_padding_right":16,"title_font_size":22,"body_font_size":16,"is_dark_theme":false,"can_auto_load_image":true,"app_info":"OS=iOS"},"isApp":false},"sys":{},"message":{"newCount":0},"pushNotification":{"newCount":0}}

我要回帖

更多关于 java企业级开发 的文章

 

随机推荐