javascript
java中注解动态传参_SpringMVC之注解、传参、返回值及拦截器
1. 注解式開發(fā)之a(chǎn)nnotation-driven解釋
(1) mvc注解驅(qū)動(dòng)在哪個(gè)文件中配置?
Springmvc.xml
(2) 配置mvc注解驅(qū)動(dòng)使用哪個(gè)標(biāo)簽?
2. 注解式開發(fā)之視圖解析器
(1) 視圖解析器起到什么作用?
視圖解析器可以根據(jù)服務(wù)方法的返回值,自動(dòng)的拼接最終的viewName數(shù)據(jù).
(2) 視圖解析器如何使用?
3. 處理器方法常用參數(shù)
(1) 處理器方法的常用參數(shù)有哪些?
HttpServletRequest
HttpServletResponse
HttpSession
用于承載數(shù)據(jù)的Model、Map、ModelMap
請求中所攜帶的請求參數(shù)
(2) SpringMVC控制層常用的承載數(shù)據(jù)的對象有哪些?
Model、Map、ModelMap
4. 參數(shù)接收之逐個(gè)接收
(1) 在后端控制器中如何接收前臺(tái)參數(shù)?
注意:逐個(gè)接收時(shí),JSP頁面中的name值和后臺(tái)控制器中方法的形參名稱必須一致才可以。如果兩者不一致可以在形參前加注解@RequestPara(“請求參數(shù)名”)來指定該參數(shù)對應(yīng)的是哪個(gè)請求參數(shù)。
將jsp頁面中數(shù)據(jù)post提交給目標(biāo)方法的相對路徑
用戶名:
年齡:
在后端控制器目標(biāo)方法中將網(wǎng)頁提交的數(shù)據(jù)作為參數(shù)傳入,并通過ModelAndView對象添加對象,然后通過setViewName方法跳轉(zhuǎn)到其他頁面。
@RequestMapping("/hello")
public ModelAndView hello(String username,int age) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("username", username);
modelAndView.addObject("age", age);
modelAndView.setViewName("welcome");
return modelAndView;
}
(2) 在后端控制器中接收前臺(tái)“age”參數(shù),是否需要手動(dòng)轉(zhuǎn)換成int類型,為什么?
不需要,后端控制器自動(dòng)幫我們做了類型轉(zhuǎn)換。
5. 參數(shù)接收之對象整體接收
(1) 簡述以對象形式整體接收參數(shù)的步驟?
1-創(chuàng)建實(shí)體類
2-在后臺(tái)控制器的方法中傳入實(shí)體類對象作為參數(shù)。JSP頁面的請求數(shù)據(jù)都封存在了實(shí)體類對象中,根據(jù)對象的屬性來操作請求數(shù)據(jù)。
(2) 以對象形式整體接收參數(shù)有什么要求?
實(shí)體類的屬性名一定要和請求頁面中標(biāo)簽的name屬性值保持一致。
6. 參數(shù)接收之?dāng)?shù)組或集合接收參數(shù)
(1) 請簡述用數(shù)組或集合接收參數(shù)的步驟?
在數(shù)據(jù)提交頁面,多條數(shù)據(jù)輸入的name屬性值要保持一致:
Sing
Dance
Rap
Basketball
在后臺(tái)控制器中,方法參數(shù)中以數(shù)組或者集合的方式接收請求數(shù)據(jù):
@RequestMapping("/hello")
public void hello(String[] interest) {
for (String string : interest) {
System.out.println(string);
}
}
//集合接收參數(shù)
@RequestMapping("/hello")
public void hello1(@RequestParam List interest) {
for (String string : interest) {
System.out.println(string);
}
}
(2) 請描述數(shù)組和集合接收參數(shù)的區(qū)別?
使用結(jié)合接收請求參數(shù)需要借助@RequestParam來調(diào)整參數(shù)的格式,否則瀏覽器不能識(shí)別會(huì)報(bào)500錯(cuò)誤。而集合方式則不用。
7. 參數(shù)接收之域?qū)傩詤?shù)接收及restful風(fēng)格傳參
(1) 域?qū)傩詤?shù)的接收需要注意什么?
域?qū)傩詤?shù)接收頁面name的值命名規(guī)范是 屬性對象名.屬性對象的屬性名
例如:伙伴名稱:
(2) 什么是restful風(fēng)格傳參?
將參數(shù)以路徑的方式傳入,這種方式就叫做restful傳參。
比如:
后端控制器:
//后端控制器
@Controller //該注解代表當(dāng)前類交給spring容器管理
@Scope("prototype") //設(shè)置bean的作用域,默認(rèn)是singleton單態(tài)模式。
@RequestMapping("/springmvc") //該注解起到限定范圍的作用
public class MyController {
//restful風(fēng)格傳參
@RequestMapping("/{name}/{age}/hello")
public void hello1(@PathVariable String name,@PathVariable int age) {
System.out.println(name+age);
}
}
訪問時(shí)路徑:
http://localhost:8080/springmvc-09-receiveParameter-restful/springmvc/Lucas/12/hello
獲取參數(shù)。控制臺(tái)輸出Lucas12
8. 參數(shù)接收之接收json
(1) 如何在后端控制器中接收前臺(tái)傳過來的Json字符串?
在后端控制器的方法參數(shù)前使用@RequestBody來獲取請求體中的參數(shù)
例如:
//接收前臺(tái)JSON字符串
@RequestMapping("/hello")
public void hello1(@RequestBody User user) {
System.out.println(user);
}
(2) 如何將頁面中的Json對象轉(zhuǎn)換成Json字符串?
JSON.stringify(data1)
9. 獲取請求頭中信息@RequestHeader
(1) 請求頭中有哪些常用信息?
Host:主機(jī)信息
Cookie:cookie的jsessionid
(2) @RequestHeader該注解放到什么位置?
放在后臺(tái)控制器方法的參數(shù)之前。
10. 處理器方法返回值類型String
(1) 處理器方法何時(shí)使用String作為返回值類型?
只跳轉(zhuǎn)到視圖資源,不附帶數(shù)據(jù)的情況下,可以使用String作為返回值類型。
(2) 如果處理器方法返回值類型為String,默認(rèn)情況訪問該方法會(huì)如何跳轉(zhuǎn)?
根據(jù)返回的字符串再結(jié)合springmvc.xml文件中配置的視圖解析器完成跳轉(zhuǎn)頁面的路徑解析,然后跳轉(zhuǎn)到指定路徑的頁面。
如果返回的數(shù)據(jù)亂碼,可以在方法注解@RequestMapping中添加produces屬性來解決。
例如:@RequestMapping(value="/hello",produces="text/html;charset=utf-8")
11. 處理器方法無返回值void
(1) 如果處理器方法無返回值,那么能否進(jìn)行資源跳轉(zhuǎn)及傳遞數(shù)據(jù),如何實(shí)現(xiàn)?
可以。通過ajax來實(shí)現(xiàn)。同時(shí)可以借助HttpServletResponse對象來存儲(chǔ)數(shù)據(jù)。
(2) 何時(shí)處理器方法無返回值較合適?
頁面局部刷新的時(shí)候無返回值比較合適。因?yàn)榉祷刈址喈?dāng)于頁面跳轉(zhuǎn),整個(gè)頁面刷新,而局部刷新會(huì)節(jié)省資源,效率更高,用戶體驗(yàn)也更高。
12. 處理器方法返回值類型Object
(1) 如何將處理器方法返回值返回到前臺(tái)?
@ResponseBody //將當(dāng)前方法的返回值放到響應(yīng)體中,并且轉(zhuǎn)換成json格式,調(diào)用的是jackson包里面的方法。
13. 請求轉(zhuǎn)發(fā)與重定向
(1) 請描述請求轉(zhuǎn)發(fā)與重定向區(qū)別?
請求轉(zhuǎn)發(fā):服務(wù)器內(nèi)部的資源跳轉(zhuǎn),瀏覽器地址欄不變,是一次請求。
重定向:服務(wù)器在第一次請求進(jìn)行重定向后會(huì)返回給瀏覽器訪問另一個(gè)資源的響應(yīng),瀏覽器重新發(fā)送請求。地址欄會(huì)改變。是兩次不同的請求。如果要進(jìn)行數(shù)據(jù)的傳遞需要依賴session對象。
(2) 在javaEE中請求轉(zhuǎn)發(fā)和重定向是如何實(shí)現(xiàn)的?
modelAndView.setViewName("welcome");和返回字符串路徑的方式都是默認(rèn)請求轉(zhuǎn)發(fā)。
modelAndView.setViewName("redirect:/jsp/welcome.jsp");這種方式是重定向。重定向的視圖頁面需要借助param對象來獲取地址欄的請求參數(shù)。
14. 文件上傳
(1) 文件上傳時(shí),表單中添加了什么屬性,具體值是什么?
enctype="multipart/form-data"
(2) 使用springMVC進(jìn)行文件上傳時(shí),接收文件的參數(shù)類型是什么?
MultipartFile
15. 文件下載
(1) 該視頻中后端控制器方法的返回值類型是什么?
ResponseEntity
(2) 文件下載時(shí)后端控制器中涉及哪些步驟?
@RequestMapping("/fileDownload")
public ResponseEntity download() throws IOException{
//下載指定文件
File file = new File("d:/忘了他.jpg");
FileInputStream fis = new FileInputStream(file);
//創(chuàng)建字節(jié)數(shù)組,并且設(shè)置數(shù)組大小為預(yù)估的文件字節(jié)數(shù)
byte[] body = new byte[fis.available()];
//將輸入流中字符存儲(chǔ)到緩存數(shù)組中
fis.read(body);
//獲取下載顯示的文件名,并解決中文亂碼問題
String name = file.getName();
String downloadFileName = new String(name.getBytes("utf-8"),"ISO-8859-1");
//設(shè)置http響應(yīng)頭信息,并且通知瀏覽器以附件的形式進(jìn)行下載。
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Content-Disposition", "attachment;filename="+downloadFileName);
//設(shè)置Http響應(yīng)狀態(tài)信息
HttpStatus status = HttpStatus.OK;
ResponseEntity responseEntity = new ResponseEntity<>(body, httpHeaders, status);
return responseEntity;
}
16. 自定義攔截器
(1) 如何自定義攔截器?
//自定義攔截器
public class FirstInterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object obj, Exception exception)
throws Exception {
//該方法執(zhí)行時(shí)機(jī),所有工作處理完成之后,響應(yīng)給瀏覽器客戶端之前執(zhí)行
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
//該方法執(zhí)行時(shí)機(jī),處理器方法執(zhí)行之后執(zhí)行
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
//該方法執(zhí)行時(shí)機(jī),處理器方法執(zhí)行之前執(zhí)行
System.out.println("攔截器preHandle方法執(zhí)行");
return false;
}
}
(2) 如何注冊攔截器?
17. 自定義攔截器-添加攔截器后執(zhí)行流程(對應(yīng)31-32視頻)
(1) 自定義攔截器實(shí)現(xiàn)HandlerInterceptor接口需要實(shí)現(xiàn)哪些方法,這些方法分別是何時(shí)執(zhí)行?
preHandle:該方法執(zhí)行時(shí)機(jī),處理器方法執(zhí)行之前執(zhí)行;
postHandle:該方法執(zhí)行時(shí)機(jī),處理器方法執(zhí)行之后執(zhí)行;
afterCompletion:該方法執(zhí)行時(shí)機(jī),所有工作處理完成之后,響應(yīng)給瀏覽器客戶端之前執(zhí)行
(2) 程序中有多個(gè)攔截器,那么程序的執(zhí)行流程是怎樣的?
按照springmvc.xml中的配置先后順序依次執(zhí)行各個(gè)攔截器的preHandle方法。然后再逆序執(zhí)行各個(gè)攔截器的postHandle方法。等所有工作處理完成之后,響應(yīng)給瀏覽器客戶端之前再逆序執(zhí)行各個(gè)攔截器的afterCompletion方法。
18. Spring與SpringMVC父子容器關(guān)系解釋
(1) 簡述Spring與SpringMVC的關(guān)系?
在Spring整體框架的核心概念中,容器是核心思想,就是用來管理Bean的整個(gè)生命周期的,而在一個(gè)項(xiàng)目中,容器不一定只有一個(gè),Spring中可以包括多個(gè)容器,而且容器有上下層關(guān)系,目前最常見的一種場景就是在一個(gè)項(xiàng)目中引入Spring和SpringMVC這兩個(gè)框架,那么它其實(shí)就是兩個(gè)容器,Spring是父容器,SpringMVC是其子容器,并且在Spring父容器中注冊的Bean對于SpringMVC容器中是可見的,而在SpringMVC容器中注冊的Bean對于Spring父容器中是不可見的,也就是子容器可以看見父容器中的注冊的Bean,反之就不行。
總結(jié)
以上是生活随笔為你收集整理的java中注解动态传参_SpringMVC之注解、传参、返回值及拦截器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux mv 保持目录结构_Linu
- 下一篇: 原理解析_SpringBoot自动装配原