学习SSM的记录(六)-- Spring MVC

news2024/11/15 11:17:37

目录

Spring MVC 简介和体验

Spring MVC原理简单解析

Spring MVC涉及的组件

Spring MVC 快速体验

Spring MVC 接收数据

访问路径设置

接收参数(重点)

param和json参数比较

param参数接收

路径参数接收

json参数接收

@EnableWebMvc注解

接收Cookie和请求头数据

原生Api对象和共享域对象操作

Spring MVC 响应数据

handler方法分析

页面跳转控制

快速返回模板视图

转发和重定向

返回JSON数据(重点)

返回静态资源处理

RestFul风格设计

RESTFul风格特点

Spring MVC 其他拓展

全局异常处理机制

异常处理的两种方式

基于注解异常声明异常处理

拦截器使用

拦截器概念

拦截器使用

参数校验


  • SSM为SpringFramework + SpringMVC + MyBatis
  • Spring的3大特性:IoC(控制反转),DI(依赖注入),AOP(面向切面编程)。
  • 框架 = jar + 配置文件

Spring MVC 简介和体验

Spring Web MVC 是一个基于Servlet API 构建的原始Web框架,一开始包含在Spring Framework下,目前普遍被选为JavaEE项目表述层开发的首选。

Spring MVC框架的两个核心功能:1.简化前端参数接收(形参列表)

                                                        2.简化后端数据响应(返回值)

Spring MVC原理简单解析

Spring MVC 框架内主要工作的有:

  • DispatcherServlet:处理所有请求,用户的所有请求都由它接收
  • HandlerMapping:缓存handler方法和地址,根据地址(如:/user/login)查找项目中的方法(如:UserController中的login方法)
  • HandlerAdapter:适配器,真正进行参数和响应简化
  • 视图解析器:查找视图页面,如果要返回的页面如:/WEB-INF/html/index.html,只需要返回“index”,它可以帮我们添加前缀和后缀,并查找页面信息并返回。

执行流程:

1.用户发送请求

2.请求到达DispatcherServlet

3.DispatcherServlet根据请求地址到HandlerMapping查找方法

4.HandlerMapping查找到handler方法并返回方法信息到DispatcherServlet。

5.DispatcherServlet根据handler方法信息将参数信息和方法信息发送到HandlerAdapter

6.HandlerAdapter进行简化参数处理,并调用handler方法

7.handler方法执行并返回数据给HandlerAdapter

8.HandlerAdapter接收数据并发送给DispatcherServlet

9.DispatcherServlet接收数据,如果接收的是页面地址则进行 操作10 ,不是则直接将数据返回给用户

10.视图解析器为页面添加前后缀并查找页面信息后返回给DispatcherServlet,DispatcherServlet将页面信息返回给用户。

Spring MVC涉及的组件

1.DispatcherServlet:Spring MVC提供,需要配置web.xml(Web项目配置文件)才能生效。

2.HandlerMapping:Spring MVC提供,需要进行IOC配置,将它加入到IOC容器才能生效,它内部缓存handler(controller的方法)和handler访问路径数据。

3.HandlerAdapter:Spring MVC提供,需要进行IOC配置,将它加入到IOC容器才能生效,它可以处理请求参数和处理响应数据。

4.Handler:handler又叫处理器,它是controller层方法的简称,由我们自己定义,接收参数,调用业务方法,返回数据。

5.ViewResolver(视图解析器):Spring MVC提供,需要进行IOC配置,将它加入到IOC容器才能生效,简化视图页面查找,前后端分离后,后端只需要返回JSON数据,不再需要视图解析器。

Spring MVC 快速体验

场景:项目启动后,用户访问/springmvc/hello服务器响应“hello springmvc!!”

1.创建项目ssm-springmvc-quick并转为web项目

2.导入项目所需的依赖:

  • ioc:spring-context
  • webmvc:spring-webmvc
  • servlet:jakarta.jakartaee-web-api

3.创建一个controller类:HelloController

@Controller
public class HelloController {

    @RequestMapping("springmvc/hello")//用户访问地址
    @ResponseBody//直接返回数据,不需要经过视图解析器
    public String hello(){
        System.out.println("Hello , Spring MVC!");
        return "hello springmvc";
    }
}

4.创建spring配置类

//将controller配置到ioc容器
//将handlerMapping handlerAdapter加入到ioc容器
@Configuration
@ComponentScan("com.qiu.controller")
public class MvcConfig {
    @Bean
    public RequestMappingHandlerMapping handlerMapping(){
        return new RequestMappingHandlerMapping();
    }
    @Bean
    public RequestMappingHandlerAdapter handlerAdapter(){
        return new RequestMappingHandlerAdapter();
    }
}

5.初始化ioc容器,设置dispatcherServlet访问路径(就是想要访问项目应该有的地址前缀)

以前我们需要在web.xml下操作:

<servlet>
    <servlet-name>ds</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ds</servlet-name>
    <url-pattern>/</url-pattern><!--访问路径-->
</servlet-mapping>

但现在可以创建一个用来初始化web项目的类,让他继承

AbstractAnnotationConfigDispatcherServletInitializer

,项目启动后会自动扫描他,该类的作用是扫描Spring配置类来初始化ioc容器和设置DispatcherServlet的访问路径

//继承AbstractAnnotationConfigDispatcherServletInitializer类
//用来替换web.xml,会被web项目自动加载,会初始化ioc容器,会设置dispatcherServlet的访问地址
public class SpringMvcInit extends AbstractAnnotationConfigDispatcherServletInitializer {
    //service mapper 层的ioc容器
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }
    //设置spring配置类 springmvc controller的ioc容器
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{MvcConfig.class};
    }
    //设置springmvc自带servlet的访问地址
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

6.部署项目

7.启动项目并访问项目localhost:8080/springmvc/hello

Spring MVC 接收数据

访问路径设置

之前:@WebServlet("必须以 / 开头")                /user/login

现在:@RequestMapping(不必须以 / 开头)      /user/login     user/login     /user/login/

        1.精准地址 :[一个 | 多个]    /user/login    |    {"/user/login","/user/login2"}

        2.模糊地址:* 一层模糊        ** 任意层模糊

                /user/*        ->        /user/a,/user/aaa 可以;/user/a/b 不可以。

                /user/**        ->        /user/a,/user/a/b,/user/a/a/a/a

        3.该注解可以使用在类上或方法上,最终访问路径为:类地址 + 方法地址

        4.请求方式指定:

                        请求方式主要有:GET,POST,PUT,DELETE

                        方式1:@RequestMapping("login",method=RequestMethod.GET)

                        方式2:@GetMapping("login") ,该注解只能用在方法上

                        不指定时默认所有请求方法都可以

多个请求方法@RequestMapping("a",method={RequestMethod.GET,RequestMethod.POST})

                如果有类注解,方法注解内可以不写路径,该方法的访问路径默认为类注解的路径  

接收参数(重点)

param和json参数比较

1.参数编码

param参数会被编译为ASCII码,如name=john doe,会被编译为name=john%20doe;而JSON参数会被编译为UTF-8。

2.参数顺序

param参数没有顺序限制,但JSON参数有顺序限制。

3.数据类型

param类型仅支持字符串类型、数值类型和布尔类型;JSON参数则支持更复杂的类型:数组,对象等。

4.嵌套性
param参数不支持嵌套,JSON参数支持

param参数接收

1.直接接收

如果形参数名和传递参数名相同,即可自动接收。

2.@RequestParam注解

可以使用该注解将Servlet请求参数绑定到controller中的方法的参数上。

使用场景:        指定绑定的请求参数名,要求参数必须传递,为请求参数提供默认值。

演示

@Controller
@RequestMapping("user")
public class UserController {
    /**
     * 直接接收
     * 请求地址:/user/data1?name=qiu&age=18
     * 1.方法参数名和请求参数名一致,2.请求参数可以不传时
     */
    @ResponseBody
    @RequestMapping("data1")
    public String test(String name, int age){
        System.out.println("name = " + name);
        System.out.println("age = " + age);
        return "name="+name+" age="+age;
    }
    /**
     * 注解传参
     * 指定任意的请求参数名,默认要求必须传递,
     *                   如果设置为不必须传递则要设置默认。
     *      /user/data2?account=qiu&age=18
     */
    @ResponseBody
    @RequestMapping("data2")
    public String test2(@RequestParam("account") String name,
                        @RequestParam(required = false,defaultValue = "1") int age){
        System.out.println("name = " + name + ", age = " + age);
        return "name=" + name +"&age="+age;
    }
    /**
     * 特殊值
     *  一个属性传多个值,直接使用集合接收
     *  必须使用@RequestParam,不然可能会把第一个ids当作集合ids直接传值,类型不同会报错
     *      /user/data3?ids=1&ids=2&ids=3
     */
    @ResponseBody
    @RequestMapping("data3")
    public String test3(@RequestParam("ids")List<String> ids){
        System.out.println("ids = " + ids);
        return ids.toString();
    }
    /**
     * 使用实体类接收值
     * 创建User类 类属性有name 和 age,必须要有set/get方法
     *      属性名必须等于参数名
     *      /user/data4?name=qiu&age=18
     */
    @ResponseBody
    @RequestMapping("data4")
    public String test4(User user){
        System.out.println("user = " + user);
        return user.toString();
    }
}

测试

路径参数接收

像/user/{name}/18,如果我们想接收name的值,则可以使用路径参数接收

步骤:1、设置动态路径

           2、接收动态路径参数

//  /user/data5/qiu/123
@ResponseBody
@RequestMapping("data5/{name}/{password}")//设置动态路径
//获取路径参数
public String test5(@PathVariable("name") String username,@PathVariable String password){
    return username+password;
}
json参数接收

前端传递JSON数据时,SpringMVC框架可以使用@RequestBody来将JSON数据转换为Java对象。

Java对象Person

@Data
public class Person {
    private String name;
    private int age;
    private String gender;
}

Controller类PersonController

@Controller
@RequestMapping("json")
public class PersonController {

    @RequestMapping("person")
    @ResponseBody
    public String test(@RequestBody Person person){
        return person.toString();
    }
}

发送请求

结果会报415错误,因为java原生的api只能接收路径传参和param参数,不支持json参数

解决方法:1、导入json处理的依赖        2、为handlerAdapter配置json转化器

添加依赖

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.0</version>
</dependency>

在spring配置类上添加@EnableWebMvc:为handlerAdapter配置了json转化器

这样请求就发送成功了

@EnableWebMvc注解

在spring配置类上添加该注解相当于在springxml配置文件添加了<mvc:annotation-driven/>

而<mvc:annotation-driven/>在底层会自动帮我们把json处理器添加到一个HandlerAdapter上,再把这个handlerAdapter和一个handlerMapping添加到ioc容器内。

因此当我们添加该注解后就不需要在spring配置类中手动添加HandlerAdapter和HandlerMapping了。

接收Cookie和请求头数据

在参数前添加@CookieValue和@RequestHeader就行

public String method(@CookieValue("cookie") String value,                      @RequestHeader("header")String value2){
      ...
}

原生Api对象和共享域对象操作

想要使用原生Api对象可以直接通过参数获得

    @Autowired
    private ServletContext context;
    public String getApi(HttpServletRequest request,
                         HttpServletResponse response,
                         HttpSession session){
//       要获取ServletContext
//       ServletContext [1.最大的配置文件,2.全局最大的共享域,3.核心api getRealPath]
//        方式1:通过request,session获取
        ServletContext servletContext = request.getServletContext();
        ServletContext servletContext1 = session.getServletContext();
//        方式2:声明一个全局变量,然后再上面添加一个@Autowire
//                (ServletContext在程序启动时会自动添加到ioc容器内)
        return "";
    }

Spring MVC 响应数据

handler方法分析

handler方法其实就是我们自己创建的controller类下的各种方法

接收请求数据,我们通过handler方法的形参列表

返回数据响应,我们通过return关键字

页面跳转控制

快速返回模板视图

当使用前后端分离模式(当前主流)时,该功能不再被需要。

要把jsp等视图返回给用户,需要使用视图解析器。

因此要先把视图解析器加入ioc容器

@Configuration
@ComponentScan("com.qiu.controller")
@EnableWebMvc
//WebMvcConfigurer 可以快速配置springmvc的组件
public class MvcConfig implements WebMvcConfigurer {

//    将视图解析器加入到ioc容器内,
//    registry.jsp("/WEB-INF/views/",".jsp") 为handler返回的视图路径添加前后缀,其底层就是字符串拼接
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views/",".jsp");
    }
}

编写index.jsp文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--    ${data}意思是在request域中获取key=data的value,在request.setAttribute("data","hello jsp")--%>
    <font color="red">${data}</font>
</body>
</html>

编写handler方法

@Controller
@RequestMapping("jsp")
public class HelloController {

    @GetMapping("index")
    public String hello(HttpServletRequest request){
        //在请求域中设置data:hello jsp,为index.jsp文件内的${data}赋值
        request.setAttribute("data","hello jsp");
        //此handler没有@ResponseBody,
        //  所以将把“index”与视图解析器设置的前后缀拼接并查找文件并返回给用户
        return "index";
    }

}

这样用户就可以获取到index.jsp

转发和重定向

直接通过以下代码和注释学习

@GetMapping("index")
public String hello(HttpServletRequest request){
    //在请求域中设置data:hello jsp,为index.jsp文件内的${data}赋值
    request.setAttribute("data","hello jsp");
    //此handler没有@ResponseBody,
    //  所以将把“index”与视图解析器设置的前后缀拼接并查找文件并返回给用户
    return "index";
}

/**
 * 转发和重定向依然不能添加@ResponseBody
 * 要转发时,需要在返回的地址前添加 forward:
 * 要重定向时,需要在返回的地址前添加 redirect:
 */
@GetMapping("forward")
public String forward(){
    return "forward:/jsp/index";
}
//原本重定向的地址如果是项目内需要包含根路径,
//      即 http://localhost:8080/mvcpro/jsp/index 应该返回 redirect:/mvcpro/jsp/index
//      但springmvc内部做了优化,不需要根路径
@GetMapping("redirect")
public String redirect(){
    return "redirect:/jsp/index";
}

@GetMapping("baidu")
public String baidu(){
    return "redirect:http://www.baidu.com";
}

返回JSON数据(重点)

接收JSON和返回JSON都需要导入jackson-databind依赖

@ResponseBody:返回JSON的注解,添加到类或方法上,不走视图解析器直接把数据返回给前端。

当我们想要返回JSON数据给前端时,先导入依赖,把JSON解析器添加到ioc容器中(使用@EnableWebMvc),然后在handler方法上添加@ResponseBody注解,最后直接把pojo类返回就行了,springmvc会自动把该类转换为JSON数据再发送给前端。

pojo类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private String gender;
}

handler方法

@Controller
@ResponseBody
@RequestMapping("json")
public class JsonController {

    @GetMapping("user")
    public User json(){
        return new User("秋","男");
    }

}

返回静态资源处理

如果项目结构像这样,

我们无法通过 …/images/OIP-C.jpg访问静态资源。(jsp属于动态资源)

原因:DispatcherServlet会接收所有请求,包括对静态资源的请求,并且他只会在HandlerMapping中根据路径查找对应的handler方法,而静态资源没有对应的handler方法。

解决办法:需要我们开启静态资源查找:

还是在  WebMvcConfigurer 接口下,有个  configureDefaultServletHandling 方法 

//相当与开启了<mvc:default-servlet-handler/>
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();//开启
}

开启后dispatcherServlet在HandlerMapping中没有找到资源,会再拿着路径查找有没有对应的静态资源。

RestFul风格设计

RestFul:Http协议的标准使用方案和风格。

前端往后端发送请求时,需要考虑:

 1.路径如何设计(如:/user/add?)        2.要使用哪种传递参数方案(param?json?path?)

 3.要使用哪种请求方式(get?post?delete?put?)

RestFul就是解决这些问题的一种方法。

RESTFul风格特点

1.每一种URI代表一种资源(URI是名词)

        设计URI时尽量不使用动词,如:要新增用户不用:POST /user/add,而是使用:POST  /user; 要删除用户不用:DELETE /user/delete?id=1,而是使用:DELETE /user/1

2.客户端使用GET,POST,PUT,DELETE 4个表示操作方式的动作来对服务器资源进行操作:

GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除资源。

3.资源使用xml或JSON

Spring MVC 其他拓展

全局异常处理机制

异常处理的两种方式

异常处理一般分为:编程式异常处理(使用trycatch手动显示地处理) 和 声明式异常处理(将异常处理的逻辑从具体业务逻辑中脱离,通过配置等方式进行统一的管理和处理)。

基于注解异常声明异常处理

1.声明异常处理控制器类

2.声明异常处理handler方法

//该注解 = @ControllerAdvice + @ResponseBody
//@ControllerAdvice 代表当前类的异常处理controller
//异常发生时,会走此类写的handler,
@RestControllerAdvice
public class GlobalExceptionHandler {

    //发送异常 -》 ControllerAdvice -》@ExceptionHandler -》根据异常类调用方法

    @ExceptionHandler(ArithmeticException.class)
    public Object ArithmeticExceptionHandler(ArithmeticException e){
        //自定义处理异常
        return null;
    }
    @ExceptionHandler(Exception.class)
    public Object ExceptionHandler(Exception e){
        return null;
    }


}

拦截器使用

拦截器概念

Filter过滤器

在javaweb项目中,可以使用Filter过滤器,当请求来到服务器时,会先经过过滤器的处理(登录保护,编码格式,权限处理),再到对应的目标类。

但SpringMVC中,Filter过滤器就不适用了,SpringMVC使用DispatcherServlet接收请求,当我们设置了Filter时,请求会在到达DispatcherServlet前经Filter处理,而SpringMVC内部细化流程Filter无法拦截。

HandlerInterceptor 拦截器(SpringMVC环境下推荐使用)

SpringMVC提供了HandlerInterceptor拦截器,它会在handlerAdapter调用handler之前和之后拦截以及整体处理之后拦截。

拦截器使用

1.创建拦截器类

public class MyInterceptor implements HandlerInterceptor {

    //在handler执行前拦截:编码格式设置,登录保护,权限处理

    /**
     *
     * @param request   请求对象
     * @param response  响应对象
     * @param handler   我们要调用的方法对象
     * @return true 放行     false 拦截
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }
    //在handler执行后触发,没有拦截机制(方法已执行,拦截无意义)
    // modelAndView 返回的视图和共享域对象
    // 可以进行敏感词检查
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }
    //在数据返回给客户端前拦截
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

2.修改配置类添加拦截器

@Configuration
@ComponentScan("com.qiu.controller")
@EnableWebMvc
//WebMvcConfigurer 可以快速配置springmvc的组件
public class MvcConfig implements WebMvcConfigurer {

//    将视图解析器加入到ioc容器内,
//    registry.jsp("/WEB-INF/views/",".jsp") 为handler返回的视图路径添加前后缀,其底层就是字符串拼接
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views/",".jsp");
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //配置方案1:拦截所有请求
        //registry.addInterceptor(new MyInterceptor());
        //配置方案2:指定地址拦截        /**:拦截路径下所有请求
        //registry.addInterceptor(new MyInterceptor())
        //                .addPathPatterns("/user/**");
        //配置方案3:排除拦截   
        registry.addInterceptor(new MyInterceptor())
                          .addPathPatterns("/user/**")
                                .excludePathPatterns("/user/data"); 
    }
}

参数校验

场景:每次请求参数都需要判断是否为空和检查格式是否正确。

java通过了jsr303系列注解,只需要准备对应的实体类并在其属性上添加注解,当该实体类对象的属性的数据为空或者格式有误,就会报错。

使用

1.导入依赖

<!-- 校验注解 -->
<dependency>
    <groupId>jakarta.platform</groupId>
    <artifactId>jakarta.jakartaee-web-api</artifactId>
    <version>9.1.0</version>
    <scope>provided</scope>
</dependency>
        
<!-- 校验注解实现-->        
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>8.0.0.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator-annotation-processor -->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator-annotation-processor</artifactId>
    <version>8.0.0.Final</version>
</dependency>

2.应用

@Data
public class User {
    //age   1 <=  age < = 150
    @Min(10)
    private int age;

    //name 3 <= name.length <= 6
    @Length(min = 3,max = 10)
    private String name;

    //email 邮箱格式
    @Email
    private String email;

}

3.handler方法标记

@RestController
@RequestMapping("user")
public class UserController {

    /**
     * @Validated 代表应用校验注解! 必须添加!
     */
    @PostMapping("save")
    public Object save(@Validated @RequestBody User user,
                       //在实体类参数和 BindingResult 之间不能有任何其他参数, BindingResult可以接受错误信息,避免信息抛出!
                       BindingResult result){
       //判断是否有信息绑定错误! 有可以自行处理!
        if (result.hasErrors()){
            System.out.println("错误");
            String errorMsg = result.getFieldError().toString();
            return errorMsg;
        }
        //没有,正常处理业务即可
        System.out.println("正常");
        return user;
    }
}

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

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

