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。

 

原文地址:https://www.cnblogs.com/Xavierr/p/3592279.html