springMvc02

響應數據和結果視圖


  1. 返回值
    1. 返回String:
      • 返回的字符串會被springMvc解析成視圖, 而後返回, 若是沒有這個資源會報錯
        • 如: 代碼中返回 "success", 在通過springMvc解析後(配置文件添加了後綴".html"), 會轉發到success頁面
        • 字符串能夠這麼寫:
          1. "forward:/success": 表示轉發到success頁面, 默認就是轉發
          2. "redirect:/success.jsp": 表示重定向到success.jsp頁面, 用這中寫法的時候, 須要寫去掉項目名的全路徑
    2. 返回void:
      • 在方法中經過HttpServletRequest和HttpServletResponse處理業務並設置轉發或者重定向後, 就沒有必要有返回值了, 能夠聲明方法返回void
      • 若是方法中沒有設置結果視圖(轉發或重定向)直接生命返回void會致使棧溢出
    3. 返回ModelAndView
      • ModelAndView是SpringMVC爲咱們提供的一個對象, 該對象也能夠用做控制器方法的返回值. 並且, 當咱們返回其餘類型值的時候, SpringMvc也會將返回的對象封裝爲ModelAndView對象, 而後再進行處理
      • ModelAndView對象中的方法:
        • ModelAndView addAllObjects(@Nullable Map<String, ?> modelMap)
          | ModelAndView addObject(Object attributeValue)
          | ModelAndView addObject(String attributeName, Object attributeValue)
          • 這幾個方法接收的參數 在通過 springMvc 處理後會將對象放在 request 域中, 而返回 ModelAndView 方便了鏈式編程
        • void setViewName(@Nullable String viewName) | void setView(@Nullable View view)
          • 設置結果視圖, 一般會用 void setViewName(@Nullable String viewName)
  2. ResponseBody響應Json數據
    1. 導入jackson依賴:javascript

      <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.10.0</version>
      </dependency>
    2. 使用@ResponseBody註解實現將controller方法返回對象轉換爲json響應給客戶端
      • Springmvc默認用MappingJacksonHttpMessageConverter對json數據進行轉換, 須要加入jackson的包(依賴)
    3. 編碼:
      • controller(由於要看效果, 因此就直接寫了)css

        @ResponseBody
        @RequestMapping("testJson")
        public User testJson() {
            return new User("李四", 24);
        }
      • javascripthtml

        <script src="js/jquery-3.4.1.min.js"></script>
        <script type="text/javascript">
            $(() => {
                $("#jsonBtn").click(() => {
                    $.ajax({
                        url: "resp/testJson",
                        dataType: "JSON",
                        success: (data) => {
                            console.log(data);
                        }
                    });
                });
            })
        </script>
      • 注意: 須要設置靜態資源放行才能訪問靜態資源(js, css, html) ====> <mvc:default-servlet-handler/>
      • 運行結果
        運行結果
  3. 文件上傳
    1. 必要條件:
      • form表單的enctype取值必須是: multipart/form-data
        • enctype:是表單請求正文的類型, 默認值是: application/x-www-form-urlencoded
      • method屬性取值必須是Post
      • 提供一個文件選擇域<input type=」file」 />
    2. 用springMvc實現文件上傳
      1. springMvc文件上傳須要用到fileupload組件:java

        <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.3.3</version>
        </dependency>
      2. 編寫頁面jquery

        <form action="fileupload" method="post" enctype="multipart/form-data">
          file: <input type="file" name="file"/><br>
          <button type="submit">提交</button>
        </form>
      3. 編寫Controllergit

        @RequestMapping("/testFileupload")
        public String testFileupload(HttpServletRequest request, @RequestParam("upload") MultipartFile file) throws IOException {
            System.out.println("testFileupload running...");
            String path = request.getSession().getServletContext().getRealPath("/upload/");
            File upload = new File(path);
            if (!upload.exists()) {
                if (!upload.mkdirs()) {
                    throw new RuntimeException("文件夾建立失敗");
                }
            }
            // 獲取post中的name的值
            System.out.println(file.getName());
            // 文件的MIME類型
            System.out.println(file.getContentType());
            // 文件名, 帶後綴
            System.out.println(file.getOriginalFilename());
            file.transferTo(new File(path + UUID.randomUUID() + file.getOriginalFilename()));
        
            return "redirect:/success.jsp";
        }
      4. 配置解析器github

        <!-- 配置文件解析器 -->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <property name="maxUploadSize" value="10485760"/>
        </bean>
        • 注意: bean的id是固定值: multipartResolver, 不能更改
  4. 跨服務器文件上傳: 分服務器處理的目的是讓服務器各司其職, 從而提升咱們項目的運行效率
    1. 跨服務器文件上傳須要用到的組件的依賴:web

      <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
        <version>1.19.1</version>
      </dependency>
    2. 編寫頁面ajax

      <form action="testFileupload2Server" method="post" enctype="multipart/form-data">
        file: <input type="file" name="upload"/><br>
        <button type="submit">提交</button>
      </form>
    3. 編寫Controllerspring

      @RequestMapping("/testFileupload2Server")
      public String testFileupload2Server(HttpServletRequest request, @RequestParam("upload") MultipartFile file) throws IOException {
          System.out.println("testFileupload2Server running...");
          String path = "http://localhost:9090/springMvc02_file/upload/";
          // 建立客戶端對象
          Client client = Client.create();
          // 與圖片服務器鏈接
          WebResource resource = client.resource(path + UUID.randomUUID() + file.getOriginalFilename());
          // 上傳文件
          resource.put(file.getBytes());
      
          return "redirect:/success.jsp";
      }
    4. 配置解析器
      • 與上面同樣:

        <!-- 配置文件解析器 -->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <property name="maxUploadSize" value="10485760"/>
        </bean>
        • 注意: bean的id是固定值: multipartResolver, 不能更改
    5. 建立文件服務器, 須要注意服務器的端口號要改一下
  5. springMvc的異常處理
    • 咱們能夠定義一個異常處理器來處理異常
      1. 編寫異常處理器類(實現HandlerExceptionResolver接口便可)

        public class ExceptionResolver implements HandlerExceptionResolver {
            @Override
            public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {
                System.out.println("出異常了");
                ModelAndView mv = new ModelAndView();
                // 能夠有日誌記錄的相關操做, 而後轉發(重定向)到指定頁面
                mv.setViewName("error");
        
                return mv;
            }
        }
      2. 配置異常處理器到spring容器中

        <bean id="exceptionResolver" class="cn.ann.web.resolver.ExceptionResolver"/>
  6. springMvc的攔截器
    1. 攔截器是什麼
      • 語義與過濾器差很少, 有點輕微的區別
      • 攔截器是springMvc的, springMvc框架可使用, 過濾器任何Java web工程均可以使用
      • 過濾器在配置了 /* 之後會過濾全部的請求, 攔截器只會攔截訪問的Controller方法, 若是是jsp, js, css等則不會攔截
      • 攔截器是AOP思想的具體應用. 要自定義攔截器, 須要實現 HandleInterceptor 接口
    2. 自定義攔截器(須要實現HandlerInterceptor)
      1. HandlerInterceptor
        1. boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
          • 預處理, 返回true放行, 返回false不放行
        2. void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mav)
          • 後處理
        3. void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
          • 請求響應完成後, 最後才執行的方法
      2. 配置攔截器

        <mvc:interceptors>
            <mvc:interceptor>
                <!-- 配置攔截什麼 -->
                <mvc:mapping path="/**"/>
                <!-- 配置不攔截什麼 -->
                <!-- <mvc:exclude-mapping path=""/> -->
                <!-- 指定自定義攔截器對象 -->
                <bean class="cn.ann.web.interceptor.MyInterceptor"/>
            </mvc:interceptor>
            <mvc:interceptor>
                <mvc:mapping path="/**"/>
                <!-- <mvc:exclude-mapping path=""/> -->
                <bean class="cn.ann.web.interceptor.MyInterceptor2"/>
            </mvc:interceptor>
        </mvc:interceptors>
      3. 執行順序
        執行順序


本文代碼: 此處的 springMvc02

相關文章
相關標籤/搜索