SpringMVC基础概述

目录

        • MVC核心组件
        • @RequestMapping注解
        • 域对象共享数据
        • 视图
        • RESTful
        • 请求与响应
          • HttpMessageConverter
          • 请求
          • 响应
        • 拦截器配置
        • 异常处理
          • 基于配置的异常处理
          • 基于注解的异常处理
        • 配置类与注解配置
        • MVC执行流程

Spring MVC是Spring Framework提供的Web组件,全称是Spring Web MVC,是目前主流的实现MVC设计模式的框架,提供前端路由映射、视图解析等功能。

MVC是一种软件架构思想,把软件按照模型,视图,控制器来划分

View:视图层,指工程中的html,jsp等页面,作用是和用户进行交互,展示数据。
Controler:控制层,指工程中的Servlet,作用是接收请求和响应浏览器,调用业务逻辑。
Model:模型层,指工程中的JavaBean,进行数据交互,用来处理数据。

JavaBean分成两类:

一实体类Bean:专门用来存储业务数据的实体类。
一业务处理Bean: 指Servlet或Dao对象,专门用来处理业务逻辑和数据访问。

服务端三层架构

表现层 业务逻辑层 数据访问层

Spring MVC Spring MyBatis

MVC核心组件

DispatcherServlet:前置控制器,负责调度其他组件的执行,可以降低不同组件之间的耦合性。
Handler:处理器,完成具体的业务逻辑,相当于Servlet。
HandlerMapping:DispatcherServlet是通过 HandlerMapping把请求映射到不同的Handler。
HandlerInterceptor:处理器拦截器,如果我们需要进行一些拦截处理,可以通过实现该接口完成。
HandlerExecutionChain:处理器执行链。
HandlerAdapter:处理器适配器,Handler执行业务方法之前,需要进行一系列的操作包括数据类型转换、把表单数据封装等,这些一系列的操作都是由HandlerAdapter完成,DispatcherServlet通过HandlerAdapter执行不同的Handler。
ModelAndView:封装了模型数据和视图信息,作为Handler的处理结果,返回给DispatcherServlet。
ViewResolver:视图解析器,DispatcherServlet通过它把逻辑视图解析为物理视图,最终把渲染的结果响应给客户端

mvc响应流程

客户端请求被DispatcherServlet接收,根据HandlerMapping映射到Handler,生成Handler和HandlerInterceptor,Handler和HandlerInterceptor以HandlerExecutionChain的形式一并返回给DispatcherServlet,DispatcherServlet通过HandlerAdapter调用Handler的方法完成业务逻辑处理,返回一个ModelAndView对象给DispatcherServlet,DispatcherServlet把获取的ModelAndView对象传给ViewResolver视图解析器,把逻辑视图解析成物理视图。ViewResolver返回一个View,把模型填充到视图中,DispatcherServlet把渲染后的视图响应给客户端。

@RequestMapping注解

底层是@Maping注解,作用在类、接口和方法上,主要属性有name、value、method和params,其他属性如下。

String name() default "";
//path,和value一样
@AliasFor("path")
String[] value() default {};
//value,一个字符串数组
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};

value属性必须配置,当有多个时能够匹配多个请求。支持ant风格路径,?表示匹配任意单个字符(不为空、?和斜线),*表示匹配任意的0或多个字符(不为?和斜线),**表示匹配任意一层或多层目录或路径(0层也匹配),必须为/**/test,左右不添任何字符。

@RequestMapping("/a?c/test")
public String test(){return "test";
}
//?,<a th:href="@{/abc/test}"></a>
//*,<a th:href="@{/ac/test}"></a>
//**,<a th:href="@{/test}"></a>

Spring MVC支持路径中的占位符,原始方式:/test?id=1,Rest风格:/test/1

@RequestMapping("/test/{id}")
public String test(@PathVariable("id")Integer Id){System.out.println("id="+ID);return "test";
}
//<a th:href="@{/test/1}"></a>

好处是可以在路径中传入参数。

