Java菜鸟学习日记31
苹果设别按钮(表单)样式外观设置
在苹果设备上,按钮等表单控件默认有苹果风格的外观,如果要去掉这个默认外观,则需要设置css样式:-webkit-appearance:none
- -webkit:iOS和Android浏览器的内核名称。
- -moz:Firefox内核名称
- -e:IE内核
- -o:Opera
关于视频项目时长的存储和程序设计方案
-
数据库存储时使用int而不是time,原因:
- 用int存储可以保存更大的值,比如对所有视频的时长求和会超过1000小时
-
用int存储可以很方便的计算,很方便的进行比较
- (如筛选时长大于1小时小于2小时的视频)
- 不需要太多的类型转换和函数调用
- 在程序层面,为了提升用户体验,需要能够把秒数转换成“时间格式”
- TimeLength【数据模型】:将秒数转换成 小时:分钟:秒,也能实现反向转换
- TimeLengthFormatter【格式化器】:与SpringMVC结合,让SpringMVC能够调用TimeLength的转换功能
- @TimeLengthFormatter【格式化注解】:可以应用到数据模型的属性上,让SpringMVC能够将表单数据绑定到数据模型的属性上
- TimeLengthFormatterFactory【格式化器工厂】:SpringMVC可以通过这个工厂获取格式化器
使用单例模式节省内存空间
- TimeLength很多时候会等于0,为了避免在内存中创建很多为0的TimeLength对象,可以在TimeLength类中增加一个public static final 的属性ZERO。让ZERO = new TimeLength(0,0,0);
- 当程序中需要一个等于零的TimeLength时,直接使用TimeLength.ZERO。而不是自己new TimeLength。
-
这种情况通常要求类是不可变得,以防止ZERO内部被篡改
- 这就要求去掉所有属性的setter方法
判断对象的断言
- 通常不能写成TestCase.assertEquals(obj,new Object());
- 因为obj是现在已经存在的对象,而new Object() 将创建一个新对象,已经存在对象和新对象一定不是同一个对象
- 通常通过下面的方法写断言:
- 通过toString()方法转换成字符串,进行总量判断。前提是需要重写toString方法
- 通过比较各个属性值判断,进行分量判断。
自定义注解
-
@Retention:保留、保持
- Source:只在源代码中保留
- Class:会被编译到Class类文件中
- Runtime:运行时可以获取及加载
-
@Target:目标、位置,注解可以标注的位置
- Type:可以用在类、接口
- Field:用在字段(属性)上
- Method:用在方法上
- Parameter:用在参数上
- @Documented:文档,是否将注解声称到JavaDoc中
- 定义注解使用的是:@interface
- 在注解内部,可以定义一些“方法”,这些“方法”就是注解中的命名参数。还可以使用default指定默认值
格式化器注解工厂
TimeLengthFormatterFactory implements AnnotationFormatterFactory<TimeLengthFormat>
负责将TimeLength小模型、@TimeLengthFromat、TimeLengthFormatter组合起来实现注解驱动的数据绑定,也就是将标记了@TimeLength Format注解的属性与表单提交的数据 此工厂需要添加到SpringMVC的配置文件中
MyBatis自定义类型转换器
- 目标:将程序中的TimeLength对象转换成数据库中的int字段 或者反向将数据库中的int转换成TimeLength对象
- 方法:
- 直接实现TypeHandler接口
- 从BasdTypeHandler继承(已经处理了null的情况,推荐)
在TypeHandler类上标记注解以表名TypeHandler能够支持的类型转换范围
- @MappedJdbcTypes:数据库类型,可以写多个类型
- @MappedTypes:Java类型,可以写多个类型