最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot SpEL語法掃盲與查詢手冊的實(shí)現(xiàn)

 更新時(shí)間:2020年05月21日 14:36:57   作者:小灰灰Blog  
這篇文章主要介紹了SpringBoot SpEL語法掃盲與查詢手冊的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Spring 表達(dá)式語言簡稱為 SpEL,一種類似 Ognl 的對象圖導(dǎo)航語言(對于 ognl 不熟悉的同學(xué)可以參考一下: Ognl 系列博文)

SeEL 為 Spring 提供了豐富的想象空間,除了一些基本的表達(dá)式操作之外,還支持

  • 訪問 bean 對象
  • 調(diào)用方法,訪問(修改)類(對象)屬性
  • 計(jì)算表達(dá)式
  • 正則匹配
  • ...

 I. 語法百科

以下內(nèi)容均來自官方文檔: https://docs.spring.io/spring-framework/docs/5.2.1.RELEASE/spring-framework-reference/core.html#expressions

1. 字面表達(dá)式

Spel 支持strings, numeric values (int, real, hex), boolean, and null等基本類型,實(shí)例如下

ExpressionParser parser = new SpelExpressionParser();

// evals to "Hello World"
String helloWorld = (String) parser.parseExpression("'Hello World'").getValue();

// double 類型
double avogadrosNumber = (Double) parser.parseExpression("6.0221415E+23").getValue();

// evals to 2147483647
int maxValue = (Integer) parser.parseExpression("0x7FFFFFFF").getValue();

boolean trueValue = (Boolean) parser.parseExpression("true").getValue();

Object nullValue = parser.parseExpression("null").getValue();

請注意,字符串需要用單引號包括,浮點(diǎn)數(shù)默認(rèn)為 double 類型,用null表示null object

輸出結(jié)果

str: Hello World
double: 6.0221415E23
int: 2147483647
bool: true
null: null

2. Inline List

通過{}來表明 List 表達(dá)式,一個(gè)空的列表直接用{}表示

ExpressionParser parser = new SpelExpressionParser();
// Integer列表
List numbers = (List) parser.parseExpression("{1,2,3,4}").getValue();
System.out.println("list: " + numbers);

// List的元素為List
List<List> listlOfLists = (List) parser.parseExpression("{{'a','b'},{'x','y'}}").getValue();
System.out.println("List<List> : " + listlOfLists);

輸出結(jié)果

list: [1, 2, 3, 4]
List<List> : [[a, b], [x, y]]

3. Inline map

{key:value}來表示 map 表達(dá)式,空 Map 直接用{:}表示

private void map() {
  ExpressionParser parser = new SpelExpressionParser();
  Map map = (Map) parser.parseExpression("{txt:'Nikola',dob:'10-July-1856'}").getValue();
  System.out.println("map: " + map);
  Map mapOfMaps =
      (Map) parser.parseExpression("{txt:{first:'Nikola',last:'Tesla'},dob:{day:10,month:'July',year:1856}}")
          .getValue();
  System.out.println("Map<Map>: " + mapOfMaps);
}

輸出結(jié)果

map: {txt=Nikola, dob=10-July-1856}
Map<Map>: {txt={first=Nikola, last=Tesla}, dob={day=10, month=July, year=1856}}

4. 數(shù)組

數(shù)組可以借助new構(gòu)造方法來實(shí)現(xiàn),通過下標(biāo)ary[index]的方式訪問數(shù)組中的元素

private void array() {
   ExpressionParser parser = new SpelExpressionParser();
   int[] numbers1 = (int[]) parser.parseExpression("new int[4]").getValue();
   System.out.println("array: " + JSON.toJSONString(numbers1));

   // Array with initializer
   int[] numbers2 = (int[]) parser.parseExpression("new int[]{1,2,3}").getValue();
   System.out.println("array: " + JSON.toJSONString(numbers2));

   // Multi dimensional array
   int[][] numbers3 = (int[][]) parser.parseExpression("new int[4][5]").getValue();
   System.out.println("array: " + JSON.toJSONString(numbers3));


   int[] nums = new int[]{1, 3, 5};
   EvaluationContext context = new StandardEvaluationContext();
   context.setVariable("num", nums);

   // 通過下標(biāo)訪問數(shù)組中的元素
   Integer numVal = parser.parseExpression("#num[1]").getValue(context, Integer.class);
   System.out.println("numVal in array: " + numVal);
}

