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