相关文章

探秘知乎的排名算法:知乎撰写高质量内容的秘诀

知乎作为一个知识问答社区&#xff0c;用户众多、内容繁杂&#xff0c;那么究竟是什么样的原则决定了知乎上的排名呢&#xff1f;腾轩科技传媒探讨知乎排名的规则&#xff0c;并分享如何撰写高质量的文章。 知乎排名的算法 在知乎这个巨大的社交平台上&#xff0c;任何一个用户…

DDL - 建立数据库,建表代码版(Way 2)

一、DB操作 show databases; create database DBOFRYX; drop database DBOFRYX; use DBOFRYX; 二、表操作&#xff08;表和表结构、字段是A、B两姐妹&#xff09; (1) use DBOFRYX; show tables; (2) create table TABOFRYX( name varchar(50) comment "姓名"…

ChatGPT提问技巧——对话提示

ChatGPT提问技巧——对话提示 对话提示是一种允许模型生成模拟两个或多个实体之间对话的文本的技术。 通过向模型提供上下文和一组角色或实体&#xff0c;以及他们的角色和背景&#xff0c;并要求模型生成他们之间的对话。 因此&#xff0c;应向模型提供一个上下文和一组角色…

大语言模型智能体简介

大语言模型&#xff08;LLM&#xff09;智能体&#xff0c;是一种利用大语言模型进行复杂任务执行的应用。这种智能体通过结合大语言模型与关键模块&#xff0c;如规划和记忆&#xff0c;来执行任务。构建这类智能体时&#xff0c;LLM充当着控制中心或“大脑”的角色&#xff0…

浏览器设置字体1px时,不能正常显示

问题如下&#xff0c;某版本浏览器&#xff0c;字体很小时&#xff0c;无法正常显示&#xff0c;解决方案有三种。 解决方案1 解决方案2 解决方案3

WebServer -- 面试题(下)

&#x1f442; 夏风 - Gifty - 单曲 - 网易云音乐 目录 &#x1f33c;前言 &#x1f382;面试题(下) 4&#xff09;HTTP报文解析 为什么要用状态机 状态转移图画一下 https 协议为什么安全 https 的 ssl 连接过程 GET 和 POST 的区别 5&#xff09;数据库注册登录 登…

十五、软考-系统架构设计师笔记-面向服务架构设计理论与实践

1、SOA相关概念 面向服务的架构(SOA)的定义 SOA 是一个组件模型&#xff0c;它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的&#xff0c;它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构…

[RoarCTF 2019]Easy Java -不会编程的崽

考察一下大家对java-web知识点的掌握 熟悉的登录界面让你想起了某位故人没有&#xff0c;哈哈&#xff0c;但是并非sql注入。一番基础尝试无果后&#xff0c;看看help吧 这个url让你想起某位故人了吗&#xff1f;对文件下载。但是似乎没有响应。改成post请求即可。 我看见pk了&…

unity3d Animal Controller的Animal组件中General基础部分理解

控制器介绍 动物脚本负责控制动物的所有运动逻辑.它管理所有的动画师和刚体参数,以及所有的状态和模式,动物可以做。 动物控制器 是一个动画框架控制器,根动或到位,为任何生物或人形。它利用刚体与物理世界的互动和动画师的玩动画。 States States 是不互相重叠的动画。例如…

canvas绘制圆形进度条

canvas绘制圆形进度条 用canvas绘制了一个圆形进度条&#xff0c;记录一下&#xff1a; 效果如下&#xff1a; 感觉效果还行&#xff0c;不过有待优化 代码如下&#xff1a; 我是用Vue写的 组件的代码&#xff1a; progressCanvas.vue <template><div><can…

