百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

SpringMVC个人学习笔记(springmvc实例教程)

wxin55 2024-10-29 17:26 11 浏览 0 评论

springMVC 笔记

第一、二课

所需jar包,本次使用版本是spring3.2.3

Ps:spring的文件用上面的基本够了,但是整个过程可能需要很多的commons软件,如fileupload,io,lang包

SpringMVC demo案例

1、加入相关jar包

2、web.xml配置

<servlet>

<servlet-name>springMVC</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<!-- <init-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath*:*/springMVC-*.xml</param-value>

</init-param> -->

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>springMVC</servlet-name>

<url-pattern>/</url-pattern> 这里一定要写成这样,如果写成 /* 输入地址总是No mapping found for HTTP request with URI

</servlet-mapping>

Ps:springMVC 也有个默认的xml配置文件,类似struts2的struts.xml

该文件可以指定,即上面紫色注释掉部分。

默认路径是 /WEB-INF/springMVC-servlet.xml

3、springMVC-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<bean name="/helloword" class="com.wang.web.controller.HelloworldController"></bean>

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/"></property>

<property name="suffix" value=".jsp"></property>

</bean>

</beans>

4、编写controller

该controller类似struts2的action,编写的controller 要实现

org.springframework.web.servlet.mvc.Controller 接口

第三课

springMVC的传值

通过modelandview 传值

1、

@Override

public ModelAndView handleRequest(HttpServletRequest request,

HttpServletResponse response) throws Exception {

return new ModelAndView("/hello","result","this is the result!");

}

页面上直接EL表达式显示值

传递MAP

第四课

springMVC一个controller写多个方法

1、 Controller 类 继承 MultiActionController 类

public class MultiMethodController extends MultiActionController{

public ModelAndView add(HttpServletRequest request,HttpServletResponse response){

return new ModelAndView("/multiAdd");

}

2、 Xml配置文件

<!-- 配置单controller 多个方法 多请求处理控制器-->

<bean id="paramMethodResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">

<property name="paramName" value="method"></property> <!&mdash;这里的method url使用 -->

</bean>

<!--配置对应的controller -->

<bean name="/multiMethod" class="com.wang.web.controller.MultiMethodController">

<property name="methodNameResolver" ref="paramMethodResolver" />

</bean>

3、 URL路径

http://localhost:8080/springMVC/multiMethod?method=add

ps:controller 类中的方法都要是xxx(HttpServletRequest request,HttpServletResponse response)

第五课

SpringMVC静态文件访问

在现有的配置下 在jsp 文件中 <img src="xx/xx/xx.png" /> 无法显示图片

解决方法:

在 springMVC的xml配置文件中加上

<!-- 访问静态文件 -->

<mvc:resources location="/img/" mapping="/img/**"/>

以后所有的静态文件,如js,css,html,video等均可以放置在一个统一的文件夹下。可以配置多个

原因:springMVC 的DispatcherServlet 这个时候全部给过滤了。同时也把所有的静态文件给拦截了。

<servlet-mapping>

<servlet-name>springMVC</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/"></property>

<property name="suffix" value=".jsp"></property>

</bean>

所以本质上url

http://localhost:8080/springMVC/img/img.jpg

他会把img.jpg当成img.jpg.jsp

另一种解决方法:

<url-pattern>*.action</url-pattern>

第六课 (开始Annotation)

springMVC注解启用

spring xml 配置

<mvc:annotation-driven />

<context:component-scan base-package="com.wang" />

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>

(该类已经废弃了,使用下面的代替)

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/"></property>

<property name="suffix" value=".jsp"></property>

</bean>

<mvc:resources location="/framework/" mapping="/framework/**"/>

Ps:黄色部分是添加扫描和spring 的annotation所必须的。<mvc:annotation-driven />

要么使用 都是绿色背景的,要么使用灰色的,不要重复使用。

使用RequestMappingHandlerMapping,就要使用<mvc:annotation-driven /> 不然会报错

No adapter for handler [xx.xx.xx.XxController@dbb9b9]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler

2、controller

@Controller

public class UserController {

@RequestMapping(value={"/user/useradd"},method={RequestMethod.GET,RequestMethod.POST})

public ModelAndView insert(){

return new ModelAndView("/hello");

}

}

第七课

Annotation 配置的优化

1、原先的都是@RequestMapping(value={"/user/useradd"} ,该注解都是在方法上,该注解也可以放在类上

@Controller

@RequestMapping(value="/user")

public class UserController {

@RequestMapping(value={"/useradd"},method={RequestMethod.GET,RequestMethod.POST})

public ModelAndView add(){

return new ModelAndView("/hello","result","method----add");

}

@RequestMapping(value={"/userdel"},method={RequestMethod.GET,RequestMethod.POST})

public ModelAndView del(){

return new ModelAndView("/hello","result","method----del");

}

}

这样就是把相同的的路径给提取出来,在类上把根路径写好。原则就是该@RequestMapping 就是类名去掉后面的Controller,method 属性最好不用配置

2、不使用ModelAndView 作为方法的返回值

SpringMVC 的灵活强大之处的体现。

Controller 中方法如果需要request,就在方法中添加该参数;需要response 同样添加该参数;如果都需要,都添加

Pl:主要看例子方法的参数,任意个均可。

@Controller

@RequestMapping("/user2")

public class User2Controller {

@RequestMapping(value={"/useradd"},method={RequestMethod.GET,RequestMethod.POST})

public String add(HttpServletRequest request){

System.out.println(request.getServletPath());

return "/hello";

}

@RequestMapping(value={"/userdel"})

public String del(HttpServletResponse response){

System.out.println(response.getStatus());

return "/hello";

}

@RequestMapping(value={"/userupdate"})

public String update(HttpServletRequest request,HttpServletResponse response){

System.out.println(request.getServletPath());

System.out.println(response.getStatus());

request.setAttribute("result", "method----update");

return "/hello";

}

}

第八课

参数传递

Jboss as 7之后中文乱码的解决

1、jboss-eap-6.2\standalone\configuration\standalone.xml

在该文件 </extensions> 后添加

<system-properties>

<property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8"/>

<property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true"/>

</system-properties>

2、web.xml使用spring 的filter

<!-- 编码过滤器 -->

<filter>

<filter-name>encodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

<init-param>

<param-name>forceEncoding</param-name>

<param-value>true</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

第九、十课

SpringMVC和json结合传递数据

SpringMVC的 model 传值

1、model 类

public class User {

private String userName;

private String age;

private String userCode;

public String getUserCode() {

return userCode;

}

public void setUserCode(String userCode) {

this.userCode = userCode;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getAge() {

return age;

}

public void setAge(String age) {

this.age = age;

}

}

2、页面

姓名:<input type="text" name="userName" value="${userName}"> <Br/>

年龄:<input type="text" name="age" value="${age }"> <br/>

3、接收值的controller

@RequestMapping(value={"/useradd"})

public String add(HttpServletRequest request,User user,String username,String age){

return "/hello";

}

Ps:这里和struts2 有些区别

Sturs2 传值页面

<input type="text" name="user.userName" value="">

Action类用有个user 类即可

但是在springMVC中 还写成 实例名.属性 是获取不到值的

而且 springMVC中

public String add(HttpServletRequest request,User user,String username,String age)

user,username,age都有值

jQuery ajax 调用后台

$("#jsonbt").click(function(){

var userName = $("#userName").val();

var age = $("#age").val();

//alert(userName+" "+age);

var user = {userName:userName,age:age};

$.ajax({

url:"/springMVC/user2/useradd",

type:"get",

data:user,

success:function(data){

alert(data);

}

});

}

);

第十一、二课

SpringMVC文件上传

1、配置文件

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<property name="defaultEncoding" value="utf-8" />

<property name="maxUploadSize" value="10485760" />

<property name="maxInMemorySize" value="20480" /><!-- 是否使用缓存 -->

</bean>

2、jsp

<form id="fm" action="/springMVC/fileUpload/addfile" method="post" enctype="multipart/form-data">

<input type="file" name="myfile" value=""> &nbsp;&nbsp;&nbsp;<input type="button" id="submit1" value="提交" />

<input type="submit" value="submit">

</form>

Ps:不管是struts还是spring 文件上传都是采用

enctype="multipart/form-data"

3、controller

@Controller

@RequestMapping("/fileUpload")

public class FileUploadController {

@RequestMapping("/addfile")

public void addFile(@RequestParam("myfile") CommonsMultipartFile file){

System.out.println(file.getOriginalFilename());

System.out.println(file.getName());

System.out.println(file.getSize());

System.out.println(file.getStorageDescription());

System.out.println(file.getFileItem().isFormField());

System.out.println(file.getContentType());

}

}

Ps:

1、 如果不加@RequestParam("myfile")会报错。 myfile 是jsp页面上 name="myfile"

2、 CommonsMultipartFile是MultipartFile子类,所以该处也能换成 MultipartFile

CommonsMultipartFile 获取的部分数据如下:

另一种上传的方法:

使用CommonsMultipartResolver ,MultipartRequest,MultipartFile

@RequestMapping("/addfile2")

public void addFile(HttpServletRequest request,HttpServletResponse response){

CommonsMultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());

if(resolver.isMultipart(request)){ // 如果上传的东西有值,则为真

MultipartRequest mprequest = (MultipartRequest)request;

MultipartFile mlfile = mprequest.getFile("myfile");

System.out.println(mlfile.getOriginalFilename());

try {

mlfile.transferTo(new File(""));

} catch (IllegalStateException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

//do something ...

}

}

第十三、四课

Springmvc和spring的集成

Web.xml中启动顺序

listener&mdash;>filter-->servlet

第十五课

Spring 和springMVC context

//spring context 指拿到applicationContext.xml内容

WebApplicationContext wc1 = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());

//springMVC context 指拿到springMVC-servlet.xml内容

WebApplicationContext wc2 = RequestContextUtils.getWebApplicationContext(request);

Springmvc 的context 继承了 spring的context

第十六课

Spring拦截器

Spring为我们提供了:

org.springframework.web.servlet.HandlerInterceptor接口,

org.springframework.web.servlet.handler.HandlerInterceptorAdapter适配器类,

实现这个接口或继承此类,可以非常方便的实现自己的拦截器。

有以下三个方法:

Controller之前执行:

public boolean preHandle(HttpServletRequest request,

HttpServletResponse response, Object handler) throws Exception

生成视图之前执行

public void postHandle(HttpServletRequest request,

HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception;

最后执行,可用于释放资源

public void afterCompletion(HttpServletRequest request,

HttpServletResponse response, Object handler, Exception ex) throws Exception

分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)

Ps:在preHandle中,可以进行编码、安全控制等处理;

在postHandle中,有机会修改ModelAndView;

在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。

参数中的Object handler是下一个拦截器。

实现接口的方法

public class MyInterceptor implements HandlerInterceptor{

/**方法中的Object handler 指下一个interceptor*/