method属性可以通过请求方式匹配请求,比如get(参数放请求头、无请求体、速度快)、post(安全、参数放请求体,传数据量大),没有配置则匹配任意方式请求,不支持的请求方式浏览器报405。

@RequestMapping(value={"/user","/admin"},method={RequestMethod.get,RequestMethod.post})

派生注解GetMapping@PostMapping@DeleteMapping@PutMapping对应不同的请求方式。

而目前浏览器只支持get、post两种请求方式,其他请求方式默认通过get请求,设置hidden隐藏域完成。这一点在spring boot原理解析有讲。

<form action="/user" method="post"><input name="_method" type="hidden" value="delete"/><input type="submit" value="delete提交"/>
</form>

SpringBoot中手动开启。

spring:mvc:hiddenmethod:filter:enabled: true   #开启页面表单的Rest功能

设置自定义的methodFilter,编写webconfig配置类,创建filter对象,调用HiddenHttpMethodFilter的setMethodParam方法。

params属性同样也是一个数组,参数设置为多个时请求参数必须全部满足才能匹配并执行方法,不满足则报400错误。

@RequestMapping(value={"/user","/admin"},params={"username=admin","pass"})
//<a th:href="@{/admin(username='admin',pass=123456)}"></a>	
//<a th:href="@{/admin?username=admin&pass=123456}"></a>	

也可以不用params属性获取参数,只要方法中的形参与请求中的参数名保持一致,便能获取参数值。

其他方式获取请求参数:

(1)ServletAPI获取请求参数:

@RequestMapping("/test")
public String test(HttpServletRequest r){String username = r.getParameter("username");String password = r.getParameter("pass");System.out.println(username+":"+password);return "test";
}
//<a th:href="@{/admin?username=admin&pass=123456}"></a>	

(2)springMVC获取多个请求参数

hobby为一个参数数组或集合,若请求参数中出现多个同名的参数,可以在方法中设置形参为字符串类型或字符串数组接收参数,若为字符串则参数值用逗号拼接。

@RequestMapping("/test")
public String test(String username,String password,String hobby){System.out.println(username+";"+password+";"+hobby);return "test";
}

(3) 通过@RequestParam注解

@RequestParam将建立请求参数与控制器方法中的形参之间的映射关系,含有属性value(请求参数),布尔属性required,默认true,必须传入该请求参数。默认值defaultValue属性,为该参数设置一个默认值。

@RequestMapping("/test")
public String test(@RequestParam("user_name")String username,String password,String[] hobby){System.out.println(username+";"+password+";"+Arrays.toString(hobby));return "test";
}

(4)通过实体类对象接收请求参数

这种方式要求实体类的对象属性与请求参数对应并一致,名字必须相同。

@RequestMapping("/test")
public String test(User user){System.out.println(user);return "test";
}

Headers属性同样也是一个数组,设置header请求头参数信息,比如Accept、Host、User-Agent等,不符合Header参数则浏览器报404错误。

@RequestMapping(value={"/user","/admin"},header={"Host=localhost:8080"})

@RequestHeader注解建立请求头与方法中形参之间的映射,他与@RequestParam一样具有相同的属性。

@CookieValue注解将Cookie数据与控制器方法的形参建立映射关系,属性与上述一样,用法也一样。

CharacterEncodingFilter处理请求参数乱码问题:

 <!--web.xml中配置过滤器-->
<filter><filter-name>encoding</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>
域对象共享数据

域对象:request、session、applicationcontext

(1)通过Servlet在request共享数据

@RequestMapping("/test")
public String test(HttpServletRequest r){//name=valuer.setAttribute("testScope","helloworld");return "test";
}
//获取<a th:text="${testScope}"/>

(2)通过ModelAndView向request共享数据

@RequestMapping("/test")
public ModelAndView test(){ModelAndView mav = new ModelAndView();mav.addObject("testScope","helloworld");mav.setViewName("test");return mav;
}
//获取<a th:text="${testScope}"/>

(3)通过Model向request共享数据

