zoukankan      html  css  js  c++  java
  • 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。

     

  • 相关阅读:
    可爱的中国电信 请问我们的电脑还属于我们自己吗?
    了解客户的需求,写出的代码或许才是最优秀的............
    DELPHI DATASNAP 入门操作(3)简单的主从表的简单更新【含简单事务处理】
    用数组公式获取字符在字符串中最后出现的位置
    在ehlib的DBGridEh控件中使用过滤功能(可以不用 MemTableEh 控件 适用ehlib 5.2 ehlib 5.3)
    格式化json返回的时间
    ExtJs中使用Ajax赋值给全局变量异常解决方案
    java compiler level does not match the version of the installed java project facet (转)
    收集的资料(六)ASP.NET编程中的十大技巧
    收集的资料共享出来(五)Asp.Net 权限解决办法
  • 原文地址:https://www.cnblogs.com/Xavierr/p/3592279.html
Copyright © 2011-2022 走看看