輸出如下

array: [0,0,0,0]
array: [1,2,3]
array: [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]]
numVal in array: 3

5. 表達(dá)式

Spel 支持一些 Java 語法中常規(guī)的比較判斷,算數(shù)運(yùn)算,三元表達(dá)式,類型判斷,matches正則匹配等基表表達(dá)式

下面給出一些簡單的實(shí)例

public void expression() {
  ExpressionParser parser = new SpelExpressionParser();
  // 運(yùn)算
  System.out.println("1+2= " + parser.parseExpression("1+2").getValue());
  // 比較
  System.out.println("1<2= " + parser.parseExpression("1<2").getValue());
  System.out.println("true ? hello : false > " + parser.parseExpression("3 > 2 ? 'hello': 'false' ").getValue());
  // instanceof 判斷,請注意靜態(tài)類,用T進(jìn)行包裝
  System.out.println("instance : " + parser.parseExpression("'a' instanceof T(String)").getValue());
  //正則表達(dá)式
  System.out.println("22 是否為兩位數(shù)字 :" + parser.parseExpression("22 matches '\\d{2}'").getValue());
}

輸出結(jié)果

1+2= 3
1<2= true
true ? hello : false > hello
instance : true
22 是否為兩位數(shù)字 :true

6. Type 與靜態(tài)類

如果想獲取 Class 對象,或者訪問靜態(tài)成員/方法,可以借助T()語法來實(shí)現(xiàn)

比如我們有一個(gè)靜態(tài)類

public static class StaClz {
  public static String txt = "靜態(tài)屬性";

  public static String hello(String tag) {
    return txt + " : " + tag;
  }
}

如果希望訪問靜態(tài)屬性txt, 表達(dá)式可以寫成T(com.git.hui.boot.spel.demo.BasicSpelDemo.StaClz).txt,請注意圓括號中的是完整簽名;訪問靜態(tài)方法方式類似

public void type() {
  // class,靜態(tài)類
  ExpressionParser parser = new SpelExpressionParser();
  String name =
      parser.parseExpression("T(com.git.hui.boot.spel.demo.BasicSpelDemo.StaClz).txt").getValue(String.class);
  System.out.println("txt: " + name);

  String methodReturn =
      parser.parseExpression("T(com.git.hui.boot.spel.demo.BasicSpelDemo.StaClz).hello" + "('一灰灰blog')")
          .getValue(String.class);
  System.out.println("static method return: " + methodReturn);

  // class類獲取
  Class stringClass = parser.parseExpression("T(String)").getValue(Class.class);
  System.out.println("class: " + stringClass.getName());
}

輸出結(jié)果如下

txt: 靜態(tài)屬性
static method return: 靜態(tài)屬性 : 一灰灰blog
class: java.lang.String

上面的寫法,請重點(diǎn)看一下T(String),這里的 String 沒有用完整的包路徑,即直接位于java.lang包下的類,是可以省略掉完整包名的,就像我們平時(shí)寫代碼時(shí),也不需要顯示的加一個(gè)import java.lang.*

7. 構(gòu)造方法

上面介紹 array 的時(shí)候,就介紹了使用new來創(chuàng)建數(shù)組對象,當(dāng)然也可以直接構(gòu)造其他的普通對象, 如我們新建一個(gè)測試類

public static class Person {
  private String name;

  private int age;

  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public int getAge() {
    return age;
  }

  @Override
  public String toString() {
    return "Person{" + "txt='" + name + '\'' + ", age=" + age + '}';
  }
}

通過 SpEl 創(chuàng)建一個(gè)對象的實(shí)例