@RequestMapping("/test")
public String test(Model model){model.addAttribute("testScope","helloworld")return "test";
}
//获取<a th:text="${testScope}"/>

(4)通过Map向request共享数据

@RequestMapping("/test")
public String test(Map<String,Object> map){map.put("testScope","helloworld")return "test";
}
//获取<a th:text="${testScope}"/>

(5)通过ModelMap向request共享数据

@RequestMapping("/test")
public String test(ModelMap modelMap){modelMap.addAttribute("testScope","helloworld")return "test";
}

不管使用何种方式共享数据,返回页面,最终将通过DispatcherServlet封装在一个ModelAndView中,并通过视图解析器解析。

向session中共享数据:

@RequestMapping("/test")
public String test(HttpSession httpSession){//name=valuehttpSession.setAttribute("testScope","helloworld");return "test";
}
//获取<a th:text="${session.testScope}"/>

向application中共享数据:

@RequestMapping("/test")
public String test(HttpSession httpSession){//request也可以获取applicationServletContext application = httpSession.getServletContext();application.setAttribute("testScope","helloworld");return "test";
}
//获取<a th:text="${application.testScope}"/>
视图

springMVC的视图是View接口,用于渲染数据,把model中的数据放入view中展示。默认视图种类有重定向Redirect和转发Forward。当控制器中的视图名称无任何前缀,此时视图会被配置的视图解析器解析,最终通过转发出去,比如ThymeleafResolver。

@RequestMapping("/test")
public String test(){return "test";
}

转发视图InternalResourceViewResolver:

@RequestMapping("/test")
public String test(){return "forward:/test2";
}
@RequestMapping("/test2")
public String test(){return "test";
}

重定向视图RedirectViewResolver:

此时视图名不会被配置的视图解析器解析,而是创建一个重定向视图解析器,去掉redirect:重定向到另一个请求。

@RequestMapping("/test")
public String test(){return "redirect:/test2";
}

使用视图控制器view-controller

在类路径下SpringMVC.xml配置文件中使用view-controller标签,配置请求路径与视图名称的对应关系。

<?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:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><context:component-scan base-package="com.example.mvc.controller"/><bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="order" value="1" /><property name="characterEncoding" value="UTF-8" /><property name="templateEngine"><bean class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><property name="prefix" value="/WEB-INF/templates/" /><property name="suffix" value=".html" /><property name="templateMode" value="HTML5" /><property name="characterEncoding" value="UTF-8" /></bean></property></bean></property></bean><mvc:view-controller path="/" view-name="index"></mvc:view-controller>
</beans>

如果既使用了视图控制器,又使用了控制器方法,需要开启注解。

<mvc:annotation-driven></mvc:annotation-driven>

开启对静态资源的访问:

<mvc:default-servlet-handler/>
RESTful

REST: Representational State Transfer表现层资源状态转移。

特点:

1)不同的请求方式对应不同的控制器处理方法,get,post,delete,put

2)请求参数融入URL中成为一个完整URL,/user/1,而不是用问号开头

3)虽然请求方式不同,但请求地址的路径大致相同,比如以同样的开头/user,/user/{id}

由于浏览器普通只支持get和post请求,所以这里只介绍通过表单隐藏域方式实现put和delete请求处理。

上述条件:请求方式为post(Ajax除外);请求参数中有_method,用于替换请求方式,type为hidden隐藏。

(1)delete删除请求

@DeleteMapping("/user/{id}")
public String deleteUserById(@PathVariable("id")Integer Id){System.out.println("删除用户id="+ID+"的用户");return "redirect:/user";
}

删除用户:

<a th:href="@{/user/}+${user.id}">删除</a><a th:href="@{'/user/'+${user.id} }">删除</a>

(1)put修改请求

put请求处理

@PutMapping("/user/{id}")
public String updateUserById(@PathVariable("id")Integer Id){System.out.println("修改用户id="+ID+"的用户");return "redirect:/user";
}

修改用户表单:

