Java Web技术经验总结(四)

  1. Spring MVC中返回JSON数据的不同方法

    • Spring 3 MVC ContentNegotiatingViewResolver example,该视图解析器,可以用于将同一份模型数据展现为不同的表现形式,例如JSON、XML和RSS等;
    • 利用@ResponseBody注解修饰控制器方法,并在xxx-servlet.xml中开启spring mvc支持——<mvc: annoation-driven/>,这种机制背后的原理是MessageConverter。
  2. 最近用Mockito写单元测试的感受,单元测试有两点好处:(1)利于解耦代码,降低代码的耦合性,在写单测的过程中,你会不自觉将不属于当前业务逻辑的代码分割出去;(2)单元测试是修改代码的有力保障,使得我们在修改代码之后能及时测试本次修改是否正确。总之:单元测试并不只是为了验证你当前所写的代码是否存在问题,更为重要的是它可以很大程度的保障日后因业务变更、修复Bug或重构等引起的代码变更而导致(或新增)的风险。
  3. 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地址和端口,即可远程调试
  4. 性能测试时需要注意的
    • 日志级别调成warn级别;
    • 发现CPU占用过高时,利用jstack查看进程栈,看看什么动作比较耗CPU;具体可参考关于JVM CPU资源占用过高的问题排查。我最近遇到一个case,是RSA解密消耗了大量的CPU时间,那么我们在开发时,要注意尽量减少RSA解密的次数。
  5. 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

  6. 作为一个对外开放的接口,或者供其他模块调用的接口,必须做到以下几件事:
    • 入参检查
    • 异常处理
    • 统一的结果生成
    • 配套的单元测试和接口测试用例,防止代码修改引入新的bug
  7. 在ArrayList<Object>中去掉重复的对象(按照自定义的重复定义规则),如:原创]JAVA技巧:去除ArrayList<Object>里面的重复记录
  8. 在通过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));
    }
  9. 关于Spring MVC中<mvc:annotation-driven>@ResponseBodyHttpMessagerConverter等的实现原理,SpringMVC关于json、xml自动转换的原理研究[附带源码分析]这篇文章,以及对应的代码分析,基本上都讲清楚了。PS:MappingJackson2HttpMessageConverter和MappingJacksonHttpMessageConverter的区别在于,Spring 4版本都用前一个。
  10. 常用Git作为代码管理工具,除了熟练使用IDEA中提供的图形化Git管理功能,也需要了解这些GUI背后对应的指令,那么久需要看如下资料:
  11. 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

时间: 2024-12-28 13:22:45

Java Web技术经验总结(四)的相关文章

Java Web技术经验总结(二)

该系列的第一篇在此:Java Web技术经验总结一,主要包含我在日常工作中的经验和心得体会(如有不足之处欢迎指出). Maven的使用经验 依赖的scope有test.provided.compile等.test:一般是单元测试场景使用,在编译环境加入classpath,但打包时不会加入,如junit等:provided:表示容器或者JDK已经提供该依赖,打包时不需要打包入war:compile:默认范围,在工程环境的classpath(编译环境)和打包(如果是WAR包,会包含在WAR包中)时候

Java Web技术经验总结(三)

在Spring项目中,如果需要配置spring xml文件,要注意,将顶部的schema信息中的版本信息去掉,这样xml配置文件就不会跟具体的spring版本耦合:而且还可以避免一些诡异的问题,例如下面这种异常 org.xml.sax.SAXParseException :schema_reference.4: 无法读取方案文档 'http://www.springframework.org/schema/beans/spring-beans-3.0.xsd', 原因为 1) 无法找到文档; 2

Java Web技术经验总结(一)

接口的权限认证,使用拦截器(HandlerInterceptorAdapter),参考:第五章 处理器拦截器详解--跟着开涛学SpringMVC.注意:推荐能使用servlet规范中的过滤器Filter实现的功能就用Filter实现,因为HandlerInteceptor只有在Spring Web MVC环境下才能使用,因此Filter是最通用的.最先应该使用的 "@Autowired"的含义是:ListableBeanFactory接口定义的<T> Map<Stri

Java Web技术内幕:深入理解Session与Cookie

其实这个问题回答起来既简单又复杂,简单是因为它们本身只是 HTTP 协议中的一个配置项,在 Servlet 规范中也只是对应到一个类而已:说它复杂原因在于当我们的系统大到需要用到很多 http://www.aliyun.com/zixun/aggregation/12583.html">Cookie 的时候,我们不得不考虑 HTTP 协议对 Cookie 数量和大小的限制,那么如何才能解决这个瓶颈呢? Session 也会有同样的问题,当我们的一个应用系统有几百台服务器的时候如何解决 Se

java web技术需要从服务器端数据库中下载数据到本地

问题描述 由于是web技术所以代码也要放在服务器上.客户端运行一个网页的时候,后台自动运行从服务器端的数据库中把数据写到本地的txt文本文件中.细节要求是按照日期判断同一天的数据是一个txt.隔天自动生成另一个txt..格式要求数据能自动换行求完成代码..加注解....万分感谢 解决方案 解决方案二:我晕...没人知道啊...高手哪去啦....解决方案三:我晕.没人知道啊..高手哪去了解决方案四:我晕.没人知道啊..高手哪去了

java web 技术-求助!关于模拟登陆利用接收的cookie判断登录是否成功,遇到了问题,,求大神们相助!在下多谢!

问题描述 求助!关于模拟登陆利用接收的cookie判断登录是否成功,遇到了问题,,求大神们相助!在下多谢! 在下学生最近在做一个用java开发模拟登陆校内网的项目,可是学校使用struts2做的,url的尾缀是.action,登陆前和登陆后的url一致,无法用html来判断,,于是就想用cookie来判断登陆是否成功,可是面临一个问题就是请求标头的Cookie是JSESSIONID=3CDAB1BA4520BD1F53E62F9D5BCCCC49之类的,发送的jsessionid和接收的jses

java web 技术-web应用实现实时视频通讯的,java为后台

问题描述 web应用实现实时视频通讯的,java为后台 基于web服务的实时视频通讯的大体架构模型(视频流的技术),java为后台, 赐教!! 解决方案 参考webrtc的模型 http://www.cnblogs.com/zhaozhan/archive/2012/03/31/webrtc.html

用Java Web技术控制电子设备,比如数据采集卡,能实现吗?

问题描述 小弟想做一个网站,用这个网站来控制一套数据采集装置,在网站上发送指令,数据采集装置就把数据写到数据库里面,这样的想法可能实现吗,该用什么技术呢?? 解决方案 可以,但是得需要硬件设备的JAVA版接口,一般硬件接口,输入输出数据都固定好了.提取相应数据即可,也可联系硬件开发商,开发个人需求的接口.

新书出版:Java Web开发技术大全——JSP+Servlet+Struts 2+Hibernate+Sp

本文为原创,如需转载,请注明作者和出处,谢谢! 作者:李宁 图书详细信息: ISBN:9787302195757 定价:79.8元 印次:1-1 装帧:平装 印刷日期:2009-4-23   图书简介: SSH是目前最流行的Java Web开发技术.本书通过对SSH中的各种技术循序渐进地讲解,使读者尽快掌握开发基于SSH的Web程序的方法.本书内 容包括Web客户端技术.JSP/Servlet技术.Struts 2(拦截器.类型转换.输入校验.上传和下载文件.Struts 2的各种标签.对 AJ