时间: 2020-09-03 00:08:26 人气: 2272 评论: 0
昨天的文章推送中有一篇题为全网最通俗易懂的【短链接】入门, 让我觉得颇为有趣好玩,这不正好理论知识学完了,实操代码撸起来。如果有不了解的同学可以看看入门那篇的介绍,我这里直接从实战说起,代码中有超过的中文注释,让你更容易阅读理解。话不多说,上代码!


新建一个普通的maven java 工程,如图所示

自己给项目取组名(group)和模块名(artifact)


至此项目搭建完成,此时我们为项目引入一些基本的jar包
<properties> <spring.version>5.1.8.RELEASE</spring.version> <spring.boot.version>2.1.6.RELEASE</spring.boot.version> </properties> <dependencies> <!-- spring boot依赖,表示这是一个springboot web程序. --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>${spring.boot.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> </dependency> <!-- apache 的工具包. --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.7</version> </dependency> </dependencies>
resource目录下新建文件夹db,创建文件schema.sql,内容如下
create table if not exists short_link ( id int not null primary key, url varchar(1000), create_time DATE ); http://localhost:2088/h2,可以打开h2数据库管理器登录界面,能够进入如下页面说明H2集成成功!
输入配置的数据库信息,点击登录,即可打开操作界面:
创建实体与数据库表的映射对象
@Entity @Data @NoArgsConstructor @ToString public class ShortLink { @Id @GeneratedValue private long id; private String url; private Date createTime; public ShortLink(String url, Date date){ this.url = url; this.createTime =date; } }
创建DAO数据库交互层,CrudRepository实现了对 DB 基本的增删改查方法
/** * CrudRepository 实现了对 ShortLink 基本的增删改查方法 * @author jiangpeng * @date 2019/11/2715:29 */ public interface ShortLinkRepository extends CrudRepository<ShortLink, Long> { }
短链接的ID转换生成器
/** * 短链接生成 * 10进制、62进制互转 * @author jiangpeng */ @Slf4j public class ConversionUtils { /** * 初始化 62 进制数据,索引位置代表字符的数值,比如 A代表10,z代表61等 */ private static String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; private static int scale = 62; /** * 将数字转为62进制 * * @param num Long 型数字 * @param length 转换后的字符串长度,不足则左侧补0 * @return 62进制字符串 */ public static String encode(long num, int length) { StringBuilder sb = new StringBuilder(); int remainder; // id混淆算法 long snum = num & 0xff000000; snum += (num & 0x0000ff00) << 8; snum += (num & 0x00ff0000) >> 8; snum += (num & 0x0000000f) << 4; snum += (num & 0x000000f0) >> 4; while (snum > scale - 1) { /* 对 scale 进行求余,然后将余数追加至 sb 中,由于是从末位开始追加的,因此最后需要反转(reverse)字符串 */ remainder = Long.valueOf(snum % scale).intValue(); sb.append(chars.charAt(remainder)); snum = snum / scale; } sb.append(chars.charAt(Long.valueOf(snum).intValue())); String value = sb.reverse().toString(); log.info("encode id: {}", snum); return StringUtils.leftPad(value, length, '0'); } /** * 62进制字符串转为数字 * * @param str 编码后的62进制字符串 * @return 解码后的 10 进制字符串 */ public static long decode(String str) { /* 将 0 开头的字符串进行替换 */ str = str.replace("^0*", ""); long num = 0; int index; for (int i = 0; i < str.length(); i++) { /* 查找字符的索引位置 */ index = chars.indexOf(str.charAt(i)); /* 索引位置代表字符的数值 */ num += (long) (index * (Math.pow(scale, str.length() - i - 1))); } // id混淆算法 long snum = num & 0xff000000; snum += (num & 0x00ff0000) >> 8; snum += (num & 0x0000ff00) << 8; snum += (num & 0x000000f0) >> 4; snum += (num & 0x0000000f) << 4; return snum; } /** * @param args */ public static void main(String[] args) { System.out.println("62进制:" + encode(1, 5)); System.out.println("10进制:" + decode("0000G")); } }
可以执行main方法查看运行结果,比对是否进制转后还是原来的值
引入freeMarker的依赖包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> <version>${spring.boot.version}</version> </dependency>
freeMarker默认读取模板文件路径为resource/templates目录下,所以在这个目录下创建页面文件 short_link.ftl
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"/> <title></title> </head> <body> <h2>短链接转换</h2> <form action="shortLink" method="post"> 要转换的url:<textarea rows="1" style="width: 432px; height: 43px;" name="url">${url?default('')}</textarea> <br/><br/> <input type="submit" value="提交"/> </form> <#if shortUrl?? && shortUrl != ""> <a href="${shortUrl}" target="_blank">${shortUrl}</a> </#if> </body> </html> 复制代码
/** * 生成短链接请求类 * * @author jiangpeng * @date 2019/11/2715:19 */ @Controller @RequestMapping("shortLink") public class ShortLinkController { @Autowired private ShortLinkRepository shortLinkRepository; @GetMapping public String shortLink() { return "short_link"; 技术沙龙 教程文章 热点综合