@Override

public boolean preHandle(HttpServletRequest request,

HttpServletResponse response, Object handler) throws Exception {

return false;

}

@Override

public void postHandle(HttpServletRequest request,

HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception {

}

@Override

public void afterCompletion(HttpServletRequest request,

HttpServletResponse response, Object handler, Exception ex)

throws Exception {

}

}

继承类的方法

继承HandlerInterceptorAdapter(参考源码) ,该类的所有方法都是空实现。根据自己的需要重写方法。

如何使用拦截器?

Spring MVC并没有总的拦截器,不能对所有的请求进行前后拦截。

Spring MVC的拦截器,是属于HandlerMapping级别的,可以有多个HandlerMapping ,每个HandlerMapping可以有自己的拦截器。

当一个请求按Order值从小到大,顺序执行HandlerMapping接口的实现类时,哪一个先有返回,那就可以结束了,后面的HandlerMapping就不走了,本道工序就完成了。就转到下一道工序了。

拦截器会在什么时候执行呢? 一个请求交给一个HandlerMapping时,这个HandlerMapping先找有没有处理器来处理这个请求,如何找到了,就执行拦截器,执行完拦截后,交给目标处理器。

如果没有找到处理器,那么这个拦截器就不会被执行。

在spring MVC的配置文件中配置有三种方法:

