Bootstrap 响应式按钮
<div class="col-sm-2">
<button class="btn btn-default btn-block">
</div>
表现效果:手机上全宽,桌面上2列宽
原理:btn-block 会将按钮变成全宽,但桌面上 col-sm-2 生效,按钮被限制在2列宽中,手机上col-sm-2失效
在自己的项目中整合第三方插件或功能
- 找到所有的依赖项(css、js、jar、配置文件),并且注意依赖项顺序
- 将找到的依赖项添加到自己的项目中(注意放置的位置,让新增加的内容符合项目的文件结构规范)(注意如果本项目中已经引入了相同的依赖项,但版本不同时,要注意冲突情况,如果前段的版本冲突,可以都加入到项目中,在某些页面使用a版本,另外页面使用b版本。如果jar包版本冲突,先尝试使用新版本,不行的话,在考虑使用那个版本改动的代价最小)
- 如果有完整的示例或者项目中有可运行的代码,直接将代码尽量完整地复制到本项目中,能够运行起来后,在修改或删减代码(注意检查控制台有没有报错)
- 如果没有示例代码,则从文档中挑选简单代码实验,先让代码能够跑起来,然后在增加复杂度
- 能跑起来之后,在根据需求去调整,尽可能去实现需求锁要求的界面和功能效果,此时应该简单快速的浏览以下API文档,对整体API有一个印象
注意:优先寻找并使用第三方插件,而不是自己写
注意:网上同类型的第三方插件有可能很多,选择使用那一个的标准是:
- 能满足自己的需求
- 简单好用,文档写得好
- 用的人多,赞的人所
在网页加载完毕之后在执行一段代码
此功能带来的好处是:可以不受js加载顺序的影响,可以将代码放在页面的任何位置,而不出错
在JQuery中,通过下面的方法可以实现
- $(function(){
页面加载完毕后会执行代码
})
- $((document).ready(function())){
页面加载完毕后会执行代码
}
MySQL日期时间类型和函数
- Timestamp:4:1970-01-01 00:00:01~2038
- Date:3:1000-01-01~9999-12-31
- Time:3:-838:00:00~838:59:59
- DateTime:8:1000-01-01 00:00:00~9999
- Year:1:1901~2155
非正常情况下,比如表示历史事件的日期时间无法直接使用内置的日期时间按类型
存储非正常时间方法
- 将年月日拆成3个整数存储
- 使用Date或DateTime另外在加一个字段表示公元前还是公元后,或者年份偏移量
日期时间函数
- NOW():可以获取当前日期和时间,可以赋值给Date、Time、DateTime
- Current_Timestamp():当前时间戳
- Current_Date():获取当前日期部分
- Current_Time():获取当前时间部分
日期时间可以使用+、- 运算符:只是简单的将小时、分钟、秒相加
还可以使用Convert进行类型转换(支持字符串、整数)
时间日期函数:
- 日期加减:date_add()、date_sub()
- 时间加减:time_add()、time_sub()
- 两个日期之差:date_diff()
- 两个时间之差:time_diff()
- 字符串转日期:str_to_date()
- 字符串转时间:str_to_time()
- 计算天数:to_days()
- 时间转秒数:time_to_sec()
- 描述转时间:sec_to_time()
SpringMVC数据格式化
- 数据格式化是数据绑定功能的重要构成部分,能够把用户输入的字符串转换成模型对象的属性值(属性不是字符串类型)
- 格式化提供注解支持
- @DateTimeFormat:用来格式化日期时间
- 如:2017-08-15
- @Number:用来格式化数字
- 如:123,456,789
- @Currency:用来格式化货币
- 如:¥123.00
- @Percent:用来格式化百分数
- 如:99.00%
- @DateTimeFormat:用来格式化日期时间
JSTL的var属性
- JSTL的很多标签都支持var属性,var可以将标签中的计算结果编程一个变量(默认在pageScope中,可以通过scope指定放在那个作用域中),供标签外部使用
- form:input:属性中不能在嵌套JSTL标签,但是还希望能够显示JSTL标签的计算结果,此时使用var就能解决问题
MySQL索引
- 索引存在的意义是加速数据查找!
- 加速的原理是数据使用了特定的算法(二分法、平衡二叉树、BTree)
- 索引的类型
- 普通索引:对数据没有限制,但是对于数据值很少的列建索引的意义不大,如性别或枚举值
- 外键(通常普通索引),当创建外键时,会同时创建一个普通索引
- 唯一性索引:要求数据必须保持唯一性,一个值只能出现一次,否则就报错。索引可以跨越多个列,如:2列、3列。。。用户名、邮箱、手机号、主键(特殊唯一索引)
- 全文索引:用于加速长字符串的搜索(短字符串的like搜索数度也不快,对于长字符串使用like是无法接受的)
- 数据库中的text类型都是长文本、varchar(200以上)
- MySQL的全文索引默认只对英文支持比较好,对于中文,通常会使用某种分词技术。
- MySQL的全文索引智游MyISAM引擎支持。
- MyISAM引擎支持千万级数据存储,但不支持事务。
- 常用的支持事务的引擎是InnoDB,但通常智能支持百万级数据。
- 普通索引:对数据没有限制,但是对于数据值很少的列建索引的意义不大,如性别或枚举值
- 索引的命名规则:i_表名_列名1_列名2..
- 索引方法
- HASH:直接计算出值的存储位置,不需要搜索过程,速度最快
- 适合少量数据
- BTree:通过决策以二分法的方式快速收敛,搜索到结果。当数据量以指数级增长时,搜索时间只以线性方式增长。
- 适合大量数据的索引
- HASH:直接计算出值的存储位置,不需要搜索过程,速度最快
MyBatis的异常处理
- MyBatis会在内部捕获SQLException,捕获之后会在日志中输出错误信息,然后创建一个DataAccessException抛出。
- 所以在Dao和Service应该写throws DataAccessException,不能写SQLException(因为MyBatis已经捕获它,并将之转换成DataAccessException)
关于IP地址
- 获取离服务器最近的机器的IP地址:
- request.getRemoteAddr()
- 在客户机与服务器之间有代理服务器:
- request.getHeader("x-forwarded-for"):指定的就是客户机的真实IP
- request.getHeafer("Proxy-Client-IP"):也有可能是这个头指定的
- 如果使用localhost,那么用getRemoteAddr()得到的值是0:0:0:0:0:0:0:1
- 获取到的IP地址是点分十进制表示法的字符串值
- 对于IPv4数据库可以用一个int值来存储,而且MySQL提供了转换函数
- 点分十进制→int:inet_aton()
- int→点分十进制:inet_ntoa()
- 这两个函数名字来自于c语言函数(Linux系统的函数)
- 使用int存储IP搜索速度要比字符串快很多,添加索引之后,字符串的速度与int速度没法比
- 对于IPv4数据库可以用一个int值来存储,而且MySQL提供了转换函数