<form action="/user" method="post"><input name="_method" type="hidden" value="PUT"/><input name="id" type="hidden" th:value="${user.id}"/>用户名:<input type="text" value="username"/>密码:<input type="password" value="password"/><input type="submit" value="修改"/>
</form>
请求与响应
HttpMessageConverter

http消息转换器,将请求报文信息转换为java对象,或将java对象转换为响应报文。它提供了两个注解和两个类型:@RequestBody@ResponseBodyRequestEntityResponseEntity

请求

1)@RequestBody

获取请求体,需要在控制器方法中设置形参,并用该注解标识。

@RequestMapping("/test")
public String test(@RequestBody String requestBody){System.out.println("RequestBody="+requestBody);return "test";
}

2)RequestEntity

封装请求报文的java类型,在控制器方法中的参数前设置,可以获取请求头、请求体等信息。

@RequestMapping("/test")
public String test(RequestEntity<String> requestEntity){System.out.println("请求头:"+requestEntity.getHeaders());System.out.println("请求体:"+requestEntity.getBody());return "test";
}
响应

使用HttpServletResponse实现响应数据:

@RequestMapping("/test")
public String test(HttpServletResponse response) throws IOException{//将helloworld作为响应体返回response.getWriter().print("helloworld");
}

3)@ResponseBody

在控制器方法上标识,将该方法的返回值作为响应报文的响应体返回给浏览器。

@RequestMapping("/test")
@ResponseBody
public String test(RequestEntity<String> requestEntity){String test = "abc";return test;
}

@ResponseBody处理json对象:

springboot自动配置了默认的jackson依赖,只需要在核心配置文件中进行配置

spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: Asia/Shanghai

如何使用springMVC则需要导入依赖,在springmvc的核心配置文件中配置注解驱动,在处理器方法上使用@ResponseBody注解标识,并将Java对象作为方法返回值返回,就会自动转换为json格式的字符串。

@RestController注解

@RestController是一个复合注解,标识在类上,相当于为类添加@Controller注解,为类中的所有方法添加@ResponseBody注解。

4)ResponseEntity

将该类型的数据作为控制器方法的返回值,该返回值就是响应报文,即可以自定义响应报文。

MultiValueMap<String,String> headers = new HttpHeaders();
headers.add("Content-Disposition","attchment;filename=xx.jpg");
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes,headers,statuscode) ;

使用ResponseEntity文件下载:使用ServletContext获取下载文件真实路径并创建输入流对象,创建字节数组,输入流读入字节数组,创建响应头对象HttpHeaders和状态码HttpStatus,设置下载方式和文件名,最后根据响应头、状态码、读入流创建ResponseEntity对象并返回。

文件上传:控制器方法接收MultipartFile类型的文件数据,先通过session获得ServletContext对象,查看文件名是否在对应路径中存在,若存在使用UUID作为文件名拼接文件名后缀上传,若文件不存在创建文件上传路径,MultipartFile上传对象调用tranferTo方法上传即可。

<form th:action="@{/fileupload}" method="post" enctype="multipart/formdata">文件:<input type="file" value="photo"/><input type="submit" value="上传"/>
</form>
拦截器配置

SpringMVC中拦截器用于拦截控制器方法,拦截器必须实现HandlerInterceptor接口(ctrl±o)重写preHandle方法或者继承HandlerInterceptorAdapter类。拦截器在配置文件或配置类中配置,config配置类须实现WebMvcConfigurer 的配置接口,重写addInterceptor方法,注册拦截器。

public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//获取sessionHttpSession httpSession = request.getSession();if(httpSession.getAttribute("loginUser")==null){response.sendRedirect("/f/toLogin");return false;//拦截}//放行return true;}
}

拦截器配置:

<mvc:interception><mvc:mapping path="/**"/><mvc:exclude-mapping path="/login"/><ref bean="LoginInterceptor" />
</mvc:interception>

三个抽象方法:

preHandle执行控制器方法前执行该方法,postHandle执行控制器方法后执行该方法,afterComplation渲染视图后执行该方法。

多个拦截器执行顺序:与配置的先后顺序或@Order注解的优先级顺序有关,执行流程具体如下。

