Java Web技术经验总结(四)

  1. Spring MVC中返回JSON数据的不同方法
  • Spring 3 MVC ContentNegotiatingViewResolver example,该视图解析器,可以用于将同一份模型数据展现为不同的表现形式,例如JSON、XML和RSS等;
  • 利用@ResponseBody注解修饰控制器方法,并在xxx-servlet.xml中开启spring mvc支持——<mvc: annoation-driven/>,这种机制背后的原理是MessageConverter。
  1. 最近用Mockito写单元测试的感受,单元测试有两点好处:(1)利于解耦代码,降低代码的耦合性,在写单测的过程中,你会不自觉将不属于当前业务逻辑的代码分割出去;(2)单元测试是修改代码的有力保障,使得我们在修改代码之后能及时测试本次修改是否正确。总之:单元测试并不只是为了验证你当前所写的代码是否存在问题,更为重要的是它可以很大程度的保障日后因业务变更、修复Bug或重构等引起的代码变更而导致(或新增)的风险。

  2. IDEA的使用经验

  • 必备插件:Maven Helper,用于分析jar包冲突
  • 常用快捷键
    • Idea的左下角,灰色方块,光标cover上去以后可快速唤出各个View
    • Comman + Y,删除一行
    • alt + Enter:当光标在类名时,使用该快捷键可以创建测试用例、创建子类和使得该类局部化;当光标在局部变量上时,使用该快捷键可以添加Javadoc、转变成ThreadLocal变量、转变成Atomic变量、改变变量的开放级别;当光标在函数上时,也有对应的功能,可自己去探索;
    • alt + Command + u:将光标放在某个类上,通过该快捷键可以构造出该类所属的继承体系,如下图所示:


      ViewResolver的继承体系
  • Refactor功能,具体可参考《重构》一书;我之前也有一篇读书笔记:《重构》阅读笔记-代码的坏味道
  • Git版本管理
    • 查看commit记录
    • 查看每个commit的修改记录
    • 查看指定文件的修改历史
    • 比较不同版本直接的diff
    • 提交代码(提交之前可做静态扫描、优化import、查看todo等)
    • 分支合并,区分rebase和merge的区别
  • 远程调试功能 :在Edit Configuration中可新建Remote,指定远程服务器的IP地址和端口,即可远程调试
  1. 性能测试时需要注意的
  • 日志级别调成warn级别;
  • 发现CPU占用过高时,利用jstack查看进程栈,看看什么动作比较耗CPU;具体可参考关于JVM CPU资源占用过高的问题排查。我最近遇到一个case,是RSA解密消耗了大量的CPU时间,那么我们在开发时,要注意尽量减少RSA解密的次数。
  1. MyBatis报错:“Error querying database. Cause: java.lang.UnsupportedOperationException”,错误代码如下:
<select id="getInPaging" resultType="java.util.List">
   <![CDATA[
      SELECT
         number
      FROM
         example_table
      WHERE
         id=#{id}
   ]]>
</select>

在这里,resultType指的是查询到的每条记录的类型,因此应该用java.lang.String

  1. 作为一个对外开放的接口,或者供其他模块调用的接口,必须做到以下几件事:
  • 入参检查
  • 异常处理
  • 统一的结果生成
  • 配套的单元测试和接口测试用例,防止代码修改引入新的bug
  1. 在ArrayList<Object>中去掉重复的对象(按照自定义的重复定义规则),如:[原创]JAVA技巧:去除ArrayList<Object>里面的重复记录](http://www.cnblogs.com/jizha/p/java_arraylist_duplicate.html)

  2. 在通过URL参数传入时间时,后台可考虑使用InitBinder自动将时间字符串转换成Date对象,并绑定到Controller的入参,例子代码如下:

//the parameter was converted in initBinder
 @RequestMapping("/date")
 public String date(Date date){
   System.out.println(date); return "hello";
 }

 //At the time of initialization,convert the type "String" to type "date" @InitBinder
public void initBinder(ServletRequestDataBinder binder){
 binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
 }
  1. 关于Spring MVC中<mvc:annotation-driven>@ResponseBodyHttpMessagerConverter等的实现原理,SpringMVC关于json、xml自动转换的原理研究[附带源码分析]这篇文章,以及对应的代码分析,基本上都讲清楚了。PS:MappingJackson2HttpMessageConverter和MappingJacksonHttpMessageConverter的区别在于,Spring 4版本都用前一个。

  2. 常用Git作为代码管理工具,除了熟练使用IDEA中提供的图形化Git管理功能,也需要了解这些GUI背后对应的指令,那么久需要看如下资料:

  1. Spring MVC基础知识总结:史上最全的SpringMVC学习笔记。在第十七节,作者只是提出了要建两个容器配置文件(applicationContext.xml和xxx-servlet.xml),并通过exclude和include配置防止bean的重复加载,不过没有深入讲解其背后的原因。
    Spring 容器(Spring 的上下文)这篇文章给出了详细解释:在Spring MVC项目中,这两个父子容器的角色不同:(1)父容器中保存数据源、服务层、DAO层、事务的Bean;(2)子容器中保存Mvc相关的Action的Bean。对应到例子中,applicationContext.xml定义父容器,xxx-servlet.xml定义子容器。
    引用官方文档中的一张图片,可以清晰地看出dispatcherservlet上下文和Root应用上下文之间的关系:Root应用上下文用于提供service、数据库等bean,可供多个dispatcherservlet上下文使用。
mvc-context-hierarchy.png

最后,再重温下spring mvc的处理流程,在进行Java Web开发的时候,也时刻不要忘记对HttpRequest的处理流程。


Spring MVC详细运行流程图.png

本号专注于后端技术、JVM问题排查和优化、Java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。


javaadu
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容