Spring 是一个开源框架,是为了解决企业应用程序开发复杂性由Rod Johnson建立的。框架的主要优点之一就是其分层架构,分层架构容许使用者选择使用哪个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成之前只可能由EJB完成的事情。
强大的基于 JavaBeans 的采用控制翻转(Inversion of Control,IoC)原则的配置管理,使得应用程序的组建更加快捷简易。前端
Spring MVC框架是有一个MVC框架,经过实现Model-View-Controller模式来很好地将数据、业务与展示进行分离。URL的处理流程见下图:java
1. 当DispatcherServlet接到请求时,他先回查找适当的处理程序来处理请求。DispatcherServlet经过一个或者多个处理程序映射,将每一个请求映射处处理程序中。处理程序映射配置在web应用程序的上下文中,是实现了HandlerMapping接口的Bean。它负责为请求返回一个适当的处理程序(也就是Controller)。处理程序映射一般根据请求的URL将请求映射处处理程序(Controller)。
2. 一旦DispatcherServlet选择了适当的控制器(Controller),它就会调用这个控制器来处理请求。
3. 控制器处理完请求后,会将模型和视图名(有时候是视图对象)返回给DispatcherServlet。模型包含了控制器要传递给视图进行显示的属性。若是返回的是视图名称,它会被解析成视图对象再进行呈现。绑定模型和视图的基本类是ModelAndView。
说明:本项目全部Controller返回的都是JSON数据,视图的逻辑都是在前台由ExtJs实现的。
4. 当DispatcherServlet接收到模型和视图名称时,它会将逻辑视图名称解析成视图对象再进行呈现。DispatcherServlet从一个或者多个视图解析器中解析视图。视图解析器配置在Web应用程序上下文中,是实现了ViewResolver接口的Bean。它的任务是根据逻辑视图名称返回试图对象。
5. 一旦DispatcherServlet将视图名称解析称为试图对象,它就会呈现视图对象,并传递控制器返回的模型。视图的任务是将模型属性展现给用户。mysql
装配组件可使用配置文件,也可使用注解。
项目的Spring配置文件:
若是使用注解,须要在配置文件中指明搜索注解的位置;程序员
<context:annotation-config /> <context:component-scan base-package="com.topsec.ai.config" /> <context:component-scan base-package="com.topsec.ai.model" /> <context:component-scan base-package="com.topsec.ai.controller" /> <context:component-scan base-package="com.topsec.ai.service" /> <context:component-scan base-package="com.topsec.ai.dao" />
本项目使用的注解含义:
@Controller 用于标注控制层组件
@Autowired 完成自动装配的工做,经过@Autowired的使用来消除set和get方法
@RequestMapping 配置URL请求
@ResponseBody 后台返回数据使用JSON格式
@RequestParam 必选参数,URL中必有含有该参数才能匹配上
@Service 服务层组件,用于标注业务层组件
@Transactional 在service类前加,声明这个service全部方法须要事务管理。每个业务方法开始时都会打开一个事务
@Repository 持久层组件,用于标注数据访问组件,即DAO组件web
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了很是轻量级的对象封装,使得Java程序员能够为所欲为的使用对象编程思惟来操纵数据库。
本项目使用的注解含义:
配置项 做用
@JsonAutoDetect 自动生成JSON格式数据
@Entity 实体类
@Table 映射数据库代表
@Id 映射主键
@Column 映射字段
@DateTimeFormat 时间日期字符串解释器
@Transient 不存入数据库字段ajax
ExtJS是一种主要用于建立前端用户界面,是一个基本与后台技术无关的前端ajax框架。
AJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。AJAX的做用是使用Javascript向服务器提出请求并处理响应而不阻塞用户。核心对象XMLHTTPRequest。经过这个对象,您的JavaScript可在不重载页面的状况与Web服务器交换数据。
说明:Java和JavaScript是彻底不一样的2中语言,JavaScript是脚本语言,前台浏览器能够运行。Java是跨平台的语言,应用很广。
注意:用户的输入能够在前台使用JavaScript判断,这样作是为了减轻后台服务器的压力,提升效率。可是从安全角度出发,用户输入的有效性后台仍是必须再判断一次的。spring
JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma创建,逐渐成为源于Kent Beck的sUnit的xUnit家族中为最成功的一个。 JUnit是在极限编程和重构(refactor)中被极力推荐使用的工具,由于在实现自动单元测试的状况下能够大大的提升开发的效率。另外,在项目初期阶段,整个平台框架尚未搭建起来,这时候写的代码只能经过JUnit来测试。sql
Quartz是一个彻底由java编写的开源做业调度框架。项目中每日构建规则库,运行规则库识别率误报率和定时备份数据库,都是由Quartz实现调度的。
配置触发器的cronExpression属性能够定义触发时间。数据库
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="methodInvokingJobDetail" /> </property> <property name="cronExpression"> <value>00 01 00 * * ?</value> </property> </bean>
cronExpression配置值说明:编程
字段 | 容许值 | 容许的特殊字符 |
秒 | 0-59 | , - * / |
分 | 0-59 | , - * / |
小时 | 0-23 | , - * / |
日期 | 1-31 | , - * ? / L W C |
月份 | 1-12 或者 JAN-DEC | , - * / |
星期 | 1-7 或者 SUN-SAT | , - * ? / L C # |
年(可选) | 留空 或者1970-2099 | , - * / |
通配符说明:
* 表示全部值. 例如:在分的字段上设置 "*",表示每一分钟都会触发。
? 表示不指定值。使用的场景为不须要关心当前设置这个字段的值。例如:要在每个月的10号触发一个操做,但不关心是周几,因此须要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?
- 表示区间。例如 在小时上设置 "10-12",表示 10,11,12点都会触发。
, 表示指定多个值,例如在周字段上设置 "MON,WED,FRI" 表示周一,周三和周五触发
/ 用于递增触发。如在秒上面设置"5/15" 表示从5秒开始,每增15秒触发(5,20,35,50)。 在月字段上设置'1/3'所示每个月1号开始,每隔三天触发一次。
L 表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,若是是二月还会依据是不是润年[leap]), 在周字段上表示星期六,至关于"7"或"SAT"。若是在"L"前加上数字,则表示该数据的最后一个。例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五"
W 表示离指定日期的最近那个工做日(周一至周五). 例如在日字段上设置"15W",表示离每个月15号最近的那个工做日触发。若是15号正好是周六,则找最近的周五(14号)触发, 若是15号是周未,则找最近的下周一(16号)触发.若是15号正好在工做日(周一至周五),则就在该天触发。若是指定格式为 "1W",它则表示每个月1号日后最近的工做日触发。若是1号正是周六,则将在3号下周一触发。(注,"W"前只能设置具体的数字,不容许区间"-").
# 序号(表示每个月的第几个周几),例如在周字段上设置"6#3"表示在每个月的第三个周六.注意若是指定"#5",正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了) ;
小提示:
'L'和 'W'能够一组合使用。若是在日字段上设置"LW",则表示在本月的最后一个工做日触发;
周字段的设置,若使用英文字母是不区分大小写的,即MON 与mon相同;
例子:
1 "0 0 12 * * ?" 天天中午12点触发
2 "0 15 10 ? * *" 天天上午10:15触发
3 "0 15 10 * * ?" 天天上午10:15触发
4 "0 15 10 * * ? *" 天天上午10:15触发
5 "0 15 10 * * ? 2005" 2005年的天天上午10:15触发
6 "0 * 14 * * ?" 在天天下午2点到下午2:59期间的每1分钟触发
7 "0 0/5 14 * * ?" 在天天下午2点到下午2:55期间的每5分钟触发
8 "0 0/5 14,18 * * ?" 在天天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
9 "0 0-5 14 * * ?" 在天天下午2点到下午2:05期间的每1分钟触发
10 "0 10,44 14 ? 3 WED" 每一年三月的星期三的下午2:10和2:44触发
11 "0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
12 "0 15 10 15 * ?" 每个月15日上午10:15触发
13 "0 15 10 L * ?" 每个月最后一日的上午10:15触发
14 "0 15 10 ? * 6L" 每个月的最后一个星期五上午10:15触发
15 "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每个月的最后一个星期五上午10:15触发
16 "0 15 10 ? * 6#3" 每个月的第三个星期五上午10:15触发
17 “0 0 6 * * *” 天天早上6点
18 “0 0 */2 * * *” 每两个小时
19 “0 0 23-7/2,8 * * *” 晚上11点到早上7点之间每两个小时,早上八点
20 “0 0 11 4 * 1-3” 每月的4号和每一个礼拜的礼拜一到礼拜三的早上11点
21 “0 0 4 1 1 *” 1月1日早上4点
1. 权限控制是经过Spring MVC的拦截器实现的
<mvc:interceptors> <bean class="com.topsec.ai.common.PermissionAnnotationInterceptor"></bean> </mvc:interceptors>
2. 上传和下载文件都使用流传输文件。
上传文件,前台可使用Ext自带的FileUpload组件,后台直接使用request.getReader()方法可以获得流数据。
下载文件,后台response要作以下设置:
response.setContentType("application/doc"); response.setContentLength((int) file.length()); response.setHeader("fileName", fileName); response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
前台使用Ext.core.DomHelper.append()方法能够下载文件。
3. app.js是ExtJs的入口文件。4. 要管理mysql数据库须要配置其余机器可以经过3306端口链接mysql。首先进入mysql,而后使用gant命令配置远程链接的机器IP地址。5. 时间日期的转换,ExtJs想要解析后台传来的时间类型,就要设置dateFormat=time。