先顺序执行所有拦截器的preHandle方法

  • 如果当前拦截器prehandler返回为true,则执行下一个拦截器的preHandle。
  • 如果当前拦截器返回为false,直接倒序执行所有已经成功执行(返回true)的拦截器的afterCompletion。

如果任何一个拦截器返回false,直接跳出不执行目标方法,postHandle都不会执行,倒序执行所有已经成功执行(返回true)的拦截器的afterCompletion方法。当所有拦截器preHandle都返回True,执行目标方法,倒序执行所有拦截器的postHandle方法。前面的步骤有任何异常都会直接倒序触发afterCompletion。页面成功渲染完成以后,也会倒序触发 afterCompletion。

异常处理

对于控制器方法执行所出现的异常,SpingMVC提供了HandlerExceptionResolver接口,其实现类有默认异常处理解析器DefaultHandlerExceptionResolver和自定义的SimpleMappingExceptionResolver简单映射异常处理解析器。

基于配置的异常处理

Spring MVC配置文件:

  • properties的键表示处理器方法执行过程中出现的异常
  • properties的值表示若出现指定异常时,设置一个新的视图名称,跳转到指定页面
  • exceptionAttribute属性设置一个属性名,将出现的异常信息在请求域中进行共享
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"><!--设置异常映射,算术运算异常:例如1/0,跳转到error.html--><props><prop key="java.lang.ArithmeticException">error</prop></props></property><!--设置在请求域中共享的异常属性信息,th:text="${e}"--><property name="exceptionAttribute" value="e"/>
</bean>
基于注解的异常处理

@ControllerAdvice:将当前类标识为异常处理的组件,对控制器Controller的增强,可对 controller中被 @RequestMapping注解的方法加一些逻辑处理。

@ExceptionHandler:用于设置所标识的方法处理的异常,@ExceptionHandler加在ControllerAdvice中,处理全局异常。@ExceptionHandler的value值可以是数组,可以添加许多可能出现的异常,在该方法中当出现算数运算异常或空指针异常就会跳转到设置的异常页面,并且展示异常信息。

@ControllerAdvice
public class ExceptionController {@ExceptionHandler(value = {ArithmeticException.class,NullPointerException.class})public String exception(Exception e, Model model){model.addAttribute("e",e);return "error";}
}
//<p th:text="${e}"/>
配置类与注解配置

在配置中,使用@Configuration注解标识配置类,使用 @EnableWebMvc 注解来启用MVC配置,使用@ComponentScan开启组件扫描。

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {//拦截器配置@Overridepublic void addInterceptors(InterceptorRegistry registry){registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/","/login.html","/f/toLogin","/user/login","/img/*","/layui/**");}//文件上传解析器@Beanpublic MultipartResolver multipartResolver(){CommonsMultipartResolver cmr = new CommonsMultipartResolver();return cmr;}//异常处理@Overridepublic void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers){SimpleMappingExceptionResolver eResolver = new SimpleMappingExceptionResolver();Properties prop = new Properties();prop.setProperty("java.lang.ArithmeticException","errpr");eResolver.setExceptionMapping(prop);eResolver.setExceptionAttribute("e");resolvers.add(eResolver);}}

其他组件配置如请求媒体内容协商器配置ContentNegotiationConfigurer、信息转换器配置configureMessageConverters、视图控制器addViewControllersconfigureViewResolvers视图解析器、addResourceHandlers静态资源、configureDefaultServletHandling请求处理,可以参考以下文章:webconfig配置 Spring MVC 配置详解 WebMvcConfigurer

MVC执行流程

DispatcherServlet.doService()->DispatcherServlet.doDispatch()

继承FrameworkServlet.service()–>super.service()->doGet()…

​ >processRequest()->抽象doService()

1)前端控制器DispatcherServlet捕获请求,解析请求URL得到URI,判断URI对应映射,若没有相应的映射处理则交给default-servlet-handler处理,访问静态资源,没有找到同样返回404。

