Java开发心得
1. Spring概述
Spring 是一个开源框架,是为了解决企业应用程序开发复杂性由Rod Johnson创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
强大的基于 JavaBeans 的采用控制翻转(Inversion of Control,IoC)原则的配置管理,使得应用程序的组建更加快捷简易。
2. Spring MVC
Spring MVC框架是有一个MVC框架,通过实现Model-View-Controller模式来很好地将数据、业务与展现进行分离。URL的处理流程见下图:
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将视图名称解析称为试图对象,它就会呈现视图对象,并传递控制器返回的模型。视图的任务是将模型属性展示给用户。
3. 装配组件
装配组件可以使用配置文件,也可以使用注解。
项目的Spring配置文件:
如果使用注解,需要在配置文件中指明搜索注解的位置;
<context:annotation-config /> <context:component-scan base-package="com.mycompany.project.config" /> <context:component-scan base-package="com.mycompany.project.model" /> <context:component-scan base-package="com.mycompany.project.controller" /> <context:component-scan base-package="com.mycompany.project.service" /> <context:component-scan base-package="com.mycompany.project.dao" />
本项目使用的注解含义:
@Controller 用于标注控制层组件
@Autowired 完成自动装配的工作,通过@Autowired的使用来消除set和get方法
@RequestMapping 配置URL请求
@ResponseBody 后台返回数据使用JSON格式
@RequestParam 必选参数,URL中必有含有该参数才能匹配上
@Service 服务层组件,用于标注业务层组件
@Transactional 在service类前加,声明这个service所有方法需要事务管理。每一个业务方法开始时都会打开一个事务
@Repository 持久层组件,用于标注数据访问组件,即DAO组件
4. Hibernate
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
本项目使用的注解含义:
配置项 作用
@JsonAutoDetect 自动生成JSON格式数据
@Entity 实体类
@Table 映射数据库表明
@Id 映射主键
@Column 映射字段
@DateTimeFormat 时间日期字符串解释器
@Transient 不存入数据库字段
5. ExtJs
ExtJS是一种主要用于创建前端用户界面,是一个基本与后台技术无关的前端ajax框架。
AJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。AJAX的作用是使用Javascript向服务器提出请求并处理响应而不阻塞用户。核心对象XMLHTTPRequest。通过这个对象,您的JavaScript可在不重载页面的情况与Web服务器交换数据。
说明:Java和JavaScript是完全不同的2中语言,JavaScript是脚本语言,前台浏览器可以运行。Java是跨平台的语言,应用很广。
注意:用户的输入可以在前台使用JavaScript判断,这样做是为了减轻后台服务器的压力,提高效率。但是从安全角度出发,用户输入的有效性后台还是必须再判断一次的。
6. JUnit
JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中为最成功的一个。 JUnit是在极限编程和重构(refactor)中被极力推荐使用的工具,因为在实现自动单元测试的情况下可以大大的提高开发的效率。另外,在项目初期阶段,整个平台框架还没有搭建起来,这时候写的代码只能通过JUnit来测试。
7. Quartz
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点
8. 经验总结
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。