SpringMvc知識點記錄

本篇博客只是記錄一些零碎的SpringMvc知識點,方便後續查看,沒有什麼特殊的地方。

目錄

本篇博客只是記錄一些零碎的SpringMvc知識點,方便後續查看,沒有什麼特殊的地方。

2:參數綁定的。

3:常用註解

4:controller方法中返回值類型

​5:文件上傳

6:異常處理

7:攔截器


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);
    }

}

這個請求就會經過我們定義的攔截器。

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章