SpringBoot路徑映射配置的實(shí)現(xiàn)步驟
SpringBoot路徑映射
SpringBoot項(xiàng)目中,只有位于static中的資源可以直接被訪問(wèn)
(訪問(wèn)方式:http://主機(jī):端口/資源名)
其他資源無(wú)法被直接訪問(wèn)
這時(shí)就需要進(jìn)行路徑映射配置
可以創(chuàng)建一個(gè)配置類(lèi),對(duì)其進(jìn)行配置
// An highlighted block @Configuration public class WebMVCConfig extends WebMvcConfigurationSupport { // 路徑映射配置 @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { // 將網(wǎng)頁(yè)地址欄中的 /order/** 映射到 工程類(lèi)路徑下的 /order/ 中,以訪問(wèn)resources/order中的資源 registry.addResourceHandler("/order/**").addResourceLocations("classpath:/order/"); // 磁盤(pán)目錄 String path = "E:\\xxx\\xxx\\"; // 將網(wǎng)頁(yè)地址欄中的 /image/** 映射到 磁盤(pán)的某個(gè)目錄下,以訪問(wèn)磁盤(pán)資源 registry.addResourceHandler("/image/**").addResourceLocations("file:" + path); } }
如此,便實(shí)現(xiàn)了SpringBoot的資源路徑映射配置。
補(bǔ):springboot 配置虛擬路徑映射
我發(fā)現(xiàn)在很多springboot教程里幾乎沒(méi)有提到過(guò)URL映射,主要是很簡(jiǎn)單,看看代碼基本上就明白了,我這里簡(jiǎn)單說(shuō)一說(shuō),也說(shuō)一說(shuō)與Django的一點(diǎn)區(qū)別。
@RequestMapping注冊(cè)URL映射
在Django中URL的映射是靠project里urls.py中的urlpatterns配置的,先說(shuō)說(shuō)Django怎么處理請(qǐng)求:
- 一旦生成url頁(yè)面請(qǐng)求,請(qǐng)求傳遞到urls.py;
- Django去urlpatterns中匹配鏈接(Django會(huì)在匹配到的第一個(gè)就停下來(lái));
- 一旦匹配成功,就會(huì)去執(zhí)行,path后面的方法,Django便會(huì)給出相應(yīng)的view頁(yè)面(該頁(yè)面可以為一個(gè)Python的函數(shù),或者基于view(Django內(nèi)置的)的類(lèi)),也就是用戶(hù)看到的頁(yè)面;
- 若匹配失敗,則出現(xiàn)錯(cuò)誤的頁(yè)面。
類(lèi)似地,在springboot中也要有一個(gè)URL映射關(guān)系,這樣用戶(hù)在訪問(wèn)URL鏈接時(shí)才能執(zhí)行不同的邏輯, 這里提到的邏輯正是MCV模式里說(shuō)的控制層(C層),因此URL的映射跟控制層有很大關(guān)聯(lián),在springboot里是在控制層直接通過(guò)注解的方式來(lái)完成的。通常的做法是:
- 創(chuàng)建一個(gè)名為controller的包
- 然后在這個(gè)包下創(chuàng)建各種Controller
- 通過(guò)注解 @RequestMapping 來(lái)注冊(cè),實(shí)現(xiàn)URL的映射(也即訪問(wèn)URL時(shí)所執(zhí)行的函數(shù))。
可以先看一個(gè)簡(jiǎn)單的例子:
@RestController @EnableAutoConfiguration public class HelloController { @Value("${version}") private String version; @Autowired private StudentProperties student_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()); } }
通過(guò)@RequestMapping將**/student**映射到了HelloController的student函數(shù),在運(yùn)行項(xiàng)目時(shí)會(huì)看到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)
在訪問(wèn)http://localhost:8080/student時(shí),會(huì)調(diào)用HelloController的student函數(shù)。
@RequestMapping中的method沒(méi)有默認(rèn)值,如果不配置method,則以任何請(qǐng)求形式(RequestMethod.GET、RequestMethod.POST、RequestMethod.PUT、RequestMethod.DELETE)都可以訪問(wèn)得到。
這種設(shè)計(jì)方法稍微有點(diǎn)混亂,沒(méi)有Django這種配置一個(gè)通用的表來(lái)的方便,Django的url映射關(guān)系很容易對(duì)比查看。而springboot的這種注解的方式就分散的比較零散,有時(shí)需要各個(gè)Controller點(diǎn)開(kāi)查看。當(dāng)然,也有一個(gè)稍微折中的辦法,就是可以在Controller類(lèi)上映射某個(gè)子目錄URL,由該Controller類(lèi)統(tǒng)一管理該子URL下的其他子URL,也就是分模塊管理的思想,里面再做映射就是綁定到具體函數(shù)了,這樣的效果看上去就不會(huì)那么亂了。
例如對(duì)于以下的代碼,CourseController類(lèi)統(tǒng)一映射到了http://localhost:8080/course,內(nèi)部函數(shù)映射如下:
- 訪問(wèn)http://localhost:8080/course時(shí)調(diào)用的是course函數(shù)
- 訪問(wèn)http://localhost:8080/course/queryCourseList時(shí)調(diào)用的是queryCourse函數(shù)
- 訪問(wèn)http://localhost:8080/course/add時(shí)調(diào)用的是addCourse函數(shù)
- 訪問(wèn)http://localhost:8080/course/update時(shí)調(diào)用的是updateCourse函數(shù)
- 訪問(wèn)http://localhost:8080/course/delete時(shí)調(diào)用的是deleteCourse函數(shù)
@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.addAttribute("ctx", getContextPath() + "/"); return "courses"; } /** * 查詢(xún)教程列表 * * @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); } /** * 新添教程 * * @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", method = 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以后為簡(jiǎn)化@RequestMapping(method = RequestMethod.XXX)的寫(xiě)法,故而將其做了一層包裝,也就是現(xiàn)在的GetMapping、PostMapping、PutMapping、DeleteMapping、PatchMapping。
@Controller和@RestController的區(qū)別
@RestController注解相當(dāng)于@ResponseBody + @Controller合在一起的作用。
如果只是使用@RestController注解Controller,則Controller中的方法無(wú)法返回jsp頁(yè)面,或者h(yuǎn)tml,配置的視圖解析器 InternalResourceViewResolver不起作用,返回的內(nèi)容就是Return 里的內(nèi)容。
如果需要返回到指定頁(yè)面,則需要用 @Controller配合視圖解析器InternalResourceViewResolver才行。如果需要返回JSON,XML或自定義mediaType內(nèi)容到頁(yè)面,則需要在對(duì)應(yīng)的方法上加上@ResponseBody注解。
使用@Controller 注解,在對(duì)應(yīng)的方法上,視圖解析器可以解析return 的jsp,html頁(yè)面,并且跳轉(zhuǎn)到相應(yīng)頁(yè)面。若返回json等內(nèi)容到頁(yè)面,則需要加@ResponseBody注解
到此這篇關(guān)于SpringBoot路徑映射配置的實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)SpringBoot路徑映射 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot 項(xiàng)目中的圖片處理策略之本地存儲(chǔ)與路徑映射
- Springboot如何通過(guò)路徑映射獲取本機(jī)圖片資源
- SpringBoot Web開(kāi)發(fā)之系統(tǒng)任務(wù)啟動(dòng)與路徑映射和框架整合
- SpringBoot重寫(xiě)addResourceHandlers映射文件路徑方式
- springboot文件虛擬路徑映射方式
- 使用springboot訪問(wèn)圖片本地路徑并映射成url
- 使用SpringBoot設(shè)置虛擬路徑映射絕對(duì)路徑
- SpringBoot路徑映射實(shí)現(xiàn)過(guò)程圖解
- SpringBoot圖片上傳和訪問(wèn)路徑映射
相關(guān)文章
Spring?@Bean?修飾方法時(shí)注入?yún)?shù)的操作方法
對(duì)于 Spring 而言,IOC 容器中的 Bean 對(duì)象的創(chuàng)建和使用是一大重點(diǎn),Spring 也為我們提供了注解方式創(chuàng)建 bean 對(duì)象:使用 @Bean,這篇文章主要介紹了Spring?@Bean?修飾方法時(shí)如何注入?yún)?shù),需要的朋友可以參考下2023-10-10Java實(shí)現(xiàn)圖片翻轉(zhuǎn)以及任意角度旋轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)圖片翻轉(zhuǎn)以及任意角度旋轉(zhuǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01Java使用BigDecimal公式精確計(jì)算及精度丟失問(wèn)題
在工作中經(jīng)常會(huì)遇到數(shù)值精度問(wèn)題,比如說(shuō)使用float或者double的時(shí)候,可能會(huì)有精度丟失問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Java使用BigDecimal公式精確計(jì)算及精度丟失問(wèn)題的相關(guān)資料,需要的朋友可以參考下2023-01-01解決springboot 獲取form-data里的file文件的問(wèn)題
這篇文章主要介紹了解決springboot 獲取form-data里的file文件的問(wèn)題的相關(guān)資料,這里提供了詳細(xì)的解決步驟,需要的朋友可以參考下2017-07-07Spring @Environment典型用法實(shí)戰(zhàn)案例
在使用Spring框架進(jìn)行Java開(kāi)發(fā)時(shí),我們經(jīng)常使用@Value和@Environment注解來(lái)注入配置文件中的值,這篇文章主要介紹了Spring @Environment典型用法的相關(guān)資料,需要的朋友可以參考下2025-06-06Springboot基礎(chǔ)之RedisUtils工具類(lèi)
本文來(lái)說(shuō)下RedisUtils工具類(lèi),主要介紹了整合Redis、MyBatis,封裝RedisUtils工具類(lèi)等知識(shí),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05解決SpringMVC獲取請(qǐng)求參數(shù)亂碼問(wèn)題
在使用SpringMVC和thymeleaf進(jìn)行請(qǐng)求參數(shù)處理時(shí),可能會(huì)遇到亂碼問(wèn)題,對(duì)于GET方法亂碼,可通過(guò)修改Tomcat的server.xml文件,添加URIEncoding="UTF-8"解決,而POST方法亂碼,則需在web.xml配置SpringMVC提供的過(guò)濾器2024-11-11Java?AQS?線程安全同步隊(duì)列的實(shí)現(xiàn)
AQS 同步隊(duì)列是很多的 Java 線程安全對(duì)象的實(shí)現(xiàn),例如 ReentrantLock, Semaphore, CountDownLatch, ReentrantReadWriteLock 等等,本文就介紹了Java?AQS?線程安全同步隊(duì)列的實(shí)現(xiàn),感興趣的可以了解一下2023-08-08