【SpringMVC】上篇,超详细的教程带你学会SpringMVC

news2025/1/11 10:16:02

✅作者简介:热爱Java后端开发的一名学习者,大家可以跟我一起讨论各种问题喔。
🍎个人主页:Hhzzy99
🍊个人信条:坚持就是胜利!
💞当前专栏:【Spring】
🥭本文内容:SpringMVC上部分内容的学习,助你逐步深入Spring全家桶之二——SpringMVC

SpringMVC


文章目录

  • SpringMVC
  • 前言
  • SpringMVC简介
    • SpringMVC概述
    • SpringMVC特点
  • SpringMVC入门案例
  • SpringMVC注解
    • @Controller
    • @RequestMapping
    • @ResponseBody
    • @RequestParam
  • 应用实例
  • 结语


前言

在前文中我们已经学习过Sping框架了(IoC和DI还有AOP),想了解的同学可以去我的专栏查看传送门🚩

SpringMVC是隶属于Spring框架的一部分,主要是用来进行Web开发,是对Servlet进行了封装。
SpringMVC是处于Web层的框架,所以其主要的作用就是用来接收前端发过来的请求和数据然后经过处理并将处理的结果响应给前端,所以如何处理请求和响应是SpringMVC中非常重要的一块内容。
这篇文章我将带领大家一起学习SpringMVC


SpringMVC简介

SpringMVC概述

SpringMVC是Spring提供的一个轻量级Web框架,它实现了WebMVC设计模式。它是一个开源的Java平台,为开发强大的基于Java的Web应用程序提供全面的基础架构支持非常容易非常快速。它在使用和性能等方面比另一个框架Struts2更加优异。

SpringMVC特点

  • 是Spring框架的一部分,可以方便的利用Spring所提供的其他功能
  • 灵活性强,易于与其他框架集成
  • 提供了一个前端控制器 DispatcherServlet, 使开发人员无须额外开发控制器对象。
  • 可自动绑定用户输入,并能正确地转换数据类型。
  • 内置了常见的校验器,可以校验用户输入。如果校验不能通过,就会复位向到输入表单。
  • 持国际化,可以根据用户区域显示多国语言
  • 支持多种视图技术,如JSP、Velocity 和 FreeMarker 等视图技术。
  • 使用基于 XML 的配置文件,在编辑后,不需要重新编译应用程序

SpringMVC入门案例

了解了SpringMVC的概念和特点之后,接下来我们做一个简单的入门案例
第一步:创建一个Maven项目
在这里插入图片描述
注意: 这样使用骨架创建出来的项目结构是不完整的
我们需要补全目录
在这里插入图片描述
第二步:在pom.xml中添加依赖

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

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.hzy</groupId>
  <artifactId>springMvc_quickstart</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>


  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.10.RELEASE</version>
    </dependency>
  </dependencies>
</project>

第三步:配置前端控制器

在web.xml中配置SpringMVC的前端控制器DispatcherServlet。

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <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-config.xml</param-value>
    </init-param>
    <!--表示容器在加载时立刻加载Servlet-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

web.xml中主要对<servlet><servlet- mapping>元素进行了配置。在<servlet>中配置了 Spring MVC 的前端控制器 DispatcherServlet,并通过其子元素<init-param>配置了 Spring MVC 配置文件的位置, <load-on-startup>元素中的'1'表示容器在启动时立即加载这个 Servlet:在 <servlet-mapping>中,通过<url-pattern>元素的/ 拦截所有 URL,并交由 DispatcherServlet 处理。

第四步:创建Controller类

在src下创建com.hzy.controller包,创建ControllerTest。

package com.hzy.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ControllerTest implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        
        //创建ModelAndView对象
        ModelAndView m = new ModelAndView();
        //向模型中添加一个名称为msg的字符串对象
        m.addObject("msg","这是第一个SpringMVC程序");
        //设置返回路径
        m.setViewName("/WEN-INF/welcome.jsp");
        return m;
    }
}

handleRequest()是 Controller 接口的实现方法,ControllerTest 类会调用该方法 处理请求,并返回一个包含视图名或包含视图名与模型的 ModelAndView 对象。本案例向模型对象 中添加了一个名称为 msg 的字符串对象,并设置返回的视图路径为 WEB-INF/welcome. jsp,这样 请求就会被转发到 welcome. jsp 页面。

第五步:创建springmvc-config.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--配置处理器Handle,映射“ControllerTest”请求-->
    <bean name="/controllerTest" class="com.hzy.controller.ControllerTest"/>
    <!--处理器映射,将处理器Handle的name作为url进行查找-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!--处理器适配器,配置处理器中的handleRequest()方法调用-->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
    
</beans>

首先定义了一个名称为 ControllerTest的 Bean,该 Bean 会将控制器类 ControllerTest 映射到 /controllerTest请求中:然后配置了处理器映射器 BeanNameUrIHandlerMapping 和处理器适配器 SimpleControllerHandlerAdapter, 其中处理器映射器用 于将处理器 Bean 中的的 name (即 url)进行处理器查找,而处理器适配器用于完成对 ControllerTest 处理器中 handleRequesto方法的调用;最后配置了视图解析器 InternalResourceViewResolver 来解析结果视图,并将结果呈现给用户。

第六步:创建视图(View)页面
在WEB-INF目录下创建一个页面文件welcome.jsp,在该页面中使用EL表达式获取msg的信息

<%@ page contentType="text/html;charset=UTF-8" language="java"  pageEncoding="UTF-8" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Title</title>
</head>
<body>
    ${msg}
</body>
</html>

最后:配置Tomcat,启动项目

在这里插入图片描述
运行结果:

在这里插入图片描述
通过入门案例的学习,我们总结一下SpringMVC程序的执行流程:

  1. 用户通过浏览器向服务器发送请求,请求会被 SpringMVC 的前端控制器 DispatcherServiet 所拦截
  2. DispatcherServlet 拦截到请求后,会调用 HandlerMapping 处理器映射器。
  3. 处理器映射器根据请求 URL找到具体的处理器,生成处理器对象及处理器拦截器(如果有就生成)一并返回给 DispatcherServlet
  4. DispatcherServlet 会通过返回信息选择合适的 HandlerAdapter(处理器适配器)
  5. HandlerAdapter 会调用并执行 Handler(处理器),这里的处理器就是程序中编写的 Controller 类,也被称为后端控制器。
  6. Controller 执行完成后,会返回一个 ModelAndView 对象,该对象中包含视图名或包含模 利与视图名。
  7. HandlerAdapterModelAndView 对象返回给 DispatcherServlet
  8. DispatcherServlet 会根据 ModelAndView 对象选择一个合适的 ViewResolver(视图解析器)。
  9. ViewResolver 解析后,会向 DispatcherServlet 中返回具体的 View(视图)。
    10.DispatcherServlet对 View 进行渲染(即将模型数据填充至视图中)
  10. 视图渲染结果会返回给客户端浏览器显示。

在上述执行过程中,DispatcherServletHandlerMappingHandlerAdapterViewResolver 对象的工作是在框架内部执行的,开发人员并不需要关心这些对象内部的实现过程,只需要配置前端控制器(DispatcherServlet),完成Controller中的业务处理,并在视图(View)中展示相应信息即可。
注:
大家都发现了,这种方式实现整个程序还是比较麻烦的。

SpringMVC注解

在 Spring 2.5 之前,只能使用实现 Controller 接口的方式来开发一个控制器,我们的入门案例就是使用的这种方式。在 Spring 2.5 之后,新增加了基于注解的控制器以及其他一些常用注解,这些注解的使用极大地减少了程序员的开发工作。接下来我将详细的讲解 SpringMVC 中的常用核心类及其常用注解。

@Controller

名称@Controller
类型类注解
位置SpringMVC控制器类定义上方
作用设定SpringMVC的核心控制器bean

org.springframework.stereotype.Controller 注解类型用于指示 Spring类的实例是一个控制器,其注解形式为@Controller。该注解在使用时不需要再实现 Controller 接口,只需要将@Controller 注解加入控制器类上,然后通过 Spring的扫描机制找到标注了该注解的控制器即可。
示例:

package com.hzy.controller;
import org.springframework.stereotype.Controller;
......
//Controller注解
@Controller
public class ControllerTest{
...
}

为了保证 Spring 能够多找到控制器类,还需要在Spring MVC的配置文件中添加相应的扫描配置信息,具体如下。
(1)在配置文件的声明中引入 spring-context
(2)使用<context: component-scan>元素指定需要扫描的类包。
示例:

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context.xsd
        ">
<!--指定要扫描的包-->
    <context:component-scan base-package="com.hzy.controller"/>

</beans>

<context: component-scan>元素的属性base-package指定了需要扫描的包为:com.hzy.controller。在运行时改包及子包下的所有标注了注解的类都会被Spring处理。

@RequestMapping

名称@RequestMapping
类型类注解或方法注解
位置SpringMVC控制器类或方法定义上方
作用设置当前控制器方法请求访问路径
相关属性value(默认),请求访问路径

示例:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller//注解
@RequestMapping("/book")//标注在类上
public class BookController {

    @RequestMapping("/save")//标注在方法上
	public String save({
			...
	}
}

在类上标注了@RequestMapping("/book"),则我们可以通过http://localhost:8080/book进行访问,在方法上标注@RequestMapping("/save"),我们可以用http://localhost:8080/book/save访问。
@RequestMapping注解的属性

属性名类型描述
nameString可选属性,用于为映射地址指定别名
valueString[]可选属性,同时也是默认属性,用于映射一个请求和一种方法,可以标注在一个方法或一个类上。
methodRequestMethod[]可选属性,用于指定该方法用于处理哪种类型的请求方式,其请求方式包括 GET、POST、HEAD、OPTIONS、PUT、 PATCH、 DELETE 和和TRACE,例如method= RequestMethod.GET 表示只支持 GET 请求, 如果需要支持多个请求方式,就需要通过{} 写成数组的形式,并且多个请求方式之间是有英文逗号分隔的
paramsString[]可选属性,用于指定 Request 中必须包含某些参数的值,才可以通过其标注的方法处理
headersString[]可选属性,用于指定 Request 中必须包含某些指定的header 的值,才可以通过其标注的方法处理
consumesString[]可选属性,用于指定处理请求的提交内容类型 (Content-Type ),比如 application/json, text/html 等
producesString[]可选属性,用于指定返回的内容类型,返回的内容类型必须是 request请求头(Accept)中所包含的类型

组合注解:

请求组合注解共享注解
GET@GetMapping@RequestMapping(method = RequestMethod.GET)
POST@PostMapping@RequestMapping(method = RequestMethod.POST)
PUT@PutMapping@RequestMapping(method = RequestMethod.PUT)
DELETE@DeleteMapping@RequestMapping(method = RequestMethod.DELETE)
PATCH@PatchMapping@RequestMapping(method = RequestMethod.PATCH)

@ResponseBody

名称@ResponseBody
类型类注解或方法注解
位置SpringMVC控制器类或方法定义上方
作用设置当前控制器方法响应内容为当前返回值,无需解析

示例:

@Controller
@RequestMapping("/book")
public class BookController {

    @RequestMapping("/save")
    @ResponseBody
    public String save(){
	//System.out.println("book save ...");
    return "{'module':'book save'}";
	}

在这里插入图片描述

@RequestParam

@RequestParam主要用于数据绑定

属性说明
valuename 属性的别名,这里指参数的名字,即入参的请求参数名字,如 value=" user_id" 表示请求的参数中名字为 user_id 的参数的值将传入。如果只使用 vaule 属性,就可以 省略value 属性名
name指定请求头绑定的名称
require用于指定参数是否必需,默认是tre,表示请求中一定要有相应的参数
defaultValue默认值,表示如果请求中没有同名参数的默认值

应用实例

springmvc-config.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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
        ">
<!--指定要扫描的包-->
    <context:component-scan base-package="com.hzy.controller"/>

</beans>

web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <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-config.xml</param-value>
    </init-param>
    <!--表示容器在加载时立刻加载Servlet-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

BookController:

@Controller
@RequestMapping("/book")
public class BookController {