2)若找到了对应的映射,则寻找到合适的Handler、HandlerAdapter、相应拦截器链。

3)执行拦截器preHandler,进入一个异常处理流程,preHandle执行成功将执行Handle控制器方法。

4)Handler执行完后返回一个ModelAndView对象。

5)倒序执行拦截器postHandle和afterCompeletion方法。

6)根据ModelAndView对象,选择合适的ViewResolver进行视图解析渲染视图,如有异常,异常处理解析器HandlerExceptionResolver会处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/712077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ConcurrentHashMap的演进:从Java 8之前到Java 17的实现原理深度剖析

目录 一、引言二、Java 8之前的ConcurrentHashMap1、内部结构与初始化2、Segment类3、并发控制4、扩容与重哈希5、总结 三、Java 8中的ConcurrentHashMap1、数据结构2、并发控制2.1. CAS操作2.2. synchronized同步块 3、哈希计算与定位4、扩容与重哈希5、总结 四、Java 17中的C…

广汽埃安工厂:蔚来汽车的造车工厂有哪些?

具体来说&#xff0c;理想汽车目前在常州仅有一家汽车制造工厂。 一期项目于2017年12月竣工&#xff0c;2019年12月投产&#xff0c;年产能10万辆/年。 同时&#xff0c;正在规划二期工程。 产能将增至20万辆/年。 此外&#xff0c;理想还计划接管现代汽车在北京顺义的第一家工…

抖音小店怎么开店注册?别在全网找教程了,2024年最新开店教程来了

大家好&#xff0c;我是电商糖果 想开一家抖音小店&#xff0c;不会开&#xff0c;也不懂需要准备哪些材料。 在网上扒拉了一堆教程&#xff0c;不知道应该听哪个&#xff1f; 害怕店铺开错了&#xff0c;后续还要关店。 有这些担心的朋友&#xff0c;看到这篇文章的时候&a…

工业现场网络性能评估方案

最近要去一个工厂排查网络和电脑卡顿的问题,为此&#xff0c;我准备了以下的方案&#xff0c;在现场以抓包和网络监控的方式来排查。 1.评估流程 为了评估Linux系统的网络负荷&#xff0c;并使用tcpdump来捕获数据包进行分析&#xff0c;您需要遵循以下几个步骤&#xff1a; …

自动化搭建---环境搭建与配置

1. 确定所需环境 与项目团队和开发人员详细沟通&#xff0c;了解项目的具体环境需求。这可能包括操作系统版本、数据库类型&#xff08;如MySQL、PostgreSQL等&#xff09;、Web服务器&#xff08;如Apache、Nginx等&#xff09;以及其他依赖软件。 2. 安装操作系统 根据项目…

数据仓库与数据挖掘概述

目录 一、数据仓库概述 &#xff08;一&#xff09;从传统数据库到数据仓库 &#xff08;二&#xff09;数据仓库的4个特征 &#xff08;三&#xff09;数据仓库系统 &#xff08;四&#xff09;数据仓库系统体系结构 &#xff08;五&#xff09;数据仓库数据的粒度与组织…

论文阅读_代码生成模型_CodeGeeX

英文名称: CodeGeeX: A Pre-Trained Model for Code Generation with Multilingual Evaluations on HumanEval-X 中文名称: CodeGeeX&#xff1a;一种用于代码生成的预训练模型&#xff0c;并在HumanEval-X上进行多语言评估 链接: https://arxiv.org/abs/2303.17568 代码: http…

无处不在的智慧:嵌入式系统引领智能生活

无处不在的智慧&#xff1a;嵌入式系统引领智能生活 嵌入式系统作为智能生活的重要组成部分&#xff0c;正逐渐渗透到我们的日常生活中&#xff0c;引领着智能生活的发展。以下将从多个方面对嵌入式系统在智能生活中的引领作用进行详细论述。 智能家居中的嵌入式系统应用 嵌…

训练1 : 老头

