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

Java中Validated、Valid 、Validator區(qū)別詳解

 更新時間:2021年08月25日 10:21:23   作者:琦彥  
本文主要介紹了Java中Validated、Valid 、Validator區(qū)別,有時候面試的時候會被問到,他們的區(qū)別你知道幾個,本文就來詳細的介紹一下

1. 結(jié)論先出

Valid VS Validated 相同點
都可以對方法和參數(shù)進行校驗
@Valid和@Validated
兩種注釋都會導致應用標準Bean驗證。

如果驗證不通過會拋出BindException異常,并變成400(BAD_REQUEST)響應;或者可以通過Errors或BindingResult參數(shù)在控制器內(nèi)本地處理驗證錯誤。另外,如果參數(shù)前有@RequestBody注解,驗證錯誤會拋出MethodArgumentNotValidException異常。

JSR 380

JSR 380 是用于 bean 驗證的 Java API 規(guī)范,是 Jakarta EE 和 JavaSE 的一部分。這確保 bean 的屬性滿足特定條件,使用諸如@NotNull、@Min和@Max 之類的注釋。

此版本需要 Java 8 或更高版本,并利用 Java 8 中添加的新功能,例如類型注釋和對Optional和LocalDate等新類型的支持。

有關(guān)規(guī)范的完整信息,請繼續(xù)閱讀JSR 380。

Valid VS Validated 不同點?

javax.validation.Valid

  • 是JSR-303規(guī)范標準注解支持,是一個標記注解。
  • 注解支持ElementType#METHOD,ElementType#FIELD, ElementType#CONSTRUCTOR,
  • ElementType#PARAMETER, ElementType#TYPE_USE

org.springframework.validation.annotation.Validated

  • 是Spring 做得一個自定義注解,增強了分組功能。
  • 注解支持 ElementType#TYPE,ElementType#METHOD,ElementType#PARAMETER

@Valid和@Validated區(qū)別

區(qū)別 @Valid @Validated
提供者 JSR-303規(guī)范 Spring
是否支持分組 不支持 支持
標注位置 METHOD, FIELD, CONSTRUCTOR, PARAMETER, TYPE_USE TYPE, METHOD, PARAMETER
嵌套校驗 支持 不支持

Validator

Bean Validation 2.0(JSR 380)定義了用于實體和方法驗證的元數(shù)據(jù)模型和API,Hibernate Validator是目前最好的實現(xiàn)

Validator接口有三個方法,可用于驗證整個實體或僅驗證實體的單個屬性

  • Validator#validate() 驗證所有bean的所有約束
  • Validator#validateProperty() 驗證單個屬性
  • Validator#validateValue() 檢查給定類的單個屬性是否可以成功驗證

不管是requestBody參數(shù)校驗還是方法級別的校驗,最終都是調(diào)用Hibernate Validator執(zhí)行校驗,Spring Validation只是做了一層封裝。

驗證用戶的輸入是我們大多數(shù)應用程序中的常見功能。在 Java 生態(tài)系統(tǒng)中,我們專門使用Java Standard Bean Validation API來支持這一點。此外,從 4.0 版本開始,這也與 Spring 很好地集成在一起.

在接下來的部分中,讓我們詳細了解它們。

2. @Valid和​​​​​​​@Validated 注解

在 Spring 中,我們使用 JSR-303 的@Valid注釋進行方法級別驗證。此外,我們還使用它來標記成員屬性以進行驗證。但是,此注釋不支持組驗證

組有助于限制驗證期間應用的約束。一個特殊的用例是 UI 界面(UI wizards)。在這里,在第一步中,我們可能有某個字段子組。在后續(xù)步驟中,可能有另一個組屬于同一個 bean。因此我們需要在每一步中對這些有限的字段應用約束,但@Valid不支持這一點。

在這種情況下,對于組級別,我們必須使用 Spring 的@Validated,它是 JSR-303 的@Valid的變體。這是在方法級別使用的。對于標記成員屬性,我們繼續(xù)使用@Valid注釋。

現(xiàn)在,讓我們直接進入并通過一個例子來看看這些注解的用法。

3. 例子

讓我們考慮一個使用 Spring Boot 開發(fā)的簡單用戶注冊。首先,我們將只有名稱和密碼屬性:

public class UserAccount {
 
    @NotNull
    @Size(min = 4, max = 15)
    private String password;
 
    @NotBlank
    private String name;
 
    // standard constructors / setters / getters / toString   
}