public void construct() {
  ExpressionParser parser = new SpelExpressionParser();
  Person person = parser.parseExpression("new com.git.hui.boot.spel.demo.BasicSpelDemo.Person('一灰灰', 20)")
      .getValue(Person.class);
  System.out.println("person: " + person);
}

輸出結(jié)果如下:

person: Person{txt='一灰灰', age=20}

請注意,構(gòu)造方法中類的完整簽名

8. 變量引用

細(xì)心的小伙伴,在上面介紹數(shù)組的成員演示的實(shí)例中,寫法如"#num[1]",這個(gè) num 前面有一個(gè)#,這是一個(gè)語法定義,有#修飾的表示變量訪問

要理解這一小節(jié),首先得理解EvaluationContext, 在我們的 SpEL 表達(dá)式的解析中,getValue有一個(gè)參數(shù)就是這個(gè) Context,你可以將他簡單理解為包含一些對象的上下文,我們可以通過 SpEL 的語法,來訪問操作 Context 中的某些成員、成員方法屬性等

一般的操作過程如下:

  • context.setVariable("person", person); 向EvaluationContext中塞入成員變量
  • parser.parseExpression(xxx).getValue(context) 解析 SpEL 表達(dá)式,context 必須作為傳參丟進(jìn)去哦

一個(gè)簡單的實(shí)例

public void variable() {
  ExpressionParser parser = new SpelExpressionParser();
  Person person = new Person("一灰灰blog", 18);
  EvaluationContext context = new StandardEvaluationContext();
  context.setVariable("person", person);

  String name = parser.parseExpression("#person.getName()").getValue(context, String.class);
  System.out.println("variable name: " + name);

  Integer age = parser.parseExpression("#person.age").getValue(context, Integer.class);
  System.out.println("variable age: " + age);
}

輸出結(jié)果如下

variable name: 一灰灰blog
variable age: 18

友情提示,如果訪問對象的私有 Field/method,會拋異常

9. 函數(shù)

Context 中的變量,除了是我們常見的基本類型,普通的對象之外,還可以是方法,在setVariable時(shí),設(shè)置的成員類型為method即可

public void function() {
  try {
    ExpressionParser parser = new SpelExpressionParser();
    EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();
    // 注冊一個(gè)方法變量,參數(shù)為method類型
    context.setVariable("hello", StaClz.class.getDeclaredMethod("hello", String.class));

    String ans = parser.parseExpression("#hello('一灰灰')").getValue(context, String.class);
    System.out.println("function call: " + ans);
  } catch (Exception e) {
    e.printStackTrace();
  }
}

輸出結(jié)果如下

function call: 靜態(tài)屬性 : 一灰灰

10. bean 訪問

在 Spring 中,什么對象最常見?當(dāng)然是 bean, 那么我們可以直接通過 SpEL 訪問 bean 的屬性、調(diào)用方法么?

要訪問 bean 對象,所以我們的EvaluationContext中需要包含 bean 對象才行

借助BeanResolver來實(shí)現(xiàn),如context.setBeanResolver(new BeanFactoryResolver(applicationContext));
其次訪問 bean 的前綴修飾為@符號
為了演示這種場景,首先創(chuàng)建一個(gè)普通的 Bean 對象

@Data
@Component
public class BeanDemo {

  private String blog = "https://spring.hhui.top";

  private Integer num = 8;

  public String hello(String name) {
    return "hello " + name + ", welcome to my blog " + blog + ", now person: " + num;
  }
}

接著我們需要獲取ApplicationContext,所以可以稍微改一下我們的測試類,讓它繼承自ApplicationContextAware

private ApplicationContext applicationContext;

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  this.applicationContext = applicationContext;
}


public void bean() {
  ExpressionParser parser = new SpelExpressionParser();
  StandardEvaluationContext context = new StandardEvaluationContext();
  context.setBeanResolver(new BeanFactoryResolver(applicationContext));

  // 獲取bean對象
  BeanDemo beanDemo = parser.parseExpression("@beanDemo").getValue(context, BeanDemo.class);
  System.out.println("bean: " + beanDemo);

  // 訪問bean方法
  String ans = parser.parseExpression("@beanDemo.hello('一灰灰blog')").getValue(context, String.class);
  System.out.println("bean method return: " + ans);
}

