本篇博客只是記錄一些零碎的SpringMvc知識點,方便後續查看,沒有什麼特殊的地方。
目錄
本篇博客只是記錄一些零碎的SpringMvc知識點,方便後續查看,沒有什麼特殊的地方。
1: controller中定義的方法參數可以爲空,如果想獲取Servlet原生Api可以直接加上如下參數:
public String getUser(HttpServletRequest request, HttpServletResponse response){}
2:參數綁定的。
1)前端如果傳遞的參數名稱和方法中的參數名稱一致就會自動封裝。
2)參數中的接收參數也可以直接爲一個對象。但是要保證,前端提交的form表單中的屬性名稱和JavaBean中的屬性名稱一致。
3)如果接收對象中還有引用別的對象的屬性也想封裝數據,那表單提交中的屬性名爲: 接收對象中引用對象的屬性名.引用對象中屬性名
4)如果接收對象中還有集合,map屬性,想封裝,表單中的屬性名要用: 接受對象中集合屬性名[0].集合中對象屬性名或 接收對象中map屬性名[‘key’]來傳遞。
5)如果某個字段表單和controller方法中的形參無法保持一致,在方法的形參之前可以用@RequestParam("xxx")來手動匹配。
3:常用註解
1)@RequestBody, 寫在controller的方法的String形參之前,可以直接得到前端的請求body,方便直接進行對象轉換。或者直接加載實體類的參數前可以直接把前端的json數據封裝到對象裏面去。
2)@PathVaribale ,獲取rest請求風格中的請求路徑中的參數。
3)@CookieValue('xxx') ,獲取cookie中的某個key對應的value。也是寫在形參之前.
4)@ModelAttribute :
可以在方法上使用先處理數據,然後返回出來讓下一個方法繼續處理。
如果修飾沒有返回值的方法,可以在形參上加一個Map屬性,把它放進去,然後在另外一個方法上獲取。
關於它更詳細的介紹可以參考此博客: ModelAttribute
5)@SessionAttribute
作用:用於多次執行控制器方法間的參數共享。作用在類上。某個方法中存入request域中屬性通過註解中的value屬性
放入到session中,其他方法可以直接獲取。
屬性:value:用於指定存入的屬性名稱 type:用於指定存入的數據類型。
4:controller方法中返回值類型
1:在類上面加@Controller註解表示返回結果會配合視圖解析器用,返回的字符串會找到對應的jsp。
2: 在類上面加@RestController註解表示返回結果可以直接爲String,但是不會經過視圖解析器,返回的字符串直接返回給前端。
3: 如果方法的返回值爲空,方法可以重定向或者請求轉發給下一個頁面。
請求轉發:
@GetMapping("/testRequest")
public void testRest(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/jsp/request.jsp").forward(request,response);
return;
}
重定向:
@GetMapping("/testRediredct")
public void testRediredct(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect(request.getContextPath()+"/testRequest");
return;
}
4:ModelAndView
在方法中使用這個對象,可以直接把數據和返回的頁面設置好。model.addObject(key,value) 和model.setViewName("xxx");
5:使用關鍵字跳轉頁面。重定向和請求轉發也可以使用關鍵字來實現,只是寫法不一樣。而且重定向的時候不用寫全路徑了。
5:文件上傳
注意前端上傳文件的媒體類型以及input的標籤的屬性名字也要和MultipartFile 的對象名保持一致。
1:本地文件上傳後臺處理流程:
2:跨服務器上傳,文件:需要使用其他jar包,jersey-client。
6:異常處理
SpringMvc發生異常之後可以自己定義處理邏輯,定義頁面和異常來返回。自己定義異常類繼承Exception。然後實現自定義的異常處理類既可以處理異常了。
@Service
public class ExceptionFilter implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
EntityException exception=null;
if (e instanceof Exception){
exception=(EntityException)e;
}else{
exception=new EntityException("系統在維護中");
}
modelAndView.addObject("error",exception.getErrorMessage());
modelAndView.setViewName("error");
return modelAndView;
}
}
@GetMapping("/errorTest")
public void testError () throws EntityException {
try {
int i= 10/0;
}catch (Exception e){
throw new EntityException("發生錯誤了");
}
return;
}
7:攔截器
SpringMvc的攔截器類似於Servlet開發中的過濾器Filter,用於對處理器進行預處理和後處理。和過濾器類似也有攔截器鏈。
雖然它和過濾器很像,但也不是完全一樣的。區別如下:
過濾器是servlet規範中的一部分,任何java web項目都可以使用。
攔截器是SpringMvc框架自己的,只有使用了SpringMvc框架工程才能用。
過濾器是在url-parttern中配置了/*之後,可以對所有要訪問的資源進行攔截,包括靜態資源。
攔截器它只會攔截訪問的控制器方法,如果訪問的是jsp,html,css,image或者js,是不會進行攔截的。
它是AOP思想的具體應用。我們要自定義攔截器,要實現HandlerInterceptor接口。
在SpringBoot中可以按如下方式進行攔截器配置。
自定義攔截器內容如下:
public class MyInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("請求controller之前執行");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("請求controller之後執行");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("視圖渲染完執行,一般清除資源");
}
}
添加到配置中:如果有多個攔截器的話,就addInterceptor添加多個。
@Configuration
public class SpringMvcConfigure extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
這個請求就會經過我們定義的攔截器。