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:将光标放在某个类上,通过该快捷键可以构造出该类所属的继承体系,如下图所示:
        1240
        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上下文使用。

1240
mvc-context-hierarchy.png

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

1240
Spring MVC详细运行流程图.png

目录
相关文章
|
17天前
|
Java API
Java技术体系
Java技术体系包括运行于Java虚拟机上的各种语言及其相关程序,传统上由Java程序设计语言、Java虚拟机、Class文件格式、Java API类库以及第三方类库组成,可进一步细分为Java Card、Java ME、Java SE和Java EE四个平台。
32 3
Java技术体系
|
1天前
|
SQL 缓存 搜索推荐
后端技术在现代Web开发中的应用与挑战
本文将深入探讨后端技术在现代Web开发中的重要性,涵盖从基础架构到性能优化的多个方面。通过分析当前主流后端技术的优缺点,并提供一些实用的解决方案和建议,帮助开发者更好地应对日常开发中的挑战。
11 1
|
7天前
|
安全 JavaScript Java
后端技术在现代Web开发中的实践与挑战
本文旨在探讨后端技术在现代Web开发中的关键作用,分析其在数据处理、业务逻辑实现和系统安全等方面的重要性。通过阐述常见的后端技术和框架,如Node.js、Django和Spring Boot,展示它们在实际项目中的应用。同时,文章将讨论后端开发所面临的主要挑战,包括性能优化、扩展性和维护性问题,以及如何应对这些挑战。最终,通过对实际案例的分析,总结出一套行之有效的后端开发最佳实践,为开发者提供参考。
29 5
|
7天前
|
存储 负载均衡 Java
Jetty技术深度解析及其在Java中的实战应用
【9月更文挑战第3天】Jetty,作为一款开源的、轻量级、高性能的Java Web服务器和Servlet容器,自1995年问世以来,凭借其卓越的性能、灵活的配置和丰富的扩展功能,在Java Web应用开发中占据了举足轻重的地位。本文将详细介绍Jetty的背景、核心功能点以及在Java中的实战应用,帮助开发者更好地理解和利用Jetty构建高效、可靠的Web服务。
21 2
|
7天前
|
人工智能 关系型数据库 数据安全/隐私保护
后端技术在现代Web开发中的应用与挑战
本文将深入探讨后端技术在现代Web开发中的重要性,通过分析其在数据处理、业务逻辑实现和安全性保障方面的应用,揭示后端技术的核心价值。同时,本文还将讨论当前后端开发面临的主要挑战,如高并发处理、数据安全、微服务架构的复杂性等,并给出相应的解决方案。无论是后端开发者还是对后端技术感兴趣的读者,都可以通过这篇文章获得启发和指导。
|
11天前
|
Java 程序员 编译器
Java的反射技术reflect
Java的反射技术允许程序在运行时动态加载和操作类,基于字节码文件构建中间语言代码,进而生成机器码在JVM上执行,实现了“一次编译,到处运行”。此技术虽需更多运行时间,但广泛应用于Spring框架的持续集成、动态配置及三大特性(IOC、DI、AOP)中,支持企业级应用的迭代升级和灵活配置管理,适用于集群部署与数据同步场景。
|
11天前
|
算法 Oracle Java
Java字符串拼接技术演进及阿里巴巴的贡献
本文主要讲述了Java字符串拼接技术的演进历程,以及阿里巴巴贡献的最新实现 PR 20273。
|
16天前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
16天前
|
算法 Oracle Java
Java字符串拼接技术演进及阿里巴巴的贡献
本文主要讲述了Java字符串拼接技术的演进历程,以及阿里巴巴贡献的最新实现 PR 20273。
|
18天前
|
前端开发 安全 Java
技术进阶:使用Spring MVC构建适应未来的响应式Web应用
【9月更文挑战第2天】随着移动设备的普及,响应式设计至关重要。Spring MVC作为强大的Java Web框架,助力开发者创建适应多屏的应用。本文推荐使用Thymeleaf整合视图,通过简洁的HTML代码提高前端灵活性;采用`@ResponseBody`与`Callable`实现异步处理,优化应用响应速度;运用`@ControllerAdvice`统一异常管理,保持代码整洁;借助Jackson简化JSON处理;利用Spring Security增强安全性;并强调测试的重要性。遵循这些实践,将大幅提升开发效率和应用质量。
44 7