以前用blender做的特效 总结 头发很费时间, 需要参考和练习眼窝周边结构还有些待准确把握从光与影中揣摩轮廓形状 从少量面掌握大体, 从多数面雕刻细节

terminal下环境不统一导致的程序报错(powersell改cmd)

1.报错现象 在terminal下利用命令行执行代码显示运行环境缺包&#xff1a; 但将命令中的参数写入参数文件&#xff0c;运行train.py时&#xff0c;程序可以正常运行&#xff1a; 直接运行train.py:程序可用&#xff1a; 2.原因分析 参考文章 控制台环境和项目环境不一致问…

【Mysql】InnoDB 中 B+ 树索引的注意事项

一、根页面万年不动 在之前的文章里&#xff0c;为了方便理解&#xff0c;都是先画存储用户记录的叶子节点&#xff0c;然后再画出存储目录项记录的内节点。 但实际上 B 树的行成过程是这样的&#xff1a; 每当为某个表创建一个 B 树索引&#xff0c;都会为这个索引创建一个根…

C++高级面试题:请解释 C++ 中的标准模板库(STL)及其常见组件

请解释 C 中的标准模板库&#xff08;STL&#xff09;及其常见组件 C 标准模板库&#xff08;Standard Template Library&#xff0c;STL&#xff09;是 C 标准库的一部分&#xff0c;提供了丰富的通用数据结构和算法实现&#xff0c;以及许多与数据处理相关的工具。STL 中的组…

循环队列的实现

文章目录 循环队列的概念循环队列的实现循环队列的判空和判满链表or数组 循环队列的概念 设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓…

快速下载Huggingface的大语言模型

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Huggingface是什么&#xff1f;二、基于官方huggingface-cli下载&#xff08;基础&#xff0c;断线风险&#xff09;1.安装hf下载环境2.配置环境变量3.注册…

CSAPP-信息的表示和处理

文章目录 概念扫盲思想理解经典好图安全事件 概念扫盲 1.大端高位在前&#xff0c;小端低位在前 2.逻辑运算符&#xff08;&& 、||、&#xff01;&#xff09;与位级运算&#xff08;&、|、~&#xff09;的差异 3.宏可以保证无论代码如何编译&#xff0c;都能生成…

flutterandroidx支持,【工作经验分享】

基于Linux的pc启动过程 我们都知道&#xff0c;所有的程序软件包括操作系统都是运行在内存中的&#xff0c;然而我们的操作系统一般是存放在硬盘上的&#xff0c;当我们按下开机键的时候&#xff0c;此时内存中什么程序也没有&#xff0c;因此需要借助某种方式&#xff0c;将操…

百度SEO工具,自动更新网站的工具

在网站SEO的过程中&#xff0c;不断更新网站内容是提升排名和吸引流量的关键之一。而对于大多数网站管理员来说&#xff0c;频繁手动更新文章并进行SEO优化可能会是一项繁琐且耗时的任务。针对这一问题&#xff0c;百度自动更新文章SEO工具应运而生&#xff0c;它能够帮助网站管…

搭建nginx+keepalived高可用(主备模式)

nginx安装 1. 前置依赖安装 yum install gcc gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel -y2. 编译安装nginx nginx下载地址&#xff1a; https://nginx.org/en/download.html ## 安装包位置&#xff1a;信息港16.11:/root/shl tar xvf nginx-1.20.2.ta…

chartjs 饼状图

之前要把canvas先清除掉&#xff0c;不然刷新数据&#xff0c;还会有前面的图表 function clearCanvas(){$(#donutChart).remove();$(#chartdiv).append(<canvas id"donutChart" style"min-height: 500px; height: 500px; max-height: 500px; max-width: 70%…

浅谈mysql mvcc

目录 前言 mvcc 是如何工作的&#xff1f; 数据的更新 前言 mvcc 与一个事物的隔离级别有关&#xff0c;未提交读永远读的是当前值&#xff0c;串行化是通过加锁实现&#xff0c;这两种隔离级别都与mvcc 没有任何关系。只要一提到mvcc应该想到的是读提交以及可重复读&#…