Linux VM虚拟环境 设置静态IP

目录 查看自己的网卡配置说明重启网卡实例测试配置情况测试网络 查看自己的网卡 ip a配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens32配置说明 [rootlinux-server ~]# cd /etc/sysconfig/network-scripts/ #网卡配置文件存放路径 [rootlinux-server network-scri…

C/C++中{}的用法总结(全)

C基础专栏&#xff1a;http://t.csdnimg.cn/UjhPR 目录 1.定义初始化列表&#xff08;Initializer List&#xff09; 2.类成员初始化列表 3.无默认构造函数的类的默认初始化&#xff08;C11 及以后版本&#xff09; 4.初始化器列表构造函数&#xff08;C11 及以后版本&…

js判断对象是否有某个属性

前端判断后端接口是否返回某个字段的时候 <script>var obj { name: "John", age: 30 };console.log(obj.hasOwnProperty("name")); // 输出 trueconsole.log(obj.hasOwnProperty("email")); // 输出 falselet obj11 { name: "Joh…

一文搞懂多模态:BeiT-3之前的14个多模态+4个周边原理解读

在人工智能的世界里&#xff0c;多模态学习不断地展现出其重要性。这个领域的迅速发展不仅促进了不同类型数据之间的深度融合&#xff0c;还为机器理解世界提供了更加丰富和细腻的视角。随着科技的不断演进&#xff0c;人工智能模型已经开始渐渐具备处理和理解从文本、图像&…

MySQL主从复制的原理

MySQL 主从复制是一种数据复制技术&#xff0c;用于在多个数据库服务器之间的数据同步。在主从复制架构中&#xff0c;一个服务器被设置为主服务器&#xff0c;充当数据源&#xff0c;其他服务器被设置为从服务器&#xff0c;用来复制主服务器的数据。 1.主从复制优点 主从复…

Unity Timeline学习笔记(3) - SignalTrack信号轨道和自定义带参数的Marker信号和轨道

信号轨道&#xff0c;顾名思义就是运行到某处发送一个信号。 普通用法 普通用法就是没有任何封装的&#xff0c;个人感觉特别难用&#xff0c;但是有必要理解一下工作原理。 添加信号 我们添加一个信号资源 生成后可以看到资源文件&#xff0c;这个是可以拖到SignalTrack上…

web 服务搭建

实验拓扑图&#xff1a; 实验环境搭建 Centos7-5作为Client&#xff08;12.0.0.12/24&#xff09;&#xff1b;Centos7-1作为网关服务器&#xff08;配置两块网卡ens33 192.168.246.7/24&#xff0c;ens36 12.0.0.1/24&#xff09;&#xff1b;Centos7-2作为Web1&#xff08;19…

2024年云仓酒庄深惠公司发布会圆满落幕:共襄盛举,携手共赢

原标题&#xff1a;2024年云仓酒庄深惠公司发布会圆满落幕&#xff1a;共襄盛举&#xff0c;携手共赢 随着岁月的流转&#xff0c;云仓酒庄以其卓越的品质和不懈的创新精神&#xff0c;在葡萄酒行业中独树一帜。2024年&#xff0c;云仓酒庄再次迎来了一场盛大的发布会——深惠…

一文读懂『归并排序』算法(Merge Sort)

目录 归并排序算法&#xff08;Merge Sort&#xff09;简介 算法基本思想和流程&#xff08;时间复杂度O(nlogn) &#xff09; ​编辑代码实现 归并排序模板&#xff08;背诵&#xff09; 归并排序算法&#xff08;Merge Sort&#xff09;简介 归并排序&#xff08;Merge …

MyBatis入门(JDBC规范,MyBatis,连接池,Lombok)【详解】

目录 一、JDBC规范【了解】 1. JDBC介绍 2. JDBC示例 3. JDBC的问题 二、MyBatis入门【重点】 1. Mybatis是什么 2. Mybatis使用步骤 3. Mybatis入门案例 1.创建SpringBoot工程 2.创建Mapper 3.功能测试 三、连接池【了解】 1. 什么是连接池 2. 有哪些数据库连接池…