上面的寫法和之前的并沒有太大的區(qū)別,實(shí)際輸出結(jié)果如下

bean: BeanDemo(blog=https://spring.hhui.top, num=8)
bean method return: hello 一灰灰blog, welcome to my blog  https://spring.hhui.top, now person: 8

11. ifElse

SpEL 支持三元表達(dá)式,在上述的表達(dá)式中也給出了實(shí)例

public void ifThenElse() {
  // 三元表達(dá)式,? :
  ExpressionParser parser = new SpelExpressionParser();
  String ans = parser.parseExpression("true ? '正確': '錯(cuò)誤'").getValue(String.class);
  System.out.println("ifTheElse: " + ans);
}

輸出結(jié)果如下

ifTheElse: 正確

12. elvis

xx != null ? xx : yy => xx?:yy

這個(gè)也屬于我們經(jīng)常遇到的一種場景,如果 xx 為 null,則返回 yy;否則直接返回 xx;簡化寫法為 elvis 寫法: xx?:yy

public void elvis() {
  // xx != null ? xx : yy => xx?:yy
  ExpressionParser parser = new SpelExpressionParser();
  EvaluationContext context = new StandardEvaluationContext();
  context.setVariable("name", null);
  String name = parser.parseExpression("#name?:'Unknown'").getValue(context, String.class);
  System.out.println("elvis-before " + name);

  context.setVariable("name", "Exists!");
  name = parser.parseExpression("#name?:'Unknown'").getValue(context, String.class);
  System.out.println("elvis-after " + name);
}

輸出結(jié)果如下

elvis-before Unknown
elvis-after Exists!

13. 安全表達(dá)式

在 java 中,最常見最討厭的是一個(gè)就是 NPE 的問題,SpEL 中當(dāng)然也可能出現(xiàn)這種情況,但是若在 SpEL 中進(jìn)行非空判斷,那就很不優(yōu)雅了,SpEL 提供了xx?.yy的寫法來避免 npe,即

xx == null ? null : xx.yy => xx?.yy

舉例說明

public void safeOperate() {
  // 防npe寫法, xx == null ? null : xx.yy => xx?.yy
  ExpressionParser parser = new SpelExpressionParser();
  Person person = new Person(null, 18);

  String name = parser.parseExpression("name?.length()").getValue(person, String.class);
  System.out.println("safeOperate-before: " + name);

  person.name = "一灰灰blog";
  name = parser.parseExpression("name?.length()").getValue(person, String.class);
  System.out.println("safeOperate-after: " + name);
}

輸出結(jié)果如下

safeOperate-before: null
safeOperate-after: 7

14. 容器截取

遍歷容器,獲取子集,相當(dāng)于 jdk8 Stream 中 filter 用法,語法格式如下

xx.?[expression], 請注意中括弧中的表達(dá)式必須返回 boolean

舉例說明

public void collectionSelection() {
  // 容器截取,返回滿足條件的子集
  // xx.?[expression] , 將滿足expression的子元素保留,返回一個(gè)新的集合,類似容器的 filter
  List<Integer> list = new ArrayList<>(Arrays.asList(1, 3, 4, 6, 7, 8, 9));
  ExpressionParser parser = new SpelExpressionParser();

  EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();
  context.setVariable("list", list);
  // 用 #this 來指代列表中的迭代元素
  List<Integer> subList = (List<Integer>) parser.parseExpression("#list.?[#this>5]").getValue(context);
  System.out.println("subList: " + subList);


  Map<String, Integer> map = new HashMap<>();
  map.put("a", 1);
  map.put("b", 10);
  map.put("c", 4);
  map.put("d", 7);
  context.setVariable("map", map);
  // 表達(dá)式內(nèi)部用key, value 來指代map的k,v
  Map subMap = parser.parseExpression("#map.?[value < 5]").getValue(context, Map.class);
  System.out.println("subMap: " + subMap);

  subMap = parser.parseExpression("#map.?[key == 'a']").getValue(context, Map.class);
  System.out.println("subMap: " + subMap);
}

輸出結(jié)果如下

subList: [6, 7, 8, 9]
subMap: {a=1, c=4}
subMap: {a=1}

注意

  • 在列表表達(dá)式中,可以通過#this來指代列表中的每一個(gè)元素
  • 在 map 表達(dá)式中,通過key, value來分別指代 map 中的k,v

15. 容器映射

將一個(gè)集合通過某種規(guī)則,映射為另一種集合,相當(dāng)于 jdk8 Stream 中的 map 用法,語法如下

xx.![expression], 將表達(dá)式計(jì)算的結(jié)果作為輸出容器中的成員

舉例如下

public void collectionProjection() {
  // 容器操作之后,生成另一個(gè)容器, 類似lambda中的map方法
  // xx.![expression]

  List<Integer> list = new ArrayList<>(Arrays.asList(1, 3, 4, 6, 7, 8, 9));
  ExpressionParser parser = new SpelExpressionParser();
  EvaluationContext context = SimpleEvaluationContext.forReadOnlyDataBinding().build();
  context.setVariable("list", list);

  // 用 #this 來指代列表中的迭代元素
  List newList = parser.parseExpression("#list.![#this * 2]").getValue(context, List.class);
  System.out.println("newList: " + newList);


  Map<String, Integer> map = new HashMap<>();
  map.put("a", 1);
  map.put("b", 10);
  map.put("c", 4);
  map.put("d", 7);
  context.setVariable("map", map);
  List newListByMap = parser.parseExpression("#map.![value * 2]").getValue(context, List.class);
  System.out.println("newListByMap: " + newListByMap);
}

輸出結(jié)果如下:

newList: [2, 6, 8, 12, 14, 16, 18]
newListByMap: [2, 20, 8, 14]

16. 表達(dá)式模板

SpEL 還提供了一種自定義表達(dá)式模板的方式,將字面量和表達(dá)式放在一起使用,比如下面這一條語句

"random number is #{T(java.lang.Math).random()}"

其中#{T(java.lang.Math).random()}是一個(gè) SpEL 表達(dá)式,左邊的是普通字符串,這種寫法也常見于@Value注解中的屬性寫法,當(dāng)然直接通過上面的寫法執(zhí)行這個(gè)語句會報(bào)錯(cuò),這個(gè)時(shí)候需要指定ParserContext

舉例說明

public void template() {
  // 模板,混合字面文本與表達(dá)式,使用 #{} 將表達(dá)式包裹起來
  ExpressionParser parser = new SpelExpressionParser();
  String randomPhrase = parser.parseExpression("random number is #{T(java.lang.Math).random()}",
      ParserContext.TEMPLATE_EXPRESSION).getValue(String.class);
  System.out.println("template: " + randomPhrase);
}

輸出結(jié)果如下

template: random number is 0.10438946298113871

17. 小結(jié)

SpEL 屬于非常強(qiáng)大的表達(dá)式語言了,就我個(gè)人的感覺而言,它和 OGNL 有些像,當(dāng)它們的上下文中包含了 Spring 的上下文時(shí),可以訪問任何的 bean,而你可以借助它們的語法規(guī)范,做各種事情

推薦我之前的一個(gè)項(xiàng)目,https://github.com/liuyueyi/quick-fix,利用 ognl 結(jié)合ApplicationContext,可以隨心所欲的訪問控制應(yīng)用中的任何 bean 對象

II. 其他

0. 項(xiàng)目

工程:https://github.com/liuyueyi/spring-boot-demo

源碼:https://github.com/liuyueyi/spring-boot-demo/spring-boot/013-spel

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何使用兩個(gè)棧實(shí)現(xiàn)隊(duì)列Java

    如何使用兩個(gè)棧實(shí)現(xiàn)隊(duì)列Java

    這篇文章主要介紹了如何使用兩個(gè)棧實(shí)現(xiàn)隊(duì)列Java,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • idea啟動(dòng)Tomcat時(shí)控制臺亂碼的解決方法(親測有效)

    idea啟動(dòng)Tomcat時(shí)控制臺亂碼的解決方法(親測有效)

    最近在idea中啟動(dòng)tomcat出現(xiàn)控制臺亂碼問題,嘗試了很多方法,最后終于解決了,所以下面這篇文章主要給大家介紹了關(guān)于idea啟動(dòng)Tomcat時(shí)控制臺亂碼的解決方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • IntelliJ IDEA 2021.1 首個(gè) Beta 版本發(fā)布

    IntelliJ IDEA 2021.1 首個(gè) Beta 版本發(fā)布

    這篇文章主要介紹了IntelliJ IDEA 2021.1 首個(gè) Beta 版本發(fā)布,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Java中system.exit(0) 和 system.exit(1)區(qū)別

    Java中system.exit(0) 和 system.exit(1)區(qū)別

    本文主要介紹了Java中system.exit(0) 和 system.exit(1)區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • springboot中使用ElasticSearch的詳細(xì)教程

    springboot中使用ElasticSearch的詳細(xì)教程

    這篇文章主要介紹了ElasticSearch在springboot中使用的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • Java+OpenCV調(diào)用攝像頭實(shí)現(xiàn)拍照功能

    Java+OpenCV調(diào)用攝像頭實(shí)現(xiàn)拍照功能

    隨著我們對環(huán)境、Mat基本使用越來越熟練、Java Swing也逐步熟悉了起來。本文將通過OpenCV驅(qū)動(dòng)攝像頭實(shí)現(xiàn)識臉和拍照功能,需要的可以參考一下
    2022-03-03
  • Java實(shí)現(xiàn)HTML轉(zhuǎn)為Word的示例代碼

    Java實(shí)現(xiàn)HTML轉(zhuǎn)為Word的示例代碼

    本文以Java代碼為例為大家詳細(xì)介紹如何實(shí)現(xiàn)將HTML文件轉(zhuǎn)為Word文檔(.docx、.doc)。在實(shí)際開發(fā)場景中可參考此方法來轉(zhuǎn)換,感興趣的可以了解一下
    2022-06-06
  • java設(shè)計(jì)模式之單例模式

    java設(shè)計(jì)模式之單例模式

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之單例模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • HTTP基本認(rèn)證(Basic Authentication)的JAVA實(shí)例代碼

    HTTP基本認(rèn)證(Basic Authentication)的JAVA實(shí)例代碼

    下面小編就為大家?guī)硪黄狧TTP基本認(rèn)證(Basic Authentication)的JAVA實(shí)例代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-11-11
  • 解析Spring Boot內(nèi)嵌tomcat關(guān)于getServletContext().getRealPath獲取得到臨時(shí)路徑的問題

    解析Spring Boot內(nèi)嵌tomcat關(guān)于getServletContext().getRealPath獲取得到臨時(shí)

    大家都很糾結(jié)這個(gè)問題在使用getServletContext().getRealPath()得到的是臨時(shí)文件的路徑,每次重啟服務(wù),這個(gè)臨時(shí)文件的路徑還好變更,下面小編通過本文給大家分享Spring Boot內(nèi)嵌tomcat關(guān)于getServletContext().getRealPath獲取得到臨時(shí)路徑的問題,一起看看吧
    2021-05-05

最新評論

黄平县| 蚌埠市| 陈巴尔虎旗| 屏山县| 河池市| 曲松县| 武平县| 高州市| 彭州市| 开化县| 石嘴山市| 福建省| 吉安市| 叙永县| 遂昌县| 航空| 河间市| 安阳县| 长垣县| 裕民县| 共和县| 客服| 阿拉尔市| 云安县| 房产| 无棣县| 牡丹江市| 大余县| 镇远县| 黎川县| 定陶县| 富蕴县| 湖南省| 蒙阴县| 信宜市| 乌拉特中旗| 吴旗县| 同心县| 双牌县| 河津市| 盐源县|