    @RequestMapping("/save")
    @ResponseBody
    public String save(@RequestParam("name") String userName, int age){
        System.out.println("普通参数传递name="+userName);
        System.out.println("普通参数传递age="+age);
        System.out.println("book save ...");
        return "{'module':'book save'}";
    }
}

启动程序:
在这里插入图片描述
在这里插入图片描述


结语

以上就是今天要讲的内容,涉及了SpringMVC的介绍、应用、数据绑定的内容,下篇中我会给大家讲到JSON数据交互和RESTFUL支持,以及拦截器的内容。

如果各位大哥大姐对我所写的内容觉得还行的话,希望可以点个关注,点个收藏,您的支持就是我最大的动力,非常感谢您的阅读(❁´◡`❁)

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

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

相关文章

java面向对象----抽象类

目录 抽象类与抽象方法 概念 抽象类应用 接 口 概念 接口的特点&#xff1a; 接口应用举例 Java 8中关于接口的改进 内部类 如何声明局部内部类 局部内部类的特点 匿名内部类 总结 抽象类与抽象方法 概念 随着继承层次中一个个新子类的定义&#xff0c;类变得越…

android OTA update

可以使用系統的API來實現系統更新。分兩種更新&#xff0c;non-streaming 和 streaming。non-streaming就是把更新包下載好&#xff0c;放到本地&#xff0c;然後執行更新。而streaming是爲了你的設備內存不夠&#xff0c;不能把更新包下載下來&#xff0c;使用的&#xff0c;u…

Helm 部署 java 项目到 K8S

文章目录部署流程模板目录文件解析DeploymentServiceIngress_helpers.tplChart.yamlvalues.yaml部署命令部署流程 准备 jar 包使用 Dockerfile 构建镜像上传镜像到仓库&#xff08;Harbor&#xff09;使用 Helm 模板部署 jar 到 K8S 本文着重讲解第四步&#xff0c;如何制作 …

后分库分表时代的数据库新选择:二维火搭载OceanBase再出发

如今&#xff0c;在中国任意走进一家餐饮商户&#xff0c;不论其规模大小&#xff0c;扫码点餐、自助点餐机、商家点餐小程序等已经基本成为标配。随着餐饮行业数智化持续加速推进&#xff0c;餐饮 SaaS 已经逐渐成为商户们的“必选题”&#xff0c;二维火便是这“必选题”之一…

深度解析 Git 是如何工作的?

深度解析 Git 是如何工作的&#xff1f;前言Git 的特性Git 实际上是如何工作的Commits 对象Tree 对象Blobs 对象总结分支创建与合并代码合并与冲突代码合并算法&#xff08;Myers&#xff09;图搜索代码 diff结尾参考&#xff1a;《Pro Git》、《Advanced Git》 前言 Git 是一…

如何实现工具无关化?关于自动化测试脚本的设计

1.问题的提出 最近几年来&#xff0c;我的自动化测试工具之旅大致是这样的&#xff0c;最早用的是QTP,然后是RFT(IBM的功能测试自动化产品),之后也经历了Selenium, Watir等&#xff0c;再后还是一些商业工具主要是偏web自动化及移动自动化&#xff0c;如sahi, appnium, Keynot…

你知道ArcGIS电子地图也有大字体地图吗(附下载方法)

概述 如果你经常使用水经微图&#xff0c;应该知道在水经微图内&#xff0c;百度电子地图和高德电子地图有大字体地图&#xff0c;最近我偶然发现ArcGIS电子地图也有大字体地图&#xff0c;这里给大家介绍一下下载方法。 加载地图 在ArcGIS中打开目录窗格&#xff0c;点击添…

五、卷积神经网络CNN8(不同卷积后图像大小计算)

类型划分 2 维卷积的计算分为了 3 类&#xff1a;1.full 2.same 3. valid 1、full蓝色为原图像&#xff0c;白色为对应卷积所增加的 padding&#xff0c;通常全部为 0&#xff0c;绿色是卷积后图片。图中的卷积的滑动是从卷积核右下角与图片左上角重叠开始进行卷积&#xff…

为什么企业需要实时跟踪进度的项目管理工具?

市场上的大多数 项目管理工具&#xff0c;都是垃圾进-垃圾出&#xff0c;这意味着如果你的团队没有输入正确甚至漏了输入他们活动的状态信息&#xff0c;就无法准确跟踪项目进展。 当选择了一个不能跟踪实时进度状态的项目管理工具&#xff0c;它不能给你提供准确报告进度所需…

大型复杂项目管理之风险预防

最近一个项目让项目经理小王焦头烂额&#xff0c;一问才知是第一次主导大型项目&#xff0c;各个维度的风险问题频发不断&#xff0c;项目感觉推动不下去了。例如&#xff0c;子项目进度延误、项目资源不足、项目交付物质量不过关等因素造成项目的整体延误等等。 项目案例信息&…

GoogLeNet 与 Inception

本篇主要介绍GoogLeNet,其被改进并应用在了YOLOV1目标检测算法中。 GoogLeNet是google推出的基于Inception模块的深度神经网络模型&#xff0c;在2014年的ImageNet竞赛中夺得了冠军&#xff0c;在随后的两年中一直在改进&#xff0c;形成了Inception V2、Inception V3、Incepti…

Java 将PDF转为Word

众所周知&#xff0c;PDF文档除了具有较强稳定性和兼容性外, 还具有较强的安全性&#xff0c;在工作中可以有效避免别人无意中对文档内容进行修改。但与此同时&#xff0c;也妨碍了对文档的正常修改。这时我们可以将PDF转为Word文档进行修改或再编辑。使用软件将 PDF 文档转换为…

Spring事务,浅谈!

目录 一、EnableTransactionManagement工作原理 二、Spring事务基本执行原理 三、Spring事务详细执行流程 四、Spring事务传播机制 五、Spring事务传播机制分类 六、Spring事务强制回滚 七、TransactionSynchronization 一、EnableTransactionManagement工作原理 开启Spr…

在C++中,为什么部分程序员喜欢在循环中写‘++i’而不是‘i++’?

自入行以来&#xff0c;无论是查阅资料、技术博客亦或是同事间的技术交流&#xff0c;都有一个共识:在循环的时候&#xff0c;务必使用前置操作符&#xff0c;因为其性能优于后置操作符&#xff0c;久而久之&#xff0c;这个就像一个不成文的规定&#xff0c;大家都在遵循&…

C++异常介绍

目录 一.异常 1.1C异常概念 1.2异常的使用 1.3异常和栈帧,重新抛出 二.异常体系 2.1自定义异常体系 2.2C标准库的异常体系 2.3异常规范 3.异常的优缺点 3.1优点 3.2缺点 一.异常 1.1C异常概念 语言传统的处理错误的方式&#xff1a; 1. 终止程序&#xff0c;如assert…

浮点类型的比较

浮点类型的比较一.浮点数精度的损失二.浮点数的比较1.方法一2.方法二3.方法三&#xff1a;系统方案一.浮点数精度的损失 关于浮点数的比较就不得不提到浮点数在内存中的存储&#xff0c;但这里篇幅太大&#xff0c;故我将其放在另一篇博客里&#xff0c;&#xff08;如果不了解…

laravel对于百万级别数据导出的一些经验

业务上的需求&#xff0c;我们开发的供应链系统某些业务表也陆续突破了百万级别。 原先使用 \Maatwebsite\Excel 插件导出的效率越来越慢&#xff0c;5w条数据导出基本要达到20min&#xff0c;甚至于30w数据导出基本上都超时。 为了解决这个问题&#xff0c;多种尝试&#xf…

AI 让观众成为 3D 版《老友记》的导演了?

《老友记》上线 3D 版了&#xff1f; 允许用户旋转镜头&#xff0c;且从近景切换到全景观看故事&#xff1f; 今年出炉的 3D 方向 AI 项目 SitCom3D&#xff0c;能够自动补齐《老友记》原剧中的三维拍摄空间&#xff0c;用户可以选择主视图、侧视图等不同角度欣赏剧集。镜头的…

[ vulhub漏洞复现篇 ] solr 远程命令执行 (CVE-2019-17558)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

优秀的内部知识库对企业的重要性

我们都知道在客户服务方面&#xff0c;选择正确的知识库软件的重要性。但我们经常忘记的是&#xff0c;我们的员工也是我们的客户。根据盖洛普公司最近的研究&#xff0c;世界正在经历一场员工参与危机。只有大约三分之一的美国员工在工作中具有参与感&#xff0c;而在全球范围…