接下來,讓我們看看控制器。在這里,我們將使用帶有@Valid注釋的saveBasicInfo方法來驗證用戶輸入:

@RequestMapping(value = "/saveBasicInfo", method = RequestMethod.POST)
public String saveBasicInfo(
  @Valid @ModelAttribute("useraccount") UserAccount useraccount, 
  BindingResult result, 
  ModelMap model) {
    if (result.hasErrors()) {
        return "error";
    }
    return "success";
}

現(xiàn)在讓我們測試這個方法:

@Test
public void givenSaveBasicInfo_whenCorrectInput_thenSuccess() throws Exception {
    this.mockMvc.perform(MockMvcRequestBuilders.post("/saveBasicInfo")
      .accept(MediaType.TEXT_HTML)
      .param("name", "test123")
      .param("password", "pass"))
      .andExpect(view().name("success"))
      .andExpect(status().isOk())
      .andDo(print());
}

確認測試運行成功后,我們現(xiàn)在擴展功能。下一個合乎邏輯的步驟是將其轉(zhuǎn)換為復雜用戶注冊。第一步,名稱和密碼保持不變。在第二步中,我們將獲取諸如年齡 和 電話之類的附加信息。因此,我們將使用這些附加字段更新我們的域?qū)ο螅?nbsp;

public class UserAccount {
    
    @NotNull
    @Size(min = 4, max = 15)
    private String password;
 
    @NotBlank
    private String name;
 
    @Min(value = 18, message = "Age should not be less than 18")
    private int age;
 
    @NotBlank
    private String phone;
    
    // standard constructors / setters / getters / toString   
}

但是,這一次我們會注意到之前的測試失敗了。這是因為我們沒有傳入age和phone字段。為了支持這種行為,我們需要組驗證和@Validated注釋。

為此,我們需要對字段進行分組,創(chuàng)建兩個不同的組。首先,我們需要創(chuàng)建兩個標記接口。每個組或每個步驟單獨一個。我們可以參考我們關(guān)于組驗證的文章以了解具體的實現(xiàn)方式。在這里,讓我們關(guān)注注釋的差異。

我們將有第一步的BasicInfo接口和第二步的 AdvanceInfo  。此外,我們將更新UserAccount類以使用這些標記接口,如下所示:

public class UserAccount {
    
    @NotNull(groups = BasicInfo.class)
    @Size(min = 4, max = 15, groups = BasicInfo.class)
    private String password;
 
    @NotBlank(groups = BasicInfo.class)
    private String name;
 
    @Min(value = 18, message = "Age should not be less than 18", groups = AdvanceInfo.class)
    private int age;
 
    @NotBlank(groups = AdvanceInfo.class)
    private String phone;
    
    // standard constructors / setters / getters / toString   
    
}

此外,我們現(xiàn)在將更新我們的控制器以使用@Validated批注而不是@Valid:

@RequestMapping(value = "/saveBasicInfoStep1", method = RequestMethod.POST)
public String saveBasicInfoStep1(
  @Validated(BasicInfo.class) 
  @ModelAttribute("useraccount") UserAccount useraccount, 
  BindingResult result, ModelMap model) {
    if (result.hasErrors()) {
        return "error";
    }
    return "success";
}

由于此更新,我們的測試現(xiàn)在成功運行?,F(xiàn)在讓我們也測試一下這個新方法:

@Test
public void givenSaveBasicInfoStep1_whenCorrectInput_thenSuccess() throws Exception {
    this.mockMvc.perform(MockMvcRequestBuilders.post("/saveBasicInfoStep1")
      .accept(MediaType.TEXT_HTML)
      .param("name", "test123")
      .param("password", "pass"))
      .andExpect(view().name("success"))
      .andExpect(status().isOk())
      .andDo(print());
}

這也運行成功。因此,我們可以看到@Validated的使用 對于組驗證至關(guān)重要。

接下來,讓我們看看@Valid如何觸發(fā)嵌套屬性的驗證。

4.使用@Valid嵌套校驗

@Valid注釋用于校驗嵌套屬性。這會觸發(fā)嵌套對象的驗證。例如,在我們當前的場景中,讓我們創(chuàng)建一個 UserAddress 對象:

public class UserAddress {
 
    @NotBlank
    private String countryCode;
 
    // standard constructors / setters / getters / toString
}

為了確保此嵌套對象的驗證,我們將使用@Valid注釋來裝飾該屬性:

public class UserAccount {
    
    //...
    
    @Valid
    @NotNull(groups = AdvanceInfo.class)
    private UserAddress useraddress;
    
    // standard constructors / setters / getters / toString 
}

5. 組合使用@Valid和@Validated 進行集合校驗

如果請求體直接傳遞了json數(shù)組給后臺,并希望對數(shù)組中的每一項都進行參數(shù)校驗。此時,如果我們直接使用java.util.Collection下的list或者set來接收數(shù)據(jù),參數(shù)校驗并不會生效!我們可以使用自定義list集合來接收參數(shù):

包裝List類型,并聲明@Valid注解​​​​​​​​​​​​​​

package com.devicemag.core.BO;
 
import javax.validation.Valid;
import java.util.*;
 
/**
 * @Title: 參數(shù)校驗工具類, 用于校驗List<E> 類型的請求參數(shù)
 * @ClassName: com.devicemag.core.BO.ValidList.java
 * @Description:
 *
 * @Copyright 2020-2021 - Powered By 研發(fā)中心
 * @author: 王延飛
 * @date: 2020/12/25 20:23
 * @version V1.0
 */
public class ValidList<E> implements List<E> {
 
    @Valid
    private List<E> list = new ArrayList<>();
 
    @Override
    public int size() {
        return list.size();
    }
 
    @Override
    public boolean isEmpty() {
        return list.isEmpty();
    }
 
    @Override
    public boolean contains(Object o) {
        return list.contains(o);
    }
 
    @Override
    public Iterator<E> iterator() {
        return list.iterator();
    }
 
    @Override
    public Object[] toArray() {
        return list.toArray();
    }
 
    @Override
    public <T> T[] toArray(T[] a) {
        return list.toArray(a);
    }
 
    @Override
    public boolean add(E e) {
        return list.add(e);
    }
 
    @Override
    public boolean remove(Object o) {
        return list.remove(o);
    }
 
    @Override
    public boolean containsAll(Collection<?> c) {
        return list.containsAll(c);
    }
 
    @Override
    public boolean addAll(Collection<? extends E> c) {
        return list.addAll(c);
    }
 
    @Override
    public boolean addAll(int index, Collection<? extends E> c) {
        return list.addAll(index, c);
    }
 
    @Override
    public boolean removeAll(Collection<?> c) {
        return list.removeAll(c);
    }
 
    @Override
    public boolean retainAll(Collection<?> c) {
        return list.retainAll(c);
    }
 
    @Override
    public void clear() {
        list.clear();
    }
 
    @Override
    public E get(int index) {
        return list.get(index);
    }
 
    @Override
    public E set(int index, E element) {
        return list.set(index, element);
    }
 
    @Override
    public void add(int index, E element) {
        list.add(index, element);
    }
 
    @Override
    public E remove(int index) {
        return list.remove(index);
    }
 
    @Override
    public int indexOf(Object o) {
        return list.indexOf(o);
    }
 
    @Override
    public int lastIndexOf(Object o) {
        return list.lastIndexOf(o);
    }
 
    @Override
    public ListIterator<E> listIterator() {
        return list.listIterator();
    }
 
    @Override
    public ListIterator<E> listIterator(int index) {
        return list.listIterator(index);
    }
 
    @Override
    public List<E> subList(int fromIndex, int toIndex) {
        return list.subList(fromIndex, toIndex);
    }
 
    public List<E> getList() {
        return list;
    }
 
    public void setList(List<E> list) {
        this.list = list;
    }
     // 一定要記得重寫toString方法
 
    @Override
    public String toString() {
        return "ValidList{" +
                "list=" + list +
                '}';
    }
}

比如,我們需要一次性保存多個UserAccount 對象,Controller層的方法可以這么寫:​​​​​​​

@PostMapping("/saveList")
 
public Result saveList(@RequestBody @Validated(UserAccount.class) ValidationList<UserAccount > userList) {
 
// 校驗通過,才會執(zhí)行業(yè)務邏輯處理
 
return Result.ok();
 
}

6. 自定義校驗

validator-api-2.0的約束注解有22個,具體我們看下面表格

空與非空檢查

注解 支持Java類型 說明
@Null Object 為null
@NotNull Object 不為null
@NotBlank CharSequence 不為null,且必須有一個非空格字符
@NotEmpty CharSequence、Collection、Map、Array 不為null,且不為空(length/size>0)

Boolean值檢查

注解 支持Java類型 說明 備注
@AssertTrue boolean、Boolean 為true 為null有效
@AssertFalse boolean、Boolean 為false 為null有效

日期檢查

注解 支持Java類型 說明 備注
@Future Date、Calendar、Instant、LocalDate、LocalDateTime、LocalTime、MonthDay、OffsetDateTime、OffsetTime、Year、YearMonth、ZonedDateTime、HijrahDate、JapaneseDate、MinguoDate、ThaiBuddhistDate 驗證日期為當前時間之后 為null有效
@FutureOrPresent Date、Calendar、Instant、LocalDate、LocalDateTime、LocalTime、MonthDay、OffsetDateTime、OffsetTime、Year、YearMonth、ZonedDateTime、HijrahDate、JapaneseDate、MinguoDate、ThaiBuddhistDate 驗證日期為當前時間或之后 為null有效
@Past Date、Calendar、Instant、LocalDate、LocalDateTime、LocalTime、MonthDay、OffsetDateTime、OffsetTime、Year、YearMonth、ZonedDateTime、HijrahDate、JapaneseDate、MinguoDate、ThaiBuddhistDate 驗證日期為當前時間之前 為null有效
@PastOrPresent Date、Calendar、Instant、LocalDate、LocalDateTime、LocalTime、MonthDay、OffsetDateTime、OffsetTime、Year、YearMonth、ZonedDateTime、HijrahDate、JapaneseDate、MinguoDate、ThaiBuddhistDate 驗證日期為當前時間或之前 為null有效

數(shù)值檢查

注解 支持Java類型 說明 備注
@Max BigDecimal、BigInteger,byte、short、int、long以及包裝類 小于或等于 為null有效
@Min BigDecimal、BigInteger,byte、short、int、long以及包裝類 大于或等于 為null有效
@DecimalMax BigDecimal、BigInteger、CharSequence,byte、short、int、long以及包裝類 小于或等于 為null有效
@DecimalMin BigDecimal、BigInteger、CharSequence,byte、short、int、long以及包裝類 大于或等于 為null有效
@Negative BigDecimal、BigInteger,byte、short、int、long、float、double以及包裝類 負數(shù) 為null有效,0無效
@NegativeOrZero BigDecimal、BigInteger,byte、short、int、long、float、double以及包裝類 負數(shù)或零 為null有效
@Positive BigDecimal、BigInteger,byte、short、int、long、float、double以及包裝類 正數(shù) 為null有效,0無效
@PositiveOrZero BigDecimal、BigInteger,byte、short、int、long、float、double以及包裝類 正數(shù)或零 為null有效
@Digits(integer = 3, fraction = 2) BigDecimal、BigInteger、CharSequence,byte、short、int、long以及包裝類 整數(shù)位數(shù)和小數(shù)位數(shù)上限 為null有效

其他

注解 支持Java類型 說明 備注
@Pattern CharSequence 匹配指定的正則表達式 為null有效
@Email CharSequence 郵箱地址 為null有效,默認正則 '.*'
@Size CharSequence、Collection、Map、Array 大小范圍(length/size>0) 為null有效

hibernate-validator擴展約束(部分)

注解 支持Java類型 說明
@Length String 字符串長度范圍
@Range 數(shù)值類型和String 指定范圍
@URL URL地址驗證

自定義約束注解

除了以上提供的約束注解(大部分情況都是能夠滿足的),我們還可以根據(jù)自己的需求自定義自己的約束注解

定義自定義約束,有三個步驟

  • 創(chuàng)建約束注解
  • 實現(xiàn)一個驗證器
  • 定義默認的錯誤信息

那么下面就直接來定義一個簡單的驗證手機號碼的注解

@Documented
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Constraint(validatedBy = {MobileValidator.class})
@Retention(RUNTIME)
@Repeatable(Mobile.List.class)
public @interface Mobile {
 
    /**
     * 錯誤提示信息,可以寫死,也可以填寫國際化的key
     */
    String message() default "手機號碼不正確";
 
    Class<?>[] groups() default {};
    
    Class<? extends Payload>[] payload() default {};
 
    String regexp() default "^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$";
    @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
    @Retention(RUNTIME)
    @Documented
    @interface List {
        Mobile[] value();
    }
}

關(guān)于注解的配置這里不說了,自定義約束需要下面3個屬性

  • message 錯誤提示信息,可以寫死,也可以填寫國際化的key
  • groups 分組信息,允許指定此約束所屬的驗證組(下面會說到分組約束)
  • payload 有效負載,可以通過payload來標記一些需要特殊處理的操作

@Repeatable注解和List定義可以讓該注解在同一個位置重復多次,通常是不同的配置(比如不同的分組和消息)
@Constraint(validatedBy = {MobileValidator.class})該注解是指明我們的自定義約束的驗證器,那下面就看一下驗證器的寫法,需要實現(xiàn)javax.validation.ConstraintValidator接口

public class MobileValidator implements ConstraintValidator<Mobile, String> {
 
    /**
     * 手機驗證規(guī)則
     */
    private Pattern pattern;
 
    @Override
    public void initialize(Mobile mobile) {
        pattern = Pattern.compile(mobile.regexp());
    }
 
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        }
 
        return pattern.matcher(value).matches();
    }
}

ConstraintValidator接口定義了在實現(xiàn)中設置的兩個類型參數(shù)。

  • 第一個指定要驗證的注解類(如Mobile),
  • 第二個指定驗證器可以處理的元素類型(如String);initialize()方法可以訪問約束注解的屬性值;isValid()方法用于驗證,返回true表示驗證通過

Bean驗證規(guī)范建議將空值視為有效。如果null不是元素的有效值,則應使用@NotNull 顯式注釋

到這里我們自定義的約束就寫好了,可以用個例子來測試一下

public class MobileTest {
 
    public void setMobile(@Mobile String mobile){
        // to do
    }
 
    private static ExecutableValidator executableValidator;
 
    @BeforeAll
    public static void setUpValidator() {
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        executableValidator = factory.getValidator().forExecutables();
    }
 
    @Test
    public void manufacturerIsNull() throws NoSuchMethodException {
        MobileTest mobileTest = new MobileTest();
 
        Method method = MobileTest.class.getMethod("setMobile", String.class);
        Object[] parameterValues = {"1111111"};
        Set<ConstraintViolation<MobileTest>> violations = executableValidator.validateParameters(
                mobileTest, method, parameterValues);
        violations.forEach(violation -> System.out.println(violation.getMessage()));
    }
}

手機號碼不正確

工作原理

@Validated的工作原理

方法級別參數(shù)校驗

在每個參數(shù)前面聲明約束注解,然后通過解析參數(shù)注解完成校驗,這就是方法級別的參數(shù)校驗。 這種方式可以用于任何的Spring Bean的方法上,一般來說,這種方式一般會采用AOP的Around增強完成 在Spring中,是通過以下步驟完成

  • MethodValidationPostProcessor在Bean的初始化完成之后,判斷是否要進行AOP代理(類是否被@Validated標記)
  • MethodValidationInterceptor攔截所有方法,執(zhí)行校驗邏輯
  • 委派Validator執(zhí)行參數(shù)校驗和返回值校驗,得到ConstraintViolation
  • 處理ConstraintViolation

結(jié)論

總之,對于任何基本驗證,我們將在方法調(diào)用中使用 JSR @Valid注釋。另一方面,對于任何組驗證,包括組序列,我們需要 在我們的方法調(diào)用中使用 Spring 的@Validated注釋。所述@Valid 還需要注釋來觸發(fā)嵌套屬性的驗證。

  • @Validated的原理本質(zhì)還是AOP。在方法校驗上,利用AOP動態(tài)攔截方法,利用JSR303 Validator實現(xiàn)完成校驗。在Bean的屬性校驗上,則是基于Bean的生命周期,在其初始化前后完成校驗
  • Spring Validator本質(zhì)實現(xiàn)還是JSR303 Validaotr,只是能讓其更好的適配Spring Context
  • @javax.validation.Valid是JSR303的核心標記注解,但是在Spring Framework中被@Validated取代,但是Spring Validator的實現(xiàn)可以支持兼容@javax.validation.Valid

例如,在MethodValidationPostProcessor提供了setValidatedAnnotationType方法,替換默認的@Validated

在Spring MVC中,RequestResponseBodyMethodProcessor對@RequestBody和@ResponseBody的校驗處理,就兼容了@javax.validation.Valid和@Validated

public class RequestResponseBodyMethodProcessor extends AbstractMessageConverterMethodProcessor {
    @Override
    protected void validateIfApplicable(WebDataBinder binder, MethodParameter parameter) {
        Annotation[] annotations = parameter.getParameterAnnotations();
        for (Annotation ann : annotations) {
            Validated validatedAnn = AnnotationUtils.getAnnotation(ann, Validated.class);
            if (validatedAnn != null || ann.annotationType().getSimpleName().startsWith("Valid")) {
                Object hints = (validatedAnn != null ? validatedAnn.value() : AnnotationUtils.getValue(ann));
                Object[] validationHints = (hints instanceof Object[] ? (Object[]) hints : new Object[] {hints});
                binder.validate(validationHints);
                break;
            }
        }
    }
}

參考鏈接:

https://www.baeldung.com/spring-valid-vs-validated

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/validation/annotation/Validated.html

https://docs.oracle.com/javaee/7/api/javax/validation/Valid.html

https://docs.jboss.org/hibernate/beanvalidation/spec/2.0/api/javax/validation/Validator.html

https://reflectoring.io/bean-validation-with-spring-boot/

https://jcp.org/en/jsr/detail?id=380

https://www.baeldung.com/javax-validation

到此這篇關(guān)于Java中Validated、Valid 、Validator區(qū)別詳解的文章就介紹到這了,更多相關(guān)Validated、Valid 、Validator區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot 自定義starter的示例代碼

    Spring Boot 自定義starter的示例代碼

    這篇文章主要介紹了Spring Boot 自定義starter的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • logback 實現(xiàn)給變量指定默認值

    logback 實現(xiàn)給變量指定默認值

    這篇文章主要介紹了logback 實現(xiàn)給變量指定默認值操作,具有很好的參考家價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java泛型與注解全面分析講解

    Java泛型與注解全面分析講解

    Java?泛型(generics)是?Jdk?5?中引入的一個新特性,?泛型提供了編譯時類型安全檢測機制,該機制允許程序員在編譯時檢測到非法的類型。Annotation(注解)是JDK1.5及以后版本引入的。它可以用于創(chuàng)建文檔,跟蹤代碼中的依賴性,甚至執(zhí)行基本編譯時檢查。需要的可以參考一下
    2022-08-08
  • Java數(shù)據(jù)庫連接池c3p0過程解析

    Java數(shù)據(jù)庫連接池c3p0過程解析

    這篇文章主要介紹了Java數(shù)據(jù)庫連接池c3p0過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • 使用idea開發(fā)Servlet詳細圖文教程

    使用idea開發(fā)Servlet詳細圖文教程

    這篇文章主要給大家介紹了關(guān)于使用idea開發(fā)Servlet的相關(guān)資料,將idea添加servlet的過程其實非常簡單,只需要按照以下幾個步驟即可完成,需要的朋友可以參考下
    2023-10-10
  • Java中將異步調(diào)用轉(zhuǎn)為同步的五種實現(xiàn)方法

    Java中將異步調(diào)用轉(zhuǎn)為同步的五種實現(xiàn)方法

    本文介紹了將異步調(diào)用轉(zhuǎn)為同步阻塞模式的五種方法:wait/notify、ReentrantLock+Condition、Future、CountDownLatch和CyclicBarrier,每種方法都有其適用場景和核心機制,可以根據(jù)具體需求選擇合適的方法,需要的朋友可以參考下
    2025-02-02
  • WebUploader實現(xiàn)圖片上傳功能

    WebUploader實現(xiàn)圖片上傳功能

    這篇文章主要為大家詳細介紹了WebUploader實現(xiàn)圖片上傳功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • Java那些鮮為人知的關(guān)鍵字volatile詳析

    Java那些鮮為人知的關(guān)鍵字volatile詳析

    這篇文章主要給大家介紹了關(guān)于Java那些鮮為人知的關(guān)鍵字volatile的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 使用@RequestBody傳遞多個不同對象方式

    使用@RequestBody傳遞多個不同對象方式

    這篇文章主要介紹了使用@RequestBody傳遞多個不同對象方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 關(guān)于ThreadLocal對request和response的用法說明

    關(guān)于ThreadLocal對request和response的用法說明

    這篇文章主要介紹了關(guān)于ThreadLocal對request和response的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08

最新評論

涞源县| 噶尔县| 民勤县| 桐乡市| 梅州市| 平顺县| 五原县| 青冈县| 麻栗坡县| 裕民县| 河东区| 布尔津县| 阜城县| 长宁县| 南皮县| 六盘水市| 庄浪县| 合水县| 金川县| 泸水县| 林甸县| 都安| 尚义县| 柘城县| 建平县| 通城县| 晋城| 依安县| 乐安县| 金乡县| 无锡市| 兰溪市| 定南县| 合肥市| 朔州市| 合江县| 古浪县| 嘉善县| 定州市| 保德县| 新蔡县|