_little-star_

学习的博客

0%

项目实战

1、Json的几个注解

pom.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>

@JsonFormat与@Date TimeFormat注解的使用

@JsonFormat

作用:从数据库获取时间传到前端进行展示的时候,我们有时候可能无法得到一个满意的时间格式的时间日期,在数据库中显示的是正确的时间格式,获取出来却变成了很丑的时间戳。@JsonFormat注解很好的解决了这个问题。

使用:

1
2
3
//设置时区为上海时区,时间格式自己据需求定。
@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
private Date testTime;

这里解释一下:@JsonFormat(pattern=”yyyy-MM-dd”,timezone = “GMT+8”)

  • pattern:是你需要转换的时间日期的格式
  • timezone:是时间设置为东八区,避免时间在转换中有误差

提示:@JsonFormat注解可以在属性的上方,同样可以在属性对应的get方法上,两种方式没有区别

完成上面两步之后,我们用对应的实体类来接收数据库查询出来的结果时就完成了时间格式的转换,再返回给前端时就是一个符合我们设置的时间格式了

@Date TimeFormat

pom.xml:

1
2
3
4
5
6
<!-- joda-time -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.3</version>
</dependency>

作用:我们在使用WEB服务的时,可能会需要用到,传入时间给后台,比如注册新用户需要填入出生日期等,这个时候前台传递给后台的时间格式同样是不一致的,@DataTimeFormat便很好的解决了这个问题。

使用:在controller层我们使用spring mvc 表单自动封装映射对象时,我们在对应的接收前台数据的对象的属性上加@DateTimeFormat

1
2
3
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date symstarttime;

我这里就只贴这两个属性了,这里我两个注解都同时使用了,因为我既需要取数据到前台,也需要前台数据传到后台,都需要进行时间格式的转换,可以同时使用。

总结:

  • 注解@JsonFormat主要是后台到前台的时间格式的转换
  • 注解@DataFormAT主要是前后到后台的时间格式的转换

资料来源:@JsonFormat与@DateTimeFormat注解的使用

@JsonProperty使用详解

作用:@JsonProperty注解主要用于实体类的属性上,作用可以简单的理解为在反序列化的时候给属性重命名(多一个名字来识别)

使用:

1
2
@JsonProperty(value = "fake_name", required = true)
private String fakeName;

注意:

  • 使用JSON.toJsonString的时候实体类需要有getter方法,否则会输出{}
  • @requestBody注解需要在post请求下才能正常使用.

资料来源:@JsonProperty使用详解

@JsonInclude

作用:

  • JsonJsonInclude.Include.ALWAYS 这个是默认策略,任何情况下都序列化该字段,和不写这个注解是一样的效果。
  • JsonJsonInclude.Include.NON_NULL这个最常用,即如果加该注解的字段为null,那么就不序列化这个字段了。
  • JsonJsonInclude.Include.NON_ABSENT这个包含NON_NULL,即为null的时候不序列化。

使用:

1
2
@JsonInclude(JsonInclude.Include.NON_NULL)
private String username;

资料来源:jackSon中@JsonInclude注解详解

@JsonIgnore注解

作用:在json序列化时将pojo中的一些属性忽略掉,标记在属性或者方法上,返回的json数据即不包含该属性。

使用:

1
2
@JsonIgnore
private String password;// 密码

资料来源:@JsonIgnore注解

2、ip2region——Java 根据 IP 地址来获取位置

pom.xml:

1
2
3
4
5
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>1.7.2</version>
</dependency>

然后下载 IP库 ip2region.db: https://gitee.com/lionsoul/ip2region/tree/master/data

下载解压后只需要 data 目录下的 ip2region.db 就可以了 .

把 ip2region.db 复制到 maven 项目的 resources 目录下.

然后具体实现,可以把以下代码封装成方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Ip2RegionTest {
public static void main(String[] args){
//ip
String ip="220.248.12.158";

// 判断是否为IP地址 (可用)
//boolean isIpAddress = Util.isIpAddress(ip);

//ip和long互转 (可用)
//long ipLong = Util.ip2long(ip);
//String strIp = Util.long2ip(ipLong);

//根据ip进行位置信息搜索
DbConfig config = new DbConfig();

//获取ip库的位置(放在src下)(直接通过测试类获取文件Ip2RegionTest为测试类)
String dbfile = Ip2RegionTest.class.getResource("/ip2region.db").getPath();

DbSearcher searcher = new DbSearcher(config, dbfile);

//采用Btree搜索
DataBlock block = searcher.btreeSearch(ip);

//打印位置信息(格式:国家|大区|省份|城市|运营商)
System.out.println(block.getRegion());
}
}

还有一种实现方法如下:

此内容参考了 ip2region源码的 : org.lionsoul.ip2region.test.TestSearcher.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package com.test;

import java.io.File;
import java.lang.reflect.Method;

import org.lionsoul.ip2region.DataBlock;
import org.lionsoul.ip2region.DbConfig;
import org.lionsoul.ip2region.DbSearcher;
import org.lionsoul.ip2region.Util;

public class IPUtil {

public static String getCityInfo(String ip){

//db
String dbPath = IPUtil.class.getResource("/ip2region.db").getPath();

File file = new File(dbPath);
if ( file.exists() == false ) {
System.out.println("Error: Invalid ip2region.db file");
}

//查询算法
int algorithm = DbSearcher.BTREE_ALGORITHM; //B-tree
//DbSearcher.BINARY_ALGORITHM //Binary
//DbSearcher.MEMORY_ALGORITYM //Memory
try {
DbConfig config = new DbConfig();
DbSearcher searcher = new DbSearcher(config, dbPath);

//define the method
Method method = null;
switch ( algorithm )
{
case DbSearcher.BTREE_ALGORITHM:
method = searcher.getClass().getMethod("btreeSearch", String.class);
break;
case DbSearcher.BINARY_ALGORITHM:
method = searcher.getClass().getMethod("binarySearch", String.class);
break;
case DbSearcher.MEMORY_ALGORITYM:
method = searcher.getClass().getMethod("memorySearch", String.class);
break;
}

DataBlock dataBlock = null;
if ( Util.isIpAddress(ip) == false ) {
System.out.println("Error: Invalid ip address");
}

dataBlock = (DataBlock) method.invoke(searcher, ip);

return dataBlock.getRegion();

} catch (Exception e) {
e.printStackTrace();
}

return null;
}


public static void main(String[] args) throws Exception{
System.err.println(getCityInfo("220.248.12.158"));
}
}

资料来源:Java 根据 IP 地址来获取 位置 – 使用 ip2region

Joda-Time——Java 日期时间处理库

pom.xml

1
2
3
4
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>

具体API查看:https://www.oschina.net/p/joda-time?hmsr=aladdin1e1