1. handler方法分析
/**
* TODO: 一個controller的方法是控制層的一個處理器,我們稱為handler
* TODO: handler需要使用@RequestMapping/@GetMapping系列,聲明路徑,在HandlerMapping中注冊,供DS查找!
* TODO: handler作用總結(jié):
* 1.接收請求參數(shù)(param,json,pathVariable,共享域等)
* 2.調(diào)用業(yè)務(wù)邏輯
* 3.響應(yīng)前端數(shù)據(jù)(頁面(不講解模版頁面跳轉(zhuǎn)),json,轉(zhuǎn)發(fā)和重定向等)
* TODO: handler如何處理呢
* 1.接收參數(shù): handler(形參列表: 主要的作用就是用來接收參數(shù))
* 2.調(diào)用業(yè)務(wù): { 方法體 可以向后調(diào)用業(yè)務(wù)方法 service.xx() }
* 3.響應(yīng)數(shù)據(jù): return 返回結(jié)果,可以快速響應(yīng)前端數(shù)據(jù)
*/
@GetMapping
public Object handler(簡化請求參數(shù)接收){
調(diào)用業(yè)務(wù)方法
返回的結(jié)果 (頁面跳轉(zhuǎn),返回數(shù)據(jù)(json))
return 簡化響應(yīng)前端數(shù)據(jù);
}
總結(jié):
請求數(shù)據(jù)接收,我們都是通過handler的形參列表
前端數(shù)據(jù)響應(yīng),我們都是通過handler的return關(guān)鍵字快速處理!
2. 頁面跳轉(zhuǎn)控制
https://blog.csdn.net/m0_59735420/article/details/128126514
2.1 返回模板視圖頁面
什么是返回模板視圖頁面?
當(dāng)http請求被controller中的handler處理時,有時需要指定響應(yīng)的頁面(返回本地的)
為什么要返回模板視圖頁面?
項目采用了前后端分離模式 ,前后端通信通過 API 接口完成,數(shù)據(jù)格式一般使用 JSON 或 XML。
目標 : 用戶訪問localhost:8080/jsp/index時,返回給用戶本地webapp-WEB-INF-view下的home.jsp頁面.
- pom文件添加jsp依賴
<!-- jsp需要依賴! jstl-->
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>3.0.0</version>
</dependency>
- 創(chuàng)建等會要返回的home.jsp頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!-- 可以獲取共享域的數(shù)據(jù),動態(tài)展示! jsp== 后臺vue -->
${msg}
</body>
</html>
- 新建一個MvcConfig類
//本類中要重寫handlerMapping,handlerAdapter兩個方法,配置一個json轉(zhuǎn)化器, 通過一個注解@EnableWebMvc實現(xiàn)
@EnableWebMvc //json數(shù)據(jù)處理,必須使用此注解,因為他會加入json處理器
@Configuration
@ComponentScan(basePackages = "com.atguigu.controller") //TODO: 進行controller掃描
//WebMvcConfigurer springMvc進行組件配置的規(guī)范,配置組件,提供各種方法! 前期可以實現(xiàn)
public class SpringMvcConfig implements WebMvcConfigurer {
//配置一個jsp對應(yīng)的視圖解析器
public void configureViewResolvers(ViewResolverRegistry registry) {
//Resigter可以幫忙添加前后綴
//稍后的handler中如果想給前端返回 /WEB-INF/views/index .jsp
registry.jsp("/WEB-INF/views/",".jsp");
}
}
- 編寫jspController類
/**
* 跳轉(zhuǎn)到提交文件頁面
*
* 如果要返回jsp頁面!
* 1.方法返回值改成字符串類型
* 2.返回邏輯視圖名即可
* <property name="prefix" value="/WEB-INF/views/"/>
* + 邏輯視圖名 +
* <property name="suffix" value=".jsp"/>
*/
//訪問localhost:8080/jsp/index時,返回給用戶本地webapp-WEB-INF-view下的home.jsp頁面.
@GetMapping("index")
public String jumpJsp(Model model){
System.out.println("FileController.jumpJsp");
return "home";
}
2.2 跳轉(zhuǎn)和重定向
重定向與跳轉(zhuǎn)的區(qū)別:
1.請求的次數(shù)的不同 : 重定向總共請求了兩次服務(wù)器;轉(zhuǎn)發(fā)則是用戶請求一次可能經(jīng)過N個JSP頁面由返回到用戶瀏覽器中,是一次請求多次處理的過程;
2.跳轉(zhuǎn)過程中鏈接的變化不同 : ,重定向在跳轉(zhuǎn)中請求了兩次服務(wù)器并且是兩次不同的鏈接地址,在瀏覽器的地址欄可以看到兩次是有變化的;轉(zhuǎn)發(fā)在跳轉(zhuǎn)過程中瀏覽器請求了一次服務(wù)器,服務(wù)器經(jīng)過了n個JSP頁面并沒有改變請求的鏈接地址,因為用戶只請求了一次,所以在整個跳轉(zhuǎn)過程中鏈接地址是沒有改變的,在瀏覽器的地址欄就可以看到
3.目的不同 : 重定向只是簡單的讓用戶訪問一個新的鏈接,而轉(zhuǎn)發(fā)是服務(wù)器要得到用戶的請求內(nèi)容并需要進行一部分處理的,所以兩者目的之不同的
- 不管是重定向(redirect)還是轉(zhuǎn)發(fā)(forward),其handler都要設(shè)置String類型
- 語法為 return 關(guān)鍵字: /路徑,不需要額外注解
- @ResponseBody注解和轉(zhuǎn)發(fā)/重定向是互斥的。@ResponseBody注解的類會快速返回,不走視圖解析器,也不會再轉(zhuǎn)發(fā)/重定向。
- 注意:如果是項目下的資源,轉(zhuǎn)發(fā)和重定向都一樣都是項目下路徑!都不需要添加項目根路徑!
@RequestMapping("/redirect-demo")
public String redirectDemo() {
// 重定向到 /demo 路徑
return "redirect:/demo";
}
@RequestMapping("/forward-demo")
public String forwardDemo() {
// 轉(zhuǎn)發(fā)到 /demo 路徑
return "forward:/demo";
}
3.返回JSON數(shù)據(jù)
- 如上章接收JSON數(shù)據(jù)一樣,涉及JSON必須要添加依賴以及在config類中配置JSON轉(zhuǎn)換器(@EnableWebMvc)。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.0</version>
</dependency>
- 如上章接收JSON數(shù)據(jù)一樣(@RequestBody),使用@ResponseBody注解返回JSON數(shù)據(jù),該注解的作用在于將返回的對象序列化為 JSON 或 XML 格式的數(shù)據(jù),并發(fā)送給客戶端。
- 需注意的是ResponseBody不經(jīng)過視圖解析器,且與轉(zhuǎn)發(fā)/重定向互斥。
@GetMapping("/accounts/{id}")
@ResponseBody
public Object handle() {
// ...
return obj;
}
測試方法:
@Controller
@RequestMapping(value = "/user/detail", method = RequestMethod.POST)
@ResponseBody
public User getUser(@RequestBody User userParam) {
System.out.println("userParam = " + userParam);
User user = new User();
user.setAge(18);
user.setName("John");
//返回的對象,會使用jackson的序列化工具,轉(zhuǎn)成json返回給前端!
return user;
}
合并兩條注解:
@Controller+@ResponseBody = @RestController
3.返回靜態(tài)資源
什么是靜態(tài)資源?
資源本身已經(jīng)是可以直接拿到瀏覽器上使用的程度了,不需要在服務(wù)器端做任何運算、處理。典型的靜態(tài)資源包括:
- 純HTML文件/圖片
- CSS文件
- JavaScript文件
如何讓外部能夠訪問靜態(tài)資源?文章來源:http://www.zghlxwxcb.cn/news/detail-802448.html
- DispatcherServlet 的 url-pattern 配置的是“/”,表示整個 Web 應(yīng)用范圍內(nèi)所有請求都由 SpringMVC 來處理
- 而對 SpringMVC 來說,若想某個url被后臺處理,必須將這個urll用 @RequestMapping 綁定到某個handler上,才能找到處理請求的方法,否則handlermapping(秘書)無法知道找哪個handler(打工人)處理這個鏈接。
- 因此,思路是顯然的,那就是想辦法讓系統(tǒng)知道,如果請求的是url是xxx/xxx/car.jpg , 那就從靜態(tài)資源中直接提取而不是找handler(靜態(tài)資源不可能存進handler里)。
- 準備好靜態(tài)資源并編譯:
2. 在config類中開啟靜態(tài)資源處理:
@EnableWebMvc //json數(shù)據(jù)處理,必須使用此注解,因為他會加入json處理器
@Configuration
@ComponentScan(basePackages = "com.sunsplanter.controller") //
//WebMvcConfigurer springMvc進行組件配置的規(guī)范,配置組件,提供各種方法!
public class SpringMvcConfig implements WebMvcConfigurer {
//開啟靜態(tài)資源處理
//處理的順序是DispatcherServlet --> handlerMapping -->沒找到就去找靜態(tài)資源
//平時第二步走完就結(jié)束,該方法多走一步為了找到靜態(tài)資源
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
訪問localhost:8080/images/car.jpg , 可以正常顯示.文章來源地址http://www.zghlxwxcb.cn/news/detail-802448.html
到了這里,關(guān)于04 SpringMVC響應(yīng)數(shù)據(jù)之頁面跳轉(zhuǎn)控制+返回JSON數(shù)據(jù)+返回靜態(tài)資源的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!