J2EE学习总结

简介: J2EE学习总结

1、Java数据结构Pair、MutablePair、ImmutablePair详解

Java组件类Pair、MutablePair、ImmutablePair详解

2、slf4j详解

slf4j使用教程以及常见问题解决(最新稳定版)

slf4j的使用

Slf4j与Log4j的区别


3、@JsonFormat、@JSONField、@DateTimeFormat区别

1. @JsonFormat和@JSONField是处理请求参数为json格式的时间

例如前端传送时间为“2020-08-12 23:28:00”,使用@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”, timezone = “GMT+8”),这两者前面都带JSON,接收请求和返回数据格式为json时,注解生效


2. @DateTimeFormat也是处理时间格式,但它不支持反序列化,也就是不能转化前端数据格式为json。它能接收表单形式的时间格式,

3. 总结

前端读取数据库日期字段时使用 @JsonFormat和@JSONField 可以将时间戳转为格式化的日期数据。

前端使用JSON提交时用@JsonFormat和@JSONField

前端使用Form提交时用@DateTimeForma


4、Java中时间与时间戳的转换

  1. 时间转换成时间戳
    方式一:
/**
  * 时间转换成时间戳,参数和返回值都是字符串
  * @param  s
  * @return res
  * @throws ParseException
 */
public static String dateToStamp(String s) throws ParseException {
    String res;
    //设置时间模版
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date = simpleDateFormat.parse(s);
    long ts = date.getTime();
    res = String.valueOf(ts);
    return res;
}


在主函数中设置参数与运行结果

 String date=dateToStamp("2021-09-07 09:09:39");
 System.out.println(date);
//结果:1630976979000


方式二:

/**
  * 日期转换成时间戳,参数可以是日期,返回值是字符串
 */
public static void Date2TimeStamp() {
   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   String format = sdf.format(new Date());
   try {
       String valueOf = String.valueOf(sdf.parse(format).getTime() / 1000);
       System.err.println(valueOf);
   } catch (ParseException e) {
       e.printStackTrace();
   }
}
  1. 时间戳转换成时间
    方式一:
/**
  * 将时间戳转换为时间,参数和返回值都是字符串
  * @param s
  * @return res
 */
public static String stampToDate(String s){
    String res;
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    long lt = new Long(s);
    Date date = new Date(lt);
    res = simpleDateFormat.format(date);
    return res;
    }


在主函数中设置参数与运行结果

 String s="1630339200000";
 String date=stampToDate(s);
 System.out.println(date);
 //2021-08-31 00:00:00


方式二:

/**
  * 时间戳先转换成日期字符串再转换成日期类型,参数是字符串,返回值是字符串也可是日期
 */
public static void TimeStamp2Date() {
   String timestampString = "1631008034";
   String formats = "yyyy-MM-dd HH:mm:ss";
   Long timestamp = Long.parseLong(timestampString) * 1000;
   //日期格式字符串
   String dateStr = new SimpleDateFormat(formats, Locale.CHINA).format(new Date(timestamp));
   System.err.println(dateStr);
   Date date = null;
   SimpleDateFormat formater = new SimpleDateFormat();
   formater.applyPattern("yyyy-MM-dd HH:mm:ss");
   try {
       date = formater.parse(dateStr);
       System.err.println(date);
   } catch (ParseException e) {
       e.printStackTrace();
   }
}


5、@SpringBootTest注解 --基于SpringBoot2.5.7版本

6、Java中自定义注解的用法

@Target、@Retention、@Documented、@Inherited注解都是作用在注解上的注解,java把他们亲切的叫做元注解,这四个注解正是Java的四大元注解。


1.@Target :用于描述注解的使用范围

2.@Retention:用于描述注解的生命周期【源代码阶段、CLASS文件中有效、运行时有效】

3.@Documented:表示该注解是否可以生成到 API文档中。注意:@Documented是一个标记注解,没有成员。

4.@Inherited:使用@Inherited定义的注解具备继承性 假设一个注解在定义时,使用了@Inherited,然后该注解在一个类上使用,如果这个类有子类,那么通过反射我们可以从类的子类上获取到同样的注解。


@Target注解

@Target注解算是比较常见的注解了,@Target注解用于描述注解的使用范围,优雅的说就是使用了@Target去定义一个注解,那么可以决定定义好的注解能用在什么地方。

为了显得身临其境的效果,我们可以先进@Autowired注解看看

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
    boolean required() default true;
}

我想各位都应该很清楚@Autowired注解的用法了,这个时候我们再来分析分析@Target注解的用法。


内部值:ElementType[] value()数组, value值类型 ElementType枚举类型,元注解中的枚举值决定了,一个注解可以标记的范围


TYPE : 类型上面 用于描述类、接口(包括注解类型) 或enum声明

FIELD: 用于描述字段

METHOD :方法

PARAMETER: 参数 【参数名】

CONSTRUCTOR : 构造方法

LOCAL_VARIABLE: 局部变量

ANNOTATION_TYPE : 可以打在注解上面

PACKAGE :可以打在包上面

TYPE_PARAMETER: 参数类型【形式参数类型】

TYPE_USE : 任何位置都可以


这时应该更能清晰的看出,@Autowired注解用于描述注解的使用范围了~

@Retention


@Retention也是开发中经常用到注解

public enum RetentionPolicy {
    SOURCE,
    CLASS,
    RUNTIME
}


@Retention:用于描述一个注解存在的生命周期,主要包括源码,字节码文件,运行时。


这3个生命周期分别对应于:Java源文件(.java文件) —> .class文件 —> 内存中的字节码。

1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;

2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃【默认】

3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;


@Document


@Document注解较少用,简单了解即可。

该注解主要判断是否可以生成到 API文档中 ==》即生成API文档的时 检验

@Inherited

这是一个稍微复杂的注解类型. 它指明被注解的类会自动继承. 更具体地说,如果定义注解时使用了 @Inherited 标记,然后用定义的注解来标注另一个父类, 父类又有一个子类(subclass),则父类的所有属性将被继承到它的子类中.


@Inherited表示一个【注解】能够被继承,不是说注解与注解之间能否相互继承,而是说:一个类A被注解了,那么另外一个类B,继承了A类B类能够继承到A类中,的注解 (即被@Inherited注解过的注解)

7、fastjson使用详解

参考

8、java 里面添加out:极客用法

参考

9、java 中 BigDecimal 详解

参考

设置保留两位小数,并向下取整

BigDecimal scale = new BigDecimal(totalScore).setScale(2, BigDecimal.ROUND_DOWN);
totalScore = scale.doubleValue();


10、Nginx 文件上传 413 错误解决方法

我们使用ngnix做web server的时候,nginx对上传文件的大小有限制,默认是1M。

当超过大小的时候会报413(too large)错误。这个时候我们找到nginx.conf配置文件下的location /{},在里面增加client_max_body_size 20M;

注意:20M设置为你需要的大小即可,但是如果客户端没有对上传文件的大小做限制,在上传文件的时候大于你设置的值,还是会报413错误导致你的客户端服务停掉,因此如果你不希望发生这样的事,将值改为0,即改为:

client_max_body_size 0; 即可。设置为0将禁用客户端请求主体大小的检查。

以下内容为官网原文:

更多配置见官网


句法: client_max_body_size size;
默认: client_max_body_size 1m;
内容: http,server,location

设置客户端请求正文的最大允许大小,在“ Content-Length”请求标头字段中指定。如果请求中的大小超过配置的值,则会向客户端返回413(请求实体太大)错误。请注意,浏览器无法正确显示此错误。设置size为0将禁用客户端请求主体大小的检查。


11、基础工具类Joiner的使用

Guava之Joiner笔记

Guava 中有一些基础的工具类,如下所列:


Joiner 类:根据给定的分隔符把字符串连接到一起。MapJoiner 执行相同的操作,但是针对 Map 的 key 和 value。


Splitter 类:与 Joiner 操作相反的类,是根据给定的分隔符,把一个字符串分隔成若个子字符串。


CharMatcher,Strings 类:对字符串通用的操作,例如移除字符串的某一部分,字符串匹配等等操作。


其他类:针对Object操作的方法,例如 toString 和 hashCode 方法等。


Joiner

这是在我们代码中出现频率比较高的一个功能。经常需要将几个字符串,或者字符串数组、集合之类的东西,拼接成一个以指定符号分隔各个元素的字符串,比如要将一个用List保存的集合拼起来作为SQL语句的条件,在知道Joiner之前我们会这样做。


// 拼接: AND goods IN(123,1234,345)
productSql.append(" AND goods IN (");
for (Long goods : spuIdList) {
  productSql.append(goods + ",");
}
productSql.delete(productSql.length() - 1, productSql.length()).append(")");
```java
上面的代码注意的一点就是我们要移除字符串最后的一个分隔符。虽然不难,但是很无聊,下面借助 Joiner 类,代码瞬间变得优雅起来。

productSql.append(" AND goods IN (“).append(Joiner.on(”,“).skipNulls().join(spuIdList)).append(”)");

**补充:**
*   如果传入的对象中包含空指针,会直接抛出空指针异常。Joiner 提供了两个方法,让我们能够优雅的处理待拼接集合中的空指针。
*   如果我们希望忽略空指针,那么可以调用 `skipNulls`方法,得到一个会跳过空指针的 Joiner 实例。如果希望将空指针变为某个指定的值,那么可以调用 `useForNull` 方法,指定用来替换空指针的字符串。
    ```
    Joiner.on(",").skipNulls().join(spuIdList);
    Joiner.on(",").useForNull("#").join(spuIdList);
    ```
*   Joiner 不仅可以返回string ,还有方法能够处理StringBuilder类:
[](https://blog.csdn.net/LXYDSF/article/details/128011305?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167056121516800182186127%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167056121516800182186127&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-128011305-null-null.142^v68^control,201^v4^add_ask,213^v2^t3_esquery_v3&utm_term=%20Joiner.on&spm=1018.2226.3001.4187)二、Joiner.MapJoiner
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
MapJoiner 是 Joiner 的内部静态类,用于帮助将 Map 对象拼接成字符串。


@Test
public void testJoiner(){
    Map<String, String> map = new HashMap<>();
    map.put("红楼梦", "刘姥姥");
    map.put("三国演义", "关羽");
    map.put("水浒传", "李逵");
    map.put("西游记", "猪八戒");
    String str = Joiner.on(" ").withKeyValueSeparator(":").join(map);
    System.out.println(str);//水浒传:李逵 红楼梦:刘姥姥 三国演义:关羽 西游记:猪八戒
}
[](https://blog.csdn.net/LXYDSF/article/details/128011305?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167056121516800182186127%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167056121516800182186127&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-128011305-null-null.142^v68^control,201^v4^add_ask,213^v2^t3_esquery_v3&utm_term=%20Joiner.on&spm=1018.2226.3001.4187)三、常用API总结:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#### [](https://blog.csdn.net/LXYDSF/article/details/128011305?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167056121516800182186127%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=167056121516800182186127&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-128011305-null-null.142^v68^control,201^v4^add_ask,213^v2^t3_esquery_v3&utm_term=%20Joiner.on&spm=1018.2226.3001.4187)appendTo
```java
// 可追加,实现了Appendable接口的都可以使用
A appendTo(A appendable, Iterable<?> parts)
// 向appendable参数后追加first、second…所有参数
A appendTo(A appendable, @Nullable Object first, @Nullable Object second, Object… rest)

比较常见的实现类: BufferedWriter, CharArrayWriter, CharBuffer, FileWriter, FilterWriter, LogStream, OutputStreamWriter, PipedWriter, PrintStream, PrintWriter, StringBuffer, StringBuilder, StringWriter, Writer

用法

String[] arr = {"a","b","c"};
StringBuilder ab = new StringBuilder("start: ");
StringBuilder ac = Joiner.on("").appendTo(ab,arr);
System.out.println(ab); // start: abc
System.out.println(ac); // start: abc

Join+on

// 将可迭代的参数中所有子元素连接。
String join(Iterable<?> parts)
// 为static对象设置分隔符
static Joiner on(char separator)


Joiner实例不可变,即用final修饰,一旦初始化不可变,所以分步调用joiner的静态函数是不起作用的。如:


@Test
public void testJoiner(){
    Joiner joiner = Joiner.on(',');
    joiner.skipNulls(); // 不起作用!
    String str = joiner.join("wrong", null, "wrong");
    System.out.println(str);
}
// 会抛出 NullPointerException


这样使得joiner线程安全,并且返回的都是final static常量

其他

Joiner skipNulls()
Joiner useForNull(String nullText)
Joiner.MapJoiner withKeyValueSeparator(String keyValueSeparator)


最后

大家有兴趣的可以去了解下Guava中其他类的用法,源码写的也很棒!

相关文章
|
9月前
|
XML 消息中间件 开发框架
J2EE的13个规范
J2EE的13个规范
|
9月前
|
XML 开发框架 Java
J2EE——13种规范总结
J2EE——13种规范总结
197 0
|
10月前
|
XML 开发框架 负载均衡
关于J2ee
关于J2ee
|
11月前
|
搜索推荐 算法 Java
|
11月前
|
设计模式 开发框架 监控
|
10月前
|
开发框架
J2EE练习_chapter14网络编程
J2EE练习_chapter14网络编程
|
XML 开发框架 安全
J2EE基础-开发环境搭建
J2EE基础-开发环境搭建
J2EE基础-开发环境搭建
|
存储 Kubernetes 安全
Jakarta EE 开发者必备的 2 个工具
我喜欢新玩具。我真的很喜欢那些经过验证的技术栈里的新玩具。我非常喜欢那些能让我玩到经过产品验证的新技术的新玩具。而工具玩具是其中最好的。
350 0
Jakarta EE 开发者必备的 2 个工具
|
算法 Java 应用服务中间件
【Java EE】从零开始写项目【总结】
从零开发项目概述 最近这一直在复习数据结构和算法,也就是前面发出去的排序算法八大基础排序总结,Java实现单向链表,栈和队列就是这么简单,十道简单算法题等等... 被虐得不要不要的,即使是非常简单有时候绕半天,想不明白。
2274 0
|
Java 数据库连接 API