SpringBoot路径映射配置的实现步骤

2025-08-21 10:50

本文主要是介绍SpringBoot路径映射配置的实现步骤,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringBoot路径映射配置的实现步骤》本文介绍了如何在SpringBoot项目中配置路径映射,使得除static目录外的资源可被访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一...

SpringBoot路径映射

SpringBoot项目中,只有位于static中的资源可以直接被访问

(访问方式:http://主机:端口/资源名)

其他资源无法被直接访问

这时就需要进行路径映射配置

可以创建一个配置类,对其进行配置

// An highlighted block
@Configuration
public class WebMVCConfig extends WebMvcConfigurationSupport {

    // 路径映射配置
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {

        // 将网页地址栏中的 /order/**  映射到  工程类路径下的 /order/ 中,以访问resources/order中的资源
        registry.addResourceHandler("/order/**").addResourceLocations("classpath:/order/");
        // 磁盘目录
        String path = "E:\\xxx\\xxx\\";   
        // 将网页地址栏中的 /image/**  映射到  磁盘的某个目录下,以访问磁盘资源 
        registry.addResourceHandler("/image/**").addResourceLocations("file:" + path);
     
    }

}

如此,便实现了SpringBoot的资源路径映射配置。

补:springboot 配置虚拟路径映射 

我发现在很多springboot教程里几乎没有提到过URL映射,主要是很简单,看看代码基本上就明白了,我这里简单说一说,也说一说与Django的一点区别。

@RequestMapping注册URL映射

在Django中URL的映射是靠project里urls.py中的urlpatterns配置的,先说说Django怎么处理请求:

  • 一旦生成url页面请求,请求传递到urls.py;
  • Django去urlpatterns中匹配链接(Django会在匹配到的第一个就停下来);
  • 一旦匹配成功,就会去执行,path后面的方法,Django便会给出相应的view页面(该页面可以为一个python的函数,或者基于view(Django内置的)的类),也就是用户看到的页面;
  • 若匹配失败,则出现错误的页面。

类似地,在springboot中也要有一个URL映射关系,这样用户在访问URL链接时才能执行不同的逻辑, 这里提到的逻辑正是MCV模式里说的控制层(C层),因此URL的映射跟控制层有很大关联,在springboot里是在控制层直接通过注解的方式来完成的。通常的做法是:

  • 创建一个名为controller的包
  • 然后在这个包下创建各种Controller
  • 通过注解 @RequestMappingpython 来注册,实现URL的映射(也即访问URL时所执行的函数)。

可以先看一个简单的例子:

@RestController
@EnableAutoConfiguration
public class HelloController {
    @Value("${version}")
    private String version;

    @Autowired
    private StudentProperties studentChina编程_default;

    @Autowired
    private StudentTestBean student_test;

    @RequestMapping("/student")
    private String student(String name, Integer age) {
        if (name == null) {
            name = student_default.getName();
        }
        if (age == null) {
            age = student_default.getAge();
        }
        return String.format("Online: %s\nname: %s, age: %d\nname(Test): %s, age(Test): %d", version, name, age, student_test.getName(), student_test.getAge());
    }
}

通过@RequestMapping将**/student**映射到了HelloController的student函数,在运行项目时会看到springboot的输出日志:

2018-10-30 14:57:08.116  INFO 13692 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/student]}" onto private Java.lang.String com.example.useconfigurationproperties.HelloController.student(java.lang.String,java.lang.Integer)

在访问http://localhost:8080/student时,会调用HelloController的student函数。

@RequestMapping中的method没有默认值,如果不配置method,则以任何请求形式(RequestMethod.GET、RequestMethod.POST、RequestMethod.PUT、RequestMethod.DELETE)都可以访问得到。

这种设计方法稍微有点混乱,没有Django这种配置一个通用的表来的方便,Django的url映射关系很容易对比查看。而springboot的这种注解的方式就分散的比较零散,有时需要各个Controller点开查看。当然,也有一个稍微折中的办法,就是可以在Controller类上映射某个子目录URL,由该Controller类统一管理该子URL下的其他子URL,也就是分模块管理的思想,里面再做映射就是绑定到具体函数了,这样的效果看上去就不会那么乱了。

例如对于以下的代码,CourseController类统一映射到了http://localhost:8080/course,内部函数映射如下:

  • 访问http://localhost:8080/course时调用的是course函数
  • 访问http://localhost:8080/course/queryCourseList时调用的是queryCourse函数
  • 访问http://localhost:8080/course/add时调用的是addCourse函数
  • 访问http://localhost:8080/course/update时调用的是updateCourse函数
  • 访问http://localhost:8080/course/delete时调用的是deleteCourse函数
@Controller
@RequestMapping("/course")
public class CourseController extends BaseController {
    @Autowired
    private CourseService courseService;
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @RequestMapping("")
    public String course(Model model) {
        model.jsaddAttribute("ctx", getContextPath() + "/");
        return "courses";
    }

    /**
     * 查询教程列表
     *
     * @param page
     * @return
     */
    @RequestMapping(value = "/queryCourseList", method = RequestMethod.POST)
    @ResponseBody
    public AJAXObject queryCourse(Page<?> page) {
        PageHelper.startPage(page.getPage(), page.getRows());

        Map<String,Object> pageParams = new HashMap<String,Object>();
        pageParams.put("page", page.getPage());
        pageParams.put("rows", page.getRows());

        List<Course> courseList = courseService.queryList(pageParams);
        PageInfo<Course> pageInfo = new PageInfo<Course>(courseList);
        return AjaxObject.ok().put("page", pageInfo);bZjtr
    }

    /**
     * 新添教程
     *
     * @param course
     */
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    @ResponseBody
    public AjaxObject addCourse(@RequestBody Course course) {
        courseService.save(course);
        return AjaxObject.ok();
    }

    /**
     * 修改教程
     *
     * @param course
     */
    @RequestMapping(value = "/update", meth编程od = RequestMethod.POST)
    @ResponseBody
    public AjaxObject updateCourse(@RequestBody Course course) {
        (course.getAuthor() + "");
        courseService.update(course);
        return AjaxObject.ok();
    }

    /**
     * 删除教程
     *
     * @param ids
     */
    @RequestMapping(value = "/delete", method = RequestMethod.POST)
    @ResponseBody
    public AjaxObject deleteCourse(@RequestBody Long[] ids) {
        courseService.deleteByIds(ids);
        return AjaxObject.ok();
    }
}

Spring4.3以后为简化@RequestMapping(method = RequestMethod.XXX)的写法,故而将其做了一层包装,也就是现在的GetMapping、PostMapping、PutMapping、DeleteMapping、PatchMapping。

@Controller和@RestController的区别

@RestController注解相当于@ResponseBody + @Controller合在一起的作用。

如果只是使用@RestController注解Controller,则Controller中的方法无法返回JSP页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。

如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。如果需要返回jsON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

使用@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面。若返回json等内容到页面,则需要加@ResponseBody注解

到此这篇关于SpringBoot路径映射配置的实现步骤的文章就介绍到这了,更多相关SpringBoot路径映射 内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于SpringBoot路径映射配置的实现步骤的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155850

相关文章

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

Java Stream 并行流简介、使用与注意事项小结

《JavaStream并行流简介、使用与注意事项小结》Java8并行流基于StreamAPI,利用多核CPU提升计算密集型任务效率,但需注意线程安全、顺序不确定及线程池管理,可通过自定义线程池与C... 目录1. 并行流简介​特点:​2. 并行流的简单使用​示例:并行流的基本使用​3. 配合自定义线程池​示

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Java Kafka消费者实现过程

《JavaKafka消费者实现过程》Kafka消费者通过KafkaConsumer类实现,核心机制包括偏移量管理、消费者组协调、批量拉取消息及多线程处理,手动提交offset确保数据可靠性,自动提交... 目录基础KafkaConsumer类分析关键代码与核心算法2.1 订阅与分区分配2.2 拉取消息2.3

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service