1、(近似)总拦截器,拦截所有url(常用)

<mvc:interceptors>

<bean class="com.wang.web.controller.MyInterceptor" />

</mvc:interceptors>

为什么叫"近似",前面说了,Spring没有总的拦截器。

<mvc:interceptors/>会为每一个HandlerMapping,注入一个拦截器。总有一个HandlerMapping是可以找到处理器的,最多也只找到一个处理器,所以这个拦截器总会被执行的。起到了总拦截器的作用。

如果是REST风格的URL,静态资源也会被拦截。

2、 (近似) 总拦截器, 拦截匹配的URL(常用)

<mvc:interceptors >

<mvc:interceptor>

<mvc:mapping path="/user/*" /> <!-- /user/* -->

<bean class="com.mvc.MyInteceptor"></bean>

</mvc:interceptor>

</mvc:interceptors>

就是比 方案一多了一个URL匹配。

如果是REST风格的URL,静态资源也会被拦截。

3、HandlerMappint上的拦截器,注入类中(少用)

如果是REST风格的URL,静态资源就不会被拦截。因为我们精准的注入了拦截器。

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">

<property name="interceptors">

<list>

<bean class="com.mvc.MyInteceptor"></bean>

</list>

</property>

</bean>

在 DefaultAnnotationHandlerMapping没有被废弃前出现问题:

如果使用了<mvc:annotation-driven />,它会自动注册DefaultAnnotationHandlerMapping 与AnnotationMethodHandlerAdapter 这两个bean,所以就没有机会再给它注入interceptors属性,就无法指定拦截器

当然我们可以通过人工配置上面的两个Bean,不使用 <mvc:annotation-driven />,就可以 给interceptors属性 注入拦截器了。

使用 <mvc:annotation-driven />,而建议手动写详细的配置文件,来替代 <mvc:annotation-driven />,这就控制力就强了。

Ps:

1、使用

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>

不使用<mvc:annotation-driven /> 能正常访问Controller,上面3中使用拦截器的方法都可以用, 但是在spring3.2.3中DefaultAnnotationHandlerMapping已经废弃了,而是改用RequestMappingHandlerMapping

2、使用

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />

使用该类,就必须使用<mvc:annotation-driven /> 不然会报错

javax.servlet.ServletException: No adapter for handler [public org.springframework.web.servlet.ModelAndView com.wang.web.controller.UserController.add()]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler

那拦截器的使用只能用前2中方法。

建议使用后者:

springMVCAnnotation-servlet.xml 文件

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:component-scan base-package="com.wang" />

<mvc:annotation-driven />

<!-- 定义拦截器 -->

<mvc:interceptors>

<bean class="com.wang.web.controller.MyInterceptor2"></bean>

<bean class="com.wang.web.controller.MyInterceptor"></bean>

</mvc:interceptors>

<!-- 过滤静态文件,不然显示不出来 -->

<mvc:resources location="/framework/" mapping="/framework/**"/>

<!-- annotation 使用 -->

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />

<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/"></property>

<property name="suffix" value=".jsp"></property>

</bean>

<!-- 文件上传 -->

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<property name="defaultEncoding" value="utf-8" />

<property name="maxUploadSize" value="10485760" />

<!-- 是否使用缓存 -->

<property name="maxInMemorySize" value="20480" />

</bean>

</beans>

另外一种,仅供了解

springMVCAnnotation-servlet-old.xml (部分)

<beans>

<context:component-scan base-package="com.wang" />

<!&mdash;这里 没有 <mvc:annotation-driven />-->

<!-- 定义拦截器 -->

<!-- <mvc:interceptors>

<bean class="com.wang.web.controller.MyInterceptor2"></bean>

<bean class="com.wang.web.controller.MyInterceptor"></bean>

</mvc:interceptors> -->

<!-- annotation 使用 -->

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">

<property name="interceptors">

<list>

<bean class="com.wang.web.controller.MyInterceptor2" />

<bean class="com.wang.web.controller.MyInterceptor" />

</list>

</property>

</bean>

</beans>

第十七课

I18N

浏览器级别的国际化

1、springMVCAnnotation-servlet.xml 配置

<!-- 资源文件绑定器 -->

<bean id="messageSource"

class="org.springframework.context.support.ResourceBundleMessageSource">

<property name="basename" value="i18n.resource" /> <!--//这里定义资源文件的的路径,分隔符可以是 "."或者"/" ,跟struts2是一样的。默认是在classpath下。I18n 是路径,resource 是资源文件前缀名-->

<property name="useCodeAsDefaultMessage" value="true" />

</bean>

2、jsp页面调用

Jsp页面使用JSTL 的<fmt:message />标签 获取。

使用fmt 需要引入jstl jar包

<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<fmt:message key="common.word" />

也可以使用springMVC 标签

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>

<spring:message code="common.word" />

Ps:fmt 补充

fmt bundle标签、message标签

作用:加载指定的.properties文件,并获取指定的属性。

<fmt:bundle basename="i18n/resource_en_US">

<fmt:message key="common.running"></fmt:message>

</fmt:bundle>

带前缀的

<fmt:bundle basename="i18n/resource_en_US" prefix="common.">

<fmt:message key="running"></fmt:message>

</fmt:bundle>

Java Controller中使用资源文件

//spring context 指拿到applicationContext.xml内容

WebApplicationContext wc1 = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());

//springMVC context 指拿到springMVC-servlet.xml内容

WebApplicationContext wc2 = RequestContextUtils.getWebApplicationContext(request);

MessageSource resources = new ClassPathXmlApplicationContext("springMVC/springMVCAnnotation-servlet.xml");

String message = resources.getMessage("common.word", null, "Default", Locale.US);

System.out.println(message);

System.out.println(wc2.getMessage("common.word", null,

Locale.SIMPLIFIED_CHINESE));

继承extends MultiActionController

WebApplicationContext wc3 = this.getWebApplicationContext();

System.out.println(wc3.getMessage("common.word", null,

Locale.SIMPLIFIED_CHINESE));

该方法是参考struts2 继承 actionSupport 想到的

相关推荐

ES6中 Promise的使用场景?(es6promise用法例子)

一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...

JavaScript 对 Promise 并发的处理方法

Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...

Promise的九大方法(promise的实例方法)

1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...

360前端一面~面试题解析(360前端开发面试题)

1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...

前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?

Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...

最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式

看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...

前端分享-Promise可以中途取消啦(promise可以取消吗)

传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...

手写 Promise(手写输入法 中文)

前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...

什么是 Promise.allSettled()!新手老手都要会?

Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...

前端面试-关于Promise解析与高频面试题示范

Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...

宇宙厂:为什么前端离不开 Promise.withResolvers() ?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...

Promise 新增了一个超实用的 API!

在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...

一次搞懂 Promise 异步处理(promise 异步顺序执行)

PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...

Promise 核心机制详解(promise机制的实现原理)

一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...

javascript——Promise(js实现promise)

1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...

取消回复欢迎 发表评论: