spring mvc中后端int类型参数接收

今天在做项目的时候,发现了一个bug. 表单中选填项如果未填,提交表单失败。而且,在追踪这个bug的时候,在后端代码里打上了断电,可是提交表单的请求都没有进入到断点中。看来不是我后端写的逻辑的问题。
在查找原因的过程中,经前端提醒,说如果他给我传的一个参数是空,然后我用int类型去接收这个参数,spring mvc在将空值转化为int的时候会不会有问题,从而导致发送请求失败呢?
我觉得很有可能,但是当时上线比较急,让前端在提交表单时,我这边如果使用int接收一个参数,他那边传给我这个参数的时候给一个默认值。这样的情况下,测试通过!
事后,自己又研究了下。发现,以后如果想接受int类型的参数,需要这样写:

1
@RequestParam(value = "city_id", required = false, defaultValue = "0") int cityId

而之前的写法是:

1
@RequestParam(value = "city_id", required = false) int cityId

没有指定defaultValue。
以后开发时注意,使用int接受参数时要指定一个defaultValue
至于spring mvc是如果接收参数,并将参数转化为对应的类型,发生这个现象的真实原因在哪里?这些涉及spring mvc原理,我还要慢慢研究。

Thinking In Java读书随笔(1)

12月1日笔记:
为什么是线程而不是进程

  1. 线程机制提供了与操作系统相比更松耦合的实现方式,如果操作系统本身不支持多进程,那基于多进程设计的语言写出的程序就无法正常运行了。(透明的)
  2. JAVA的多线程机制是通过CPU时间分片实现的,这样每个线程本身都觉得自己一直在占用CPU,使得程序编写者无需考虑CPU分配,而且可随意扩展。

12月3日随笔:
今天看书,发现之前居然看过thinking这书的并行部分,居然自己一点想不起来,看来上学那会儿看书也真是看的不过心。
比较有收获的是对Callable接口的熟悉,看这块的时候突然想起来,今年刚刚开始找工作的时候,面试有人问我线程如果要返回结果,如何获取,我居然说不知道,当时确实忘了还有callable接口这回事儿。好吧,太菜了。
总之,现在在git上创建了一个工程,以后看thinking有什么练习都在这个工程里啦。
今天才知道JDK里面线程优先级有10个等级,不过由于与多数操作系统映射不太好,才只使用MAX_PRIORITY, NORM_PRIORITY, MIN_PRIORITY.

今天接触到的新技术

今天在公司,有发现了公司使用的一些新的技术。也许不算很新了,可能也许是我比较孤落寡闻吧。下面列出来,并列出下一步学习方向。

1. Guava

谷歌开发的一个针对JAVA集合的一个工具类。今天在做项目的时候遇到,发现竟然能够在方法的参数里面再传递一个方法.

  • 下一步要研究下这个如何实现的。
  • 对比Guava与JDK自带方法的异同

2. Thrift

一个更加轻量级服务器开发框架,Facebook开发的。了解如何使用,搭建出一个Hello World工程

3. Require JS

好久不写前端,不知道前端的技术更新。今天仔细看了看前端的代码,发现看不懂。一查,发现用这个写的,一个比Jquery更加轻量级的前端框架。

  • 了解如何用这个框架发送ajax请求。
  • 搞清我最近开发的模块,前端部分的代码,js部分实现原理。

4.其他方面

jetty集群配置,以及如何用nignx分发request。

对了,关于上次mysql中varchar的疑问,设置长度的时候varchar不超过255的时候,是记录varchar长度的部分只需要一个字节。这点确定了。

继续加油努力!

Mac下github + hexo3.1.1快速搭建博客

很早就想自己搭建一个技术博客了,也不一定都写技术相关的内容,每天有什么收获都总结总结,也算是一点一滴的积累。今天终于迈出了第一步,在网上查阅了相关资料后,将我搭建博客的过程总结出来。

准备条件

  1. github帐号(申请注册过程不细讲)
  2. node.js,我下载的是”Mature and Dependable”版本,下”Latest Features”版本应该也是可以的。
  3. Git, 点击”Downloads for Mac”下载最新版本。

万事俱备,只欠hexo

在正确完成以上所有的准备步骤后就可以进入正题了,安装hexo。运行以下命令即可:

npm install -g hexo

之后再运行命令:

npm install

此处注意
需要cd到你本地指定的、放博客内容的目录(eg: ~/MyBlog)后,再进行初始化操作。本人开始没注意,一开始直接在Home目录下进行了初始化操作,结果博客内容直接都创建在了Home目录下,Home目录一下很乱。
所以,一定要cd到你制定的目录后,运行下面的命令:

hexo init
hexo generate
hexo server

运行完上面的命令就可以在http://localhost:4000里看到本地的一个小博客了。

关联GitHub

  1. 在GitHub上创建一个Repository,名字必须为your_github_nam.github.io, 其中your_github_name的意思是你注册的github的用户名,也就是在这里将your_github_name替换成自己在github上的用户名。例如,我在github上用户名为hueyzhao, 则Repository名: hueyzhao.github.io
  2. 运行命令:

    npm install hexo-deployer-git —save

  3. cd到自己指定的本地博客目录, 目录下应该有_config.yml文件,运行命令:
    vim _config.yml
  4. 在键盘上打开大写键,输入大写的G以跳到文本最后一行。
  5. 对应内容该成以下格式:
    deploy:
    type: git
    repo: https://your_repository_url
    branch: master
    其中repo的值要替换成刚才在步骤1中创建的库的链接,具体连接可以通过以下步骤找到:
  • 点击打开步骤1创建的工程
  • 在右下角找到HTTPS Clone URL并复制URL到repo
    此处注意
    在yml中,冒号后面一定要有空格!!!否则deploy时wu’fan’yi

部署到github

hexo clean
hexo generate
hexo deploy

这样,基本的技术博客就完成了!!!恭喜!!!可以访问个人的GitHub Pages地址,即将刚才创建的工程名复制到浏览器,并按回车。eg:http://hueyzhao.github.io

主题不太喜欢?
去下面的连接选自己喜欢的主题吧!
http://www.zhihu.com/question/24422335

Mysql字符存储的一些细节和疑问

来到新单位工作一周了,最近做项目。使用mysql的时候发现一个细节问题。
中文字符占用问题
之前的印象里,中文字符一般占用两个字节,今天与人讨论的时候一个同事纠正我说,mysql存储的时候一个中文字符占三个字节。
到底怎么回事?查询了以后发现结论是这样的:
GBK编码下一个中文字符占两个字节
UTF-8编码下一个中文字符占三个字节
UTF-16编码下也是占用两个字节
公司的数据库使用的是utf-8的编码,所以是占用三个字节。同事正确!

varchar长度设计问题
另外一个问题是发现公司数据库中varchar的长度都定义为2的幂的长度如(64,128)。不知道为什么。在网上找了好久,发现有的文章说是为了内存对齐,不知道有没有必要,这块没查到相应的文章。

在查询这个问题的过程中还有写收获:

  • mysql的varchar类型的长度在mysql4以前是以字节为单位的。mysql5以后varchar是以字符为单位的。这个没必要再用mysql4去验证了。可以使用以下sql验证:
    SELECT LENGTH(fieldname) FROM tablename
    SELECT CHAR_LENGTH(fieldname) FROM tablename
  • varchar的最长长度为65535个字节。在网上看到篇文章说utf8下最大能创建到(65535 - 2) / 3 = 21844 余 1,其中减2是因为varchar需要2个字节保存长度,但是实际上我使用了21842才创建成功,不知道是什么原因。
  • 还有个问题,创建的varchar长度是21842是不是代表着对于非多字节字符,如(abc)来说,使用varchar在数据库中存储的最大长度也是21842?
  • 当字符数小于等于255时,MySQL只用1个字节来记录,因为2的8次方减1只能存到255。这句话让我有点迷惑,varchar(255)时mysql只用1个字节记录?不是一个中文字符在utf8下就要用3个字节吗?意思是varchar中记录长度的部分只用一个字节吧,是这个意思?

回头再研究研究!

Mac上安装mysql时踩的坑

今天为了验证之前写的mysql中关于varchar的一点思考,再自己的mac上装了mysql。为了图省事儿下了dmg文件,很省事儿!双击、安装、成功!
然后呢?怎么设置root密码,如何连接mysql。不知道了。安装完使用
ps -ef | grep mysql
命令发现好像已经有一个实例起来了,可是咋连接?密码是啥不知道。
于是我kill了mysql的进程,找了半天得知,可以通过
mysqld_safe --skip-grant-tables &
启动mysql,这样启动的mysql不需要安全验证。
通过命令
netstat -an | grep 3306
来验证服务器已经起来了,起来的时候运行上面的命令能看到已经有一个进程再listen这个端口了。

再运行mysql命令可以登录数据库。通过网上资料得知可以通过执行命令:

use mysql;
UPDATE user SET Password = PASSWORD(‘newpass’) WHERE user = ‘root’;

来修改密码,可是会遇到ERROR 1054 (42S22): Unknown column 'password' in 'field list'这个错误。

通过运行describe user;发现确实user表里没有password这个字段,应该是”authentication_string”这个字段,运行:
update user set authentication_string=password('1111') where user='root';

解决。这个问题还是浪费我一些时间的,在此记下。

啃书的开始

2015年的计划提前完成了,2016年中技术部分的计划可以提前开始了。其实已经开始了,搭建技术博客就是第一步。
计划2016年的技术学习分三个方向

  1. 啃各种技术书。之前买过一些经典的书,一直没有完全消化。多啃啃书。
  2. 刷算法题。算法一直是我的弱项,之前面试多次倒在算法的脚下,我要征服这个敌人。当然,啃书也能帮助我完成这个目标,不过刷题也还是必须的。
  3. 做一些自己的项目。之前做的爬虫,只能算是半成品。继续!

在这三项里面,啃书算是容易点的了。因为这比较符合在学校的模式,又加上一些技术书厚又重,不适合带出去看。所以我决定,啃书先开始。
啃那一本呢,先再啃下《JAVA编程思想》吧,之前上学的时候,心里还是比较浮躁的,虽然这本书也看过一些,有些收获,但是还是很肤浅的。之前面试的时候,在JUC这块吃不少亏,就先拿这部分开刀吧。

干起来!