Fork me on GitHub


利用SpringMVC下载大文件

文件的上传和下载是Web系统中的一个很普通的功能,实现的方式也有很多种,如利用 java.io 下面的各种IO类自己实现,或者利用 Commons IO 包中的 FileUtilsIOUtils 类中封装好的方法直接调用。由于目前我所开发的系统采用了 SpringMVC 来作为项目的MVC实现,所以很自然的采用 SpringMVC内置的API进行文件的下载,但在实际使用过程中发现其对大文件的下载支持不太好,现把解决方案记录如下:

利用Spring和JUnit进行单元测试

在进行Java程序开发时,我们偶尔会被要求使用JUnit进行单元测试来确保我们所写的程序逻辑是正确的。一个良好的单元测试应该具备 覆盖度高,可重复执行,单一性 等特点。本文主要关注可重复执行 ,在Web开发中,大部分方法都会使数据库的记录发生变化,为了能够重复执行,必须利用数据库事务 来进行 回滚 从而达到重复执行的目的。最原始的方法是利用 java.sql.Connection 类的 commit()rollback() 方法来在每个单元测试方法中手动的进行提交或回滚,此种方式使得单元测试代码嵌入了与实际业务逻辑无关的数据库操作事务控制代码。利用SpringJUnit通过注解的方式我们可以很容易的对单元测试中的数据库操作进行事务控制。

利用Spring Security动态的改变权限

利用 Spring Security 来管理我们的web程序时,通常需要在UserDetailsService 接口中的 loadUserByUsername 方法中来初始化权限信息,但 UserDetailsService 一般用于登录验证,这也意味着用户的权限在登录过程中就会被计算出来。通常情况下由于用户的权限很少发生变化,在登录过程中计算出用户权限是合理的,但有些情况下,我们需要在中途来动态的改变用户的权限,此时我们可以利用 Spring Security 提供的API来实现。

在Spring中利用Mock对HttpServletRequest进行单元测试

编写单元测试时的注意事项

根据软件开发过程中的TDD 理论,在我们编写自己的代码时,要尽量使得该代码能够进行单元测试。为了能够使得代码可以进行单元测试,我们在给接口或方法传入参数时要尽量传入简单参数,避免传入 HttpServletRequest , ServletContext 等和web上下文相关的复杂对象。但仍有部分情况下基于代码简洁性和可维护性的考虑,我们需要传入 HttpServletRequest 对象,此时对此类方法进行JUnit单元测试时会较为困难,本文介绍一种在Spring中通过Mock来模拟HttpServletRequest 对象进行JUnit单元测试的方法。

Mediawiki添加回到顶部的方法

Mediawiki维基百科系统所采用的框架,适合于需要快速搭建知识分享的场合。采用Mediawiki生成的知识共享平台和维基百科的操作与使用类似,都支持采用Markdown语法来编辑。在有些时候,某些词条的内容很长,使得浏览器出现了滚动条,如果能仿照微博等网站添加一个回到顶部的功能,将会给我们的使用带来很大的便利,本文介绍一种实现方法:

[译] Java Volatile 关键字详解

本文翻译自 Java Volatile Keyword

Java关键字volatile用于将一个Java变量标记为 在主内中存储 ,更准确的解释为:每次读取一个volatile变量时将从电脑的主内存中读取而不是从CPU缓存中读取,每次对一个volatile变量进行写操作时,将会写入到主内存中而不是写入到CPU缓存中。

事实上,从Java5之后,volatile关键字不仅仅可以用来确保volatile变量是写入到主内存和从主内存读取数据,我会在下面的章节进行详细的介绍:

Cannot run program "mysqldump": CreateProcess error=2, The system cannot find the file specified

项目中用到了MySQL数据库的备份功能,通过调用Java程序中的Runtime来执行mysqldump命令自动的生成相关的MySQL数据库文件以供恢复之用。相关的代码如下:

Runtime runtime = Runtime.getRuntime();
String mysqlCmd = "mysqldump" + " -u" + username + " -p" + password + 
           "  -h " + databaseAddress + " " +databaseName;
Process process = runtime.exec(mysqlCmd);

但是在客户那里实际使用时,有时候会出现在cmd中MySQL命令可以正常识别但是程序不能正常执行的情况,报错信息如下:

利用Github Pages和基于Go的Hugo搭建个人博客

一直以来都想拥有一个属于自己的博客,前段时间在学习Go ,于是利用HugoGithub Pages 搭建了一个简易的个人博客,先简单记录下。