JavaWeb筆記(29)-SpringMVC深入

  1. SpringMVC的響應數據
1. 返回值爲字符串:
    * 無關鍵字:表示跳轉到對應的jsp頁面,通過視圖解析器查找相應資源
    * 關鍵字:
        forward:/WEB-INF/pages/success.jsp
        redirect:/index.jsp
2. 返回值爲void:
    表示默認跳轉到該RequestMapping中path屬性值的jsp頁面
    * 參數列表傳入HttpServletRequest和HttpServletResponse對象,然後調用重定向或者轉發方法
        request轉發需要手動寫全資源文件在本項目的路徑
        response重定向構建路徑時需要加上request》getContextPath()前綴
3. 返回值爲ModelAndView對象:
    ModelAndView對象是Spring提供的一個對象,可以用來調整具體的JSP視圖
    * 在方法中創建一個ModelAndView對象
    * 使用ModelAndView對象的addObject方法可以將屬性和值存入到request域中
    * 使用ModelAndView對象的setViewName方法可以跳轉到指定頁面(通過視圖解析器來查找指定頁面)
  1. SpringMVC實現異步請求
1. 出現問題:
    a. DispatcherServlet控制器攔截了所有請求,此時需要釋放關於靜態資源的請求
        在/resource/springmvc.xml配置中前端控制器,相應靜態資源不攔截
        <!-- 設置靜態資源不過濾 -->
        <mvc:resources location="/css/" mapping="/css/**"/> <!-- 樣式 -->
        <mvc:resources location="/images/" mapping="/images/**"/> <!-- 圖片 -->
        <mvc:resources location="/js/" mapping="/js/**"/> <!-- javascript -->
2. 加載jQuery文件
3. 導入jar包,用於解析json數據
    ackson-databind.jar
    jackson-core.jar
    ackson-annotations.jar
4. 使用@RequestBody註解可以自動調用相應jar包將json字符串封裝到Bean對象中
5. 使用@ResopnseBody註解可以自動調用相應jar包將Bean對象轉化爲json格式字符串
6. 使用:
    //頁面加載後發送異步請求
    $(function(){
        // 綁定點擊事件
        $("#btn").click(function(){
            $.ajax({
                url:"user/testJson",
                contentType:"application/json;charset=UTF-8",
                data:'{"addressName":"哈哈","addressNum":100}',
                dataType:"json",
                type:"post",
                success:function(data){
                    alert(data);
                    alert(data.addressName);
                }
            });
        });
    });
    //在方法中使用註解自動調用相應jar包來轉化
    @RequestMapping("/testJson")
    public @ResponseBody Address testJson(@RequestBody Address address) {
        System.out.println(address);
        //可以修改對象屬性
        address.setAddressName("上海");
        return address;
    }
  1. SpringMVC實現文件管理
1. 前提:
    a. enctype屬性:表單請求正文的類型
        form表單的enctype取值必須是:multipart/form-data
        默認值爲:application/x-www-form-urlencoded
    b. method屬性:表單提交方式
        必須爲post(可以上傳不限制大小的文件)
    c. 提供一個文件選擇域:
        <input type="file" />
2. 導入相關jar包
    commons-fileupload.jar
    commons-io.jar
3. 傳統方式實現文件上傳:
    @Controller
    @RequestMapping(value="/fileupload")
    public String fileupload(HttpServletRequest request) throws Exception {
        // 先獲取到要上傳的文件目錄
        String path = request.getSession().getServletContext().getRealPath("/uploads");
        // 創建File對象,一會向該路徑下上傳文件
        File file = new File(path);
        // 判斷路徑是否存在,如果不存在,創建該路徑
        if(!file.exists()) {
            file.mkdirs();
        }
        //存在該路徑時,創建磁盤文件項工廠
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload fileUpload = new ServletFileUpload(factory);
        // 解析request對象
        List<FileItem> list = fileUpload.parseRequest(request);
        // 遍歷
        for (FileItem fileItem : list) {
            // 判斷文件項是普通字段,還是上傳的文件
            if(fileItem.isFormField()) {
            }else {
                // 上傳文件項
                // 獲取到上傳文件的名稱
                String filename = fileItem.getName();
                // 上傳文件
                fileItem.write(new File(file, filename));
                // 刪除臨時文件
                fileItem.delete();
            }
        }
        return "success";
    }
4. 基於SpringMVC框架實現文件上傳
    * 配置好文件解析器後,不再需要自己去解析request域來獲取文件對象
    * 文件解析器配置的id值必須爲multipartResolver
    * 直接在對應的方法參數中傳入MultipartFile對象作爲參數,框架自動封裝文件對象到該變量中去
    * 此時,要求表單中file類型的input標籤其name屬性值必須與MultipartFile類型變量名相同
    /resource/springmvc.xml
    <!-- 配置文件解析器對象,要求id名稱必須是multipartResolver -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"/>
    </bean>
    
    /Upload.java
    @RequestMapping(value="/fileupload2")
    public String fileupload2(HttpServletRequest request,MultipartFile upload) throws Exception {
        System.out.println("SpringMVC方式的文件上傳...");
        // 先獲取到要上傳的文件目錄
        String path = request.getSession().getServletContext().getRealPath("/uploads");
        // 創建File對象,一會向該路徑下上傳文件
        File file = new File(path);
        // 判斷路徑是否存在,如果不存在,創建該路徑
        if(!file.exists()) {
            file.mkdirs();
        }
        // 獲取到上傳文件的名稱
        String filename = upload.getOriginalFilename();
        String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
        // 把文件的名稱唯一化
        filename = uuid+"_"+filename;
        // 上傳文件
        upload.transferTo(new File(file,filename));
        return "success";
    }
  1. springmvc跨服務器方式文件上傳
1. 實際應用過程中,可能需要不同功能的服務器:
    * 應用服務器:部署應用
    * 數據庫服務器:運行數據庫
    * 緩存和消息服務器:處理大併發訪問的緩存和消息
    * 文件服務器:存儲用戶上傳的文件
2. 跨服務器文件上傳相關jar包:
    jersey-client.jar
    jersey-core.jar
3. 使用步驟:
    * 跨服務器上傳不再需要創建本地文件夾,但是需要指明文件服務器的存儲路徑(url)
    * 由應用服務器獲取到upload文件後,向文件服務器上傳
        a. 創建客戶端對象
        b. 和文件服務器建立連接
        c. 上傳文件
    @RequestMapping("/fileupload")
    public String fileupload3(MultipartFile upload) throws Exception {
        System.out.println("SpringMVC跨服務器方式的文件上傳...");
        // 定義圖片服務器的請求路徑
        String path = "http://localhost:9090/fileService/uploads/";
        // 獲取到上傳文件的名稱
        String filename = upload.getOriginalFilename();
        String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
        // 把文件的名稱唯一化
        filename = uuid+"_"+filename;
        // 向圖片服務器上傳文件
        // 創建客戶端對象
        Client client = Client.create();
        // 連接文件服務器
        WebResource webResource = client.resource(path+filename);
        // 上傳文件的字節形式
        webResource.put(upload.getBytes());
        return "success";
    }
  1. SpringMVC中的異常處理
1. 由Controller處理器將異常拋給前端控制器後,可以配置異常處理器組件處理異常,而不是拋給瀏覽器顯示
2. 異常處理步驟:
    a. 編寫自定義異常類(用於顯示提示信息),繼承自Exception類
    b. 在可能出現異常的代碼上包裹try/catch,在catchthrow new 自定義異常類()
    c. 編寫異常處理器類,需要實現HandlerExceptionResolver接口,並實現抽象方法(處理異常業務)
        public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, 
                                                        Object handler, Exception ex) { 
            CustomException customException = null; //如果拋出的是系統自定義異常則直接轉換 
            if(ex instanceof CustomException){ 
                customException = (CustomException)ex; 
            }else{ 
                //如果拋出的不是系統自定義異常則重新構造一個系統錯誤異常。 
                customException = new CustomException("系統錯誤,請與系統管理 員聯繫!"); 
            } 
            ModelAndView modelAndView = new ModelAndView(); 
            modelAndView.addObject("message", customException.getMessage()); 
            modelAndView.setViewName("error"); 
            return modelAndView; 
        }
    d. 配置異常處理器
        使用bean標籤將自定義異常處理類配置到springmvc.xml中
        <bean id="xxx" class="自定義異常處理器類全路徑"></bean>
  1. SpringMVC中的攔截器
1. 攔截器與過濾器
    過濾器是servlet規範中的一部分,任何java web工程都可以使用。
    攔截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用。
    
    過濾器在url-pattern中配置了("/*")之後,可以對所有要訪問的資源攔截。
    攔截器它是隻會攔截訪問的Controller中的方法,如果訪問的是jsp,html,css,image或者js是不會進行攔截的。
    它也是AOP思想的具體應用。 
    我們要想自定義攔截器, 要求必須實現:HandlerInterceptor接口。
2. HandlerInterceptor接口內部已經實現了其方法的默認形式
    對其中的方法進行重寫可以自定義攔截器的功能
    * preHandle方法是controller方法執行前攔截的方法
        1. 可以使用request或者response跳轉到指定的頁面
        2. return true放行,執行下一個攔截器,如果沒有攔截器,執行controller中的方法。
        3. return false不放行,不會執行controller中的方法。
    * postHandle是controller方法執行後執行的方法,在JSP視圖執行前。
        1. 可以使用request或者response跳轉到指定的頁面
        2. 如果指定了跳轉的頁面,那麼controller方法跳轉的頁面將不會顯示。
    * afterCompletion方法是在JSP頁面執行後執行
        1. request或者response不能再跳轉頁面了
3. 在spring.xml文檔中配置攔截器
    /resource/sprinmvc.xml
    <!-- 配置攔截器 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!-- 哪些方法進行攔截 -->
            <mvc:mapping path="/user/*"/>
            <!-- 
                或者配置哪些方法不進行攔截
                <mvc:exclude-mapping path=""/>
            -->
            <!-- 註冊攔截器對象 -->
            <bean class="cn.itcast.demo1.MyInterceptor1"/>
        </mvc:interceptor>
        
        <mvc:interceptor>
            <!-- 哪些方法進行攔截 -->
            <mvc:mapping path="/**"/>
            <!-- 註冊攔截器對象 -->
            <bean class="cn.itcast.demo1.MyInterceptor2"/>
        </mvc:interceptor>
    </mvc:interceptors>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章