1.Java基础知识(排序、算法、设计模式、I/O、多线程、Swing等、面向对象编程思想)
2.前端框架:jqueryUI、EasyUI、BootStrap、Anglurjs、EXT、Html5、CSS
3.模板引擎框架:Freemarker 、Velocity、XMLTemplate等
4.第三方报表插件:HighCharts、Echarts、FunshionCharts、JFreeeCharts等
5.网络请求框架:Ajax、HttpClient、Webservice(RMI、CXF)
6.远程调用RPC:java RMI,Spring Httpinvoker
7.Web应用开发框架SSH、JDBC+JSP+Servlet+Filter+JSTL
8.ORM映射框架:Hibernate、Mybatis、Spring Data JPA、Ebean、EclipseLink
9.关系型数据库:Oracle、Mysql、SQLSERVER等 使用SQL和PL/SQL进行数据库编程
10.非关系数据库:NOSQL、Mongdb等(针对于大数据)
11.java集成开发IDE:Eclipse、Myeclipse、Intellij
12.前端开发环境:WebStrom
13.建模工具:PowerDesign、Enterprise Architect 设计分析对象之间的关系
14.UML进行面向对象的分析和设计
15.Axure 产品原型工具
16.DreamWeaver 前端页面编辑工具
17.项目构建、管理:maven、spring boot 、Gradle
18.软件版本控制工具:svn、git
19.文本处理:POI、iText
20.作业调度:Quartz
21.应用服务器:tomact、jboss、jetty等 集群、负载均衡的配置
22.单元测试:Junit
23.服务架构:三层架构(Controller、Serivce、Dao)、
24.面相服务体系架构(SOA) 以服务组件的形式提供服务
25.流程引擎:Activit 灵活、简单、易扩展
26.用户权限控制:Spring security3 、Apace Shrio单点登录:SOS
27.Linux简单操作命令
28.Spring相关框架Spring Ioc(依赖注入)、Spring AOP(事务管理)、Spring Batch(批处理框架) 、Spring LDAP 、Spring Data (ORM映射)、Spring Boot(快速构建应用)
29.高并发的处理
30.分布式服务治理框架:dubbo zookeeper
31.缓存框架:redis、memcached
<相关技术解析>
<>微服务架构、单体应用架构
应用核心是业务逻辑,有定义服务、域对象、和事件模块组成,适配器包括数据库访问组件、生产和消息组件,以及提供API或UI和支持web模块等
1.单体式应用
单体式应用随着时间的推移,应用将会变成”巨石型应用”。使开发人员难以弄懂复杂的应用,对修复BUG好添加新功能造成困难,降低了开发的速度,不利于持续开发。
单体应用由不同模块组成,一旦任何一个模块有一个BUG,则会导致其他模块服务,将会影响整个项目的运行,对于敏捷开发是不利的
2.微服务
将复杂的单体式应用分解成多个互相连接的子系统,
微服务架构每个服务都有自己的数据库
微服务架构不包括Web服务和ESB(企业服务总线)服务
微服务的特征:
(1).通过服务实现组件化
(2)按业务能力划分服务和团队,新兴职业:全栈式工程师
(3)服务即产品:传统的应用软件的开发都是基于项目模式,根据功能列表完成开发并交付客户后,进入维护模式,由维护团队进行维护.,而微服务则是需要开发人员负责产品的全部生命周期
(4)智能终端与哑管道:抛弃繁杂业务规则编排、消息路由等
(5)去中心统一化:根据不同的问题选择合适的技术解决问题
(6)基础设施自动化:针对于开发和测试、部署
(7)Design for failure
(8)进化设计:服务契约,
Be conservative in what you send, be liberal in what you accept.(伯斯塔尔法则)
发送时要保守,接收时要开放。
(9)如何将单一的应用拆分为多个服务:两个功能之间没有相互影响,只是存在相互调用的关系
<>Ajax工作原理:
① Ajax 全称“Asynchronous JavaScript and XML”(异步的javascript和XML)
② Ajax包含以下技术:
a. XHTML和CSS
b. 使用文档对象模型做动态显示和交互
c. 使用javacript来进行绑定和调用
d. 使用xmlhttpRequest将它们进行绑定在一起
实现原理图:
Ajax优势:
1.通过异步模式,提高用户体验;
2.优化浏览器和服务器之间的传输,减少不必要的数据返回,减少带宽占用
3.减少服务器的负载
Ajax劣势:
1.不能实时请求和响应服务器数据
2.不支持浏览器回退功能
3.不支持提交多媒体数据
<>dubbo 与Zookeper 分布式服务治理框架,
由阿里巴巴开发的SOA分布式服务化治理框架
dubbo中5个重要的角色:
1.Container :服务运行容器
2.Provider:暴露服务的提供方
3.Register:服务注册与发现的注册中心
4.Consumer:调用远程服务的服务消费方
5.Monitor:统计服务的的调用次数和调用的时间的监控中心
Duboo服务调用关系:
0. 服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Duboo与Zookeper、Spring MVC的整合:
Zookeper作为Duboo的服务注册中心,Duboo原先基于数据库的注册中心
1.建立maven项目:maven-dubbo-api 新增服务接口
2.建立maven项目:maven-dubbo-consumer 实现服务接口
3.配置xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:annotation package="com.bjhy.platform.serivce.basedata" />
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="basedata-base-info" />
<!-- 使用multicast广播注册中心暴露服务地址 -->
<dubbo:registry protocol="zookeeper" address="192.168.0.94:2181" />
<!--<dubbo:registry address="multicast://224.5.6.7:1234" /> -->
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20881" />
</beans>
<>ORM (Hibernate、Mybatis、Spring Data JPA)
Hibernate 对数据库提供了较为完整的封装,着力点对象与对象之间关系
l Hibernate实体类注解,@Table、@Id、@ManyToOne、@OneToManay等
l Hibernate封装了对象的基本增删改查方法
l Hibernate查询
.1.HQL --->from Admin as admin where admin.name =:name 使用命名参数,仅使用与Hiberante框架
2.Criteria---->对象化查询 Criteria c = getSession().Criteria(Admin.class)
c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或
c.add(Restrictions.eq("apassword", password));
3.DetachedCriteria----->动态分离查询
4.例子查询-Example.create(user).list()
5.sql查询
Query q = s.createSQLQuery("select * from user").addEntity(User.class);
6.命名查询:Query q = getSession().getNamedQuery(“getUserByID”);
l Hibernate三种状态之间的转换
l Hibernate 缓存机制
l Hibernate N+1查询问题,避免全表扫描,解决方案 :(1).懒加载;(2)迫切左外连接
Hibernate 方便快捷、但是不便于控制底层sql
Mybatis支持普通的sql查询、存储过程、高级映射的优秀持久框架,使用XML或注解配置和原始映射
l 定义xml例如;userMapper.xml
l 定义接口userMapper 定义相关的方法 不必编写接口的实现类
l 通过mybatis内部处理机制解析xml文件中的sql
l 调用存储过程 {call 存储过程名}
Mybatis 方便控制sql,对sql进行优化等操作,但是繁杂的sql迫使xml文件的可读性较差
Spring Data JPA 极大的简化了数据库访问,并支持云服务的开源框架 ORM框架、JPA规范
其主要目标是使得对数据库的访问变得方面简捷,并支持map-reduc框架和云计算数据服务
Spring Data JPA核心接口:
1.Repository:最顶层的空接口,目的是为了统一所有Repository的类型,且在组件扫描的时候自动识别
2.CrudRepository:提供CRUD功能
3.PagingAndSortingRepository:是CrudRepository的子接口,提供分页和排序的功能
4.JpaRepository:是PagingAndSortingRepository的子接口,提供了常用的功能,比如:批量操作等
5.JpaSpecificationExector:负责查询的接口
6.Specification:Spring Data JPA提供的一个查询规范,用于复杂查询
实现过程:
1.添加Spring Data JPA相关jar
2.编写Entity类,按照JPA规范,定义实体类
3.编写Repository接口,依靠Spring Data规范,定义数据访问接口,不需要实现
查询方式:
命名查询,需要遵循Spring Data规范,例如findByUser、deleteById 等从右向左解析生成sql
注解查询:@Query(“ql语句”)
调用存储过程:通过注解@NamedStoredProcedureQueries,也可以自定义Repository
创建不同ORM的工具类包
<>Spring AOP
面向切面编程,主要用于日志记录、性能监控、安全检测等
术语:
1.切面(Aspect) 适用于类中(@Aspect)
2.连接点(JoinPoint) 一个连接点代表一个方法的执行
3.通知(Advice) 包括 around、before、after 等通知类型,一般都是用拦截器做通知模型(拦截器链)
4.切入点(Pointcut)定义出一个或一组方法,当执行这些方法时可产生通知,Spring缺省使用AspectJ切入点语法
通知类型
· 前置通知(@Before):在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)
· 返回后通知(@AfterReturning):在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回
· 抛出异常后通知(@AfterThrowing):方法抛出异常退出时执行的通知
· 后通知(@After):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)
· 环绕通知(@Around):包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型,环绕通知可以在方法调用前后完成自定义的行为,它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行
Spring Aop配置的两种方式:
1.Xml
2.注解
<>网站高并发处理
1. Html静态化
2. 读写服务器分离
3. 数据库集群和库表散列
4. 缓存 架构缓存:使用缓存服务模块,网站开发缓存:redis,memecache
5. 负载均衡
<>Spring Batch(批处理框架)
Spring Batch是一个轻量级的框架,完全面向Spring的批处理框架,用于企业级大量的数据读写处理系统。以POJO和Spring 框架为基础,包括日志记录/跟踪,事务管理、 作业处理统计工作重新启动、跳过、资源管理等功能。
业务方案:
1、批处理定期提交。
2、并行批处理:并行处理工作。
3、企业消息驱动处理
4、大规模的并行处理
5、手动或是有计划的重启
6、局部处理:跳过记录(如:回滚)
技术目标:
1、利用Spring编程模型:使程序员专注于业务处理,让Spring框架管理流程。
2、明确分离批处理的执行环境和应用。
3、提供核心的,共通的接口。
4、提供开箱即用(out of the box)的简单的默认的核心执行接口。
5、提供Spring框架中配置、自定义、和扩展服务。
6、所有存在的核心服务可以很容的被替换和扩展,不影响基础层。
7、提供一个简单的部署模式,利用Maven构建独立的Jar文件。
实现步骤:
1.定义处理对象
2.创建中间转换器 ***ItemProcessor 实现 ItemProcessor<I,O>接口
3.创建工作Job BatchConfiguration 主要处理读数据、处理数据、写数据等操作
4.创建listener job执行监听器
一般的批处理系统需要处理大量的数据, 内部消化单条记录失败的情况, 还要管理中断,在重启后也不去重复执行已经处理过的部分
Spring Batch单/多处理单元(processors), 以及多个微线程(tasklets)
Spring Batch处理的过程:
Spring Batch
读写文件的类型 :文件(CSV、XML)、数据库数据、消息队列等 复合文件的读写、
支持数据库类型:Oracel、mysql等
如何处理多个job?
Spring Batch 两大特性:并行计算的能力,数据模型的创建。
支持事务、并发、监控提供统一的读写接口,以及多种处理方式,使开发者专注在业务逻辑上
http://www.cnblogs.com/gulvzhe/archive/2011/12/20/2295090.html
Spring Batch 主要用于批处理和离线处理,
例如:营业结束处理:报表、订单处理、财务对账;
导入和导出处理:表单处理、清单导入、配置导入
大规模输出工作:email操作和财务结算
<>Spring LDAP
Spring LDAP 基于Spring的jdbcTemplate模式的LDAP操作java库,提供了colse contexts、looping through results, encoding/decoding values and filters等功能
LDAP增删改查
<>Apace Shrio(安全验证框架)
<>多线程并发处理
1.Synchronized(数据共享)关键字主要解决多线程共享数据同步的问题,利用锁机制,使变量或者代码块在某一时刻只能被一个线程访问
2.ThreadLocal(数据隔离)主要解决线程中数据因并发不一致的问题。为每一个线程提供一个变量副本
3.Lock接口。获取锁(lock)--->释放锁(unlock)--->lockInterruptibly-->tryLock
4.ReadWriteLock接口(读写的排他锁)
ReentrantLock类和ReentrantReadWriteLock:他们具有重入性:即允许一个线程多次获取同一个锁(他们会记住上次获取锁并且未释放的线程对象,和加锁的次数,getHoldCount())
同一个线程每次获取锁,加锁数+1,每次释放锁,加锁数-1,到0,则该锁被释放,可以被其他线程获取
<>高级同步对象
1.信号量
a、acquire(),以阻塞方式获取许可
b、tryAcquire(),以非阻塞方式获取许可
c、release(),释放许可。
d、accquireUninterruptibly(),accquire()方法获取许可以的过程可以被中断,如果不希望被中断,使用此方法。
2.倒数闸门,一个线程等待另外的线程完成任务才能继续执行。
countDownLatch
3.循环屏障:CyclicBarrier
4.对象交换器(Exchanger):适合两个线程需要进行数据交换的场景
<>多线程数据结构
1.BlockingQueue接口
2.BlockingDeque接口
<>实现多线程的方式
1.继承Thread
2.实现Runanable接口
3.实现Callable接口 有返回值,抛出受检异常
Future接口
过去,异步线程的任务执行结果,要求主线程和任务执行线程之间进行同步数据。Future通过get()方法可以获取异步的结果 ,如果任务未执行完, 会等待,直到任务完成或被取消,cancel()可以取消。
组合接口:
<>联机分析(mondrain)
了解mondrain相关定义?mdx语句如何定义?如何执行mdx语句?数据的格式?
考虑数据实时有效性、服务直接的通信?
数据查询服务----->数据组装服务---->数据处理服务-->前端展示
数据查询服务:
1.定义mondrain查询语句,通过xml的形式定义(其中涉及头部数据,内容数据【可变的】)定义语句的层级关系很重要
2.使用设计模式组合模式(compisite)解析xml
3.定义查询mondrain结果集的接口规范
4.将数据结果集以json的形式存储到文本文件(利用JSONOBJECT 进行序列化和反序列化)
5.文件存储读取服务:提供存储文件、更新文件数据、读取文件数据等功能
数据组装服务:
1.根据时间、地域等条件将文件数据和查询数据组装成最后的数据集合。此过程包含数据筛选、数据分析等过程
数据处理服务:
1.多种数据源连接查询(c3p0,mondrain等)
2.数据库连接池,避免创建、释放 数据库连接开销
2.解析mondrain语句查询后的结果集,头部数据、内容数据满足前端ui的展示
3.提供查询mondrain数据的接口,通过java RMI的方式
Mdx语句:
WITH MEMBER [地区].[$area].[合计] AS
'Sum([地区].[$area].Children)'MEMBER [Measures].[上年到达数目标值] AS
'Sum({ParAllelPeriod(Year,1,[时间].[$year].[12])}*{[Measures].[年度到达]})'MEMBER
[Measures].[净增目标] AS '[Measures].[到达目标]-[Measures].[上年到达数目标值]'select
AddCalculatedMembers([地区].[$area].Children) ON
columns,{{[时间].[$year]}*{[Measures].[到达目标],[Measures].[净增目标]}}ON
rows from [ACCOUNT_NUM_GOAL]
Mondrain相关概念:
基于java写的OLAP引擎(联机分析平台),使用mdx语言实现查询,从关系数据库中读取数据,通过java api多维的方式多结果进行展示
Mondrain OLAP系统由四个层组成,从最终用户到数据中心,
1.表现层
2.维度层
3.集合层
4.存储层
各层技术
1.表现层:jPivot 是Mondrin的表现层TagLib,通过xml/XSTL渲染报表 JSP+TagLib
2.维度层:解析、验证、执行MDX
3.集合层:维护和创建集合缓存
4.存储层:存储集合的单元数据
立方体(cub)、维度、度量、层次、成员
Webservice
1.java RMI
2.Spring RMI
Java RMI优点:
1.面向对象
2.可移动性
3.设计方式
4.安全性高
5.便于编写和使用
6.可连接现有/原有系统
7.编写一次,到处运行
8.分布式垃圾收集
9.并行计算
实现步骤:
1.定义远程服务接口,继承Remtoe类。
2.实现远程服务接口,继承UnicastRemoteObject类
3.注册远程服务对象,
LocateRegistry.createRegister(端口号)
Naming.bind(“rmi://localhost:8099/test”,接口实例)
4.客户端调用 Naming.lookup(arg,address)
Spring RMI
实现步骤:
1.定义远程服务接口
2.实现远程服务接口同时实现Serializable序列化接口
3.配置客户端、服务端XML
类:org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter
Java 序列化和反序列化
序列化:将对象转换为字节序列的过程
反序列化:将字节恢复为对象的过程
1.实体类实现Serializable接口,具备序列化的能力
2.serialVersionUID 序列化的版本号,防止序列化和反序列化的对象不一致
3.序列化和反序列化的技术:JSONObect、objectInputStream/objectOutputStream
<>Maven相关技术
1.作用:jar定位、构建项目
2.依赖的库:中央仓库、本地仓库、私服仓库nexus
3.构建的项目层次:src/main/java、src/main/resources、src/test/java、src/test/resources
4.GAV(groupId 组织ID,artifactId 项目ID,Version 版本号)
5.版本分类:
xxxx.SNAPSHOTR (快照版本) 适用于开发阶段项目之间的相互依赖
xxxx.release (正式版本) 适用于正式阶段项目无错部署
6.maven版本规则
1.1.1
<主版本>.<次版本>.<增量版本>
7.mvn常用命令:
打包命令:mvn package 、mvn install 生成target目录,编译、测试代码,生成测试报告,生成jar/war文件
清空生成的文件:mvn clean
<>Spring IOC 依赖注入 使用反射机制设置对象值
1.作用:管理相互依赖对象的创建、协调工作、生命周期等
2.注入的方式:setter注入、构造函数注入
<>shiro
Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境。Shiro可以帮助我们完成:认证、授权、加密、会话管理、与Web集成、缓存等
<>离线分析程序
设计技术:Spring Quartz, 、Spring JdbcTemplate、Spring Ioc、设计模式(Command)
实现思路:
1.配置数据源PersistConfig,分别配置两个数据源,在获取两个数据源的方法上使用@Bean注解,通过读取Properties文件中的数据连接信息,设置dataSource相关参数 (config层)
2.Command接口 统一调度analyze()、transfort()方法,其他service接口只需要实现该接口,编写相关代码,
3.查询、插入、更新数据的service接口(service层)查询数据、组装数据、插入数据
4.定时器接口Ischedule,实现该接口需在接口上使用@Component注解,
定时器时间使用@Scheduled(cron = "0/5 * * * * ? ") ,在 timer()方法中调用相应service方法,此处调用需要使用注解@Qualifier("serviceName")过滤执行自己的service。
5.编写sql语句、Date、String等工具类
6.编写junit测试方法,测试相关方法是否执行。
<>条件检索
实现效果:客户端根据所选择的不同表的字段,查询条件动态生成表格数据
主要功能:
1.选择查询条件页面,
2.选择查询字段页面
3.展示查询数据页面
前端效果:
1.条件页面,根据上方表格选择的项目,实时的显示在下方表格中,双击表格中的列可移除。
2.下一步,选择查询字段页面,选中单个的checkbox或全选框,则显示在下方的中,取消勾选或者双击表格中的列可移除,表格默认选中罪犯编号、姓名字段。
3.下一步,根据所选的查询条件和查询字段动态生成表格数据,并默认合并前两列相同的数据,
具体实现思路:
1.涉及类:
① 自定义注解 @interface ColumnCofing类,定义 String des() default “”方法用于描述字段的说明信息
② FieldsHelper工具类,通过java反射获取类中标注@ColumnConfig注解的字段, 定义:
方法:initAnnoField(Class clzz)
参数:Class clzz 具体的实体类
返回值:List<LinkedHashMap<String,Object>>
③ VO类:
SearchCondition(查询条件):
propertyName、propertyValue,propertyType,propertyOp、tableName
FieldInfo(查询字段):
fieldName、tableName
ColumnInfo(表格列数据):
colName(中文名)、colModel(实体属性)
④ ParseUtils 工具类,主要用于解析查询条件、查询字段、分页查询、总条数等一系列方法,最终得到完整的查询数据的sql
⑤ 定义JsonHelperService服务接口,提供序列化和反序列化服务
⑥ CommonDao 公共的查询接口,
定义:
方法:doPager
参数:String sql,PageBean pagebean,List<FieldInfo> fieldInfo
返回值:void
处理细节:通过查询的数据和查询的字段集合动态的构建Map对象
⑦ CriminalSearchController控制器处理页面请求和转发
定义:
Index(String pageName) ---请求选择条件的页面
Index2(String pageName)---请求选择字段的页面
Index3(String pageName)--请求表格数据页面
inintCondition(@RequstBody List<SearchCondition> condition)---将页面选择的查询条件存储到session中
inintFields(@RequstBody List<FieldInfo> fieldInfo)---将页面选择的查询字段存储到session中
inintColumn(@RequstBody List<ColumnInfo> columnInfo)---将表格列存储到session中
前端涉及js
Map.js----用于以Key-Value的形式存储选择的查询条件和字段,
Common.js---公共js库,主要包含创建json数组的方法等
query.js----查询条件js
query_2.js---查询字段js
Query_3.js-----查询数据js
动态设置表格列
//循环设置表头和列
for(var i=0;i<data.length;i++){
var colName = data[i].colName;
columnNames.push(data[i].colModel);
var columnModelEle = {
name:data[i].colName, index:data[i].colName, width:200,sortable:true,
align:"center",
cellattr:function(rowId, tv, rawObject, cm, rdata){
return "id=" + colName + rowId;
}
};
columnModel.push(columnModelEle);
}
jqgrid合并单元格
jQuery.fn.tuiTableRowSpan = function(colIndexs) {
return this.each(function() {
var indexs = eval("([" + colIndexs + "])");
for (var i = 0; i < indexs.length; i++) {
var colIdx = indexs[i];
var that;
$('tbody tr', this).each(function(row) {
$('td:eq(' + colIdx + ')', this).filter(':visible').each(function(col) {
if (that != null && $(this).html() == $(that).html()) {
rowspan = $(that).attr("rowSpan");
if (rowspan == undefined) {
$(that).attr("rowSpan", 1);
rowspan = $(that).attr("rowSpan");
}
rowspan = Number(rowspan) + 1;
$(that).attr("rowSpan", rowspan); // do your action for the colSpan cell here
$(this).hide(); // .hide(); // do your action for the old cell here
} else {
that = this;
}
// that = (that == null) ? this : that; // set the that if not already set
});
});
}
});
<>模板引擎
Freemarker相关语法:
1.声明变量:<#assign sum =0/ > 定义数组:<#assign l1=0..100/ >
2.比较数字、日期符号:<、<=、>、>=或者lt、lte、gt、gte
3.逻辑判断:<#if condition>
<#elseif condition2>
<#else condition3>
</#if>
4.空值判断:<#if user.name??>
5.循环读取数组:<#list Object as obj> $obj.name </#list>
6.获取当前数组的索引:item_idex
<>AOP日志系统
目的:为了查看、分析系统异常或者系统操作的问题。
范围:记录service、controller层
实现:
1.定义method、service、controller注解接口,并定义一个默认的描述方法 (annotation层)
2.创建一个切点类SystemLogAspect ,主要处理service、controller层 切点 ,主要涉及前置通知(@Before)、后置通知(@Afater) 的拦截 (aspect层)
3.创建存储日志的接口SystemLogService(系统异常) 包括createSystemLog()、deleteSystemLog()、readSystemLog()等方法,
4.创建SystemLogFilterService(系统操作)包括:createSystemFilterLog()、readSystemFilterLog()等方法
5.创建系统异常日志对象 SystemLog 主要包括字段:id,userName,className,methodName、actionName,logLevel、logDesc、IP、logTime
6.创建系统操作日志对象 SystemFilterLog 主要包括字段:methodName、createTime、IP、userName等
7.将controller的代理权交给cgllib,xml文件中添加对@Apsect注解的支持<aop:aspectj-autoproxy/>
-通知spring使用cglib而不是jdk的来生成代理方法 AOP可以拦截到Controller
<aop:aspectj-autoproxy proxy-target-class="true" />
6.使用方式:使用相对应层的自定义注解 Service层:SystemServiceLog(description = "查询用户") 、controller层 SystemControllerLog(description = "删除用户")
<>Spring Ioc
概念:主要用来完成对象的创建和依赖管理注入等,采用setter注入和构造函数注入对象之间的依赖
Spring bean的创建是典型的工厂模式,采用了设计模式-模板模式,定义了一系列的抽象类,将部分逻辑以具体方法和构造函数的形式实现,将剩余的逻辑方法,让子类去实现,不同的子类有不同的实现方式
程序 = 数据结构+算法
程序员编程能力的层次:
1.编程技能,设计和编写程序的能力
2.领域知识,不同语言
程序员级别:
1.基础程序员,可以编程完成指定任务,对于特殊情况下的Bug无法及时修复
2.数据结构,使用算法解决问题,算法依附于数据结构
3.面相对象,掌握继承,封装,多态,接口,逻辑运算、排序集合、类和类,对象和对象之间的关系,数据库的表其实就是一个类,每一行记录就是一个类的实例,即对象,表与表之间的关系就是类与类之间的关系,
4.设计模式,利于程序的扩展性,实现程序之间的解耦,
5.语言专家,了解多门语言
编程范式:
1.静态类型编程范式 swift,Go语言
2.动态类型编程范式
3.面向对象编程范式
4.函数式编程范式,javaScript、OCaml等,ExJS 利用javascript模拟Swing的设计思想,提供整套的UI库
5.模板编程范式 C++
架构设计
分层
1.表现层--UI
2.接口层--后台服务通讯接口
3.服务层--实际服务
4.存储层--持久化存储,数据库或文件
SOA
模块之间通过网络通讯相互连接,松耦合