腳手架ssm-srping mvc

spring mvc

pom依賴

    //spring 基礎
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency>  //spirng mvc 2個 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency>  
//servlet <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency>

 

web.xml配置

  <!--配置前端控制器-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!--配置解決中文亂碼的過濾器-->
  <filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

springmvc配置

    <!-- 開啓註解掃描 -->
    <context:component-scan base-package="cn.itcast"/>

    <!-- 視圖解析器對象 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--配置自定義類型轉換器,好比:後端mode是日期date類型,而文本輸入的是格式爲2010-10-10的string類型,搞個類型轉換會幫忙把string轉換爲date-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="cn.itcast.utils.StringToDateConverter"/>
            </set>
        </property>
    </bean>

    <!--前端控制器,哪些靜態資源不攔截-->
    <mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/images/" mapping="/images/**"/>
    <mvc:resources location="/js/" mapping="/js/**"/>

<!-- 開啓SpringMVC框架註解的支持 --> <mvc:annotation-driven conversion-service="conversionService"/>

sping mvc 的執行過程 圖

組件

DispatcherServlet:前端控制器css

HandlerMapping:處理器映射器,url和action的映射關係html

Handler:處理器:它就是咱們開發中要編寫的具體業務控制器。前端

HandlAdapter:處理器適配器java

ViewResolver:視圖解析器web

View:視圖:SpringMVC 框架提供了不少的 View 視圖類型的支持,包括:jstlView、freemarkerView、pdfView等。咱們最經常使用的視圖就是 jsp。ajax

 

返回類型是json處理

導入依賴

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.0</version>
    </dependency>

 代碼實現

    /**
     * 模擬異步請求響應
     */
    @RequestMapping("/testAjax")
    public @ResponseBody User testAjax(@RequestBody User user){
        System.out.println("testAjax方法執行了...");
        // 客戶端發送ajax的請求,傳的是json字符串,後端把json字符串封裝到user對象中
        System.out.println(user);
        // 作響應,模擬查詢數據庫
        user.setUsername("haha");
        user.setAge(40);
        // 作響應
        return user;
    }

 

文件上傳

原理 圖

前提條件

A form 表單的 enctype 取值必須是:multipart/form-data      (默認值是:application/x-www-form-urlencoded)     enctype:是表單請求正文的類型spring

B method 屬性取值必須是 Post數據庫

C 提供一個文件選擇域<input type=」file」 />json

傳統方式上傳:

from表單

    <form action="/user/fileupload1" method="post" enctype="multipart/form-data">
        選擇文件:<input type="file" name="upload" /><br/>
        <input type="submit" value="上傳" />
    </form>

 代碼實現:

    /**
     * 傳統文件上傳
     * @return
     */
    @RequestMapping("/fileupload1")
    public String fileuoload1(HttpServletRequest request) throws Exception {
        System.out.println("文件上傳...");
        // 使用fileupload組件完成文件上傳
        // 上傳的位置
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        // 判斷,該路徑是否存在
        File file = new File(path);
        if(!file.exists()){
            // 建立該文件夾
            file.mkdirs();
        }
        // 解析request對象,獲取上傳文件項
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 解析request
        List<FileItem> items = upload.parseRequest(request);
        // 遍歷
        for(FileItem item:items){
            // 進行判斷,當前item對象是不是上傳文件項
            if(item.isFormField()){
                // 說明普通表單向
            }else{
                // 說明上傳文件項
                // 獲取上傳文件的名稱
                String filename = item.getName();
                // 把文件的名稱設置惟一值,uuid
                String uuid = UUID.randomUUID().toString().replace("-", "");
                filename = uuid+"_"+filename;
                // 完成文件上傳
                item.write(new File(path,filename));
                // 刪除臨時文件
                item.delete();
            }
        }
        return "success";
    }

 

springmvc提供方式

導入jar

    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.4</version>
    </dependency>

配置bean

    <!--配置文件解析器對象-->

    <!-- id 的值是固定的-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760" />
    </bean>

 代碼實現:

    /**
     * SpringMVC文件上傳
     * @return
     */
    @RequestMapping("/fileupload2")
    public String fileuoload2(HttpServletRequest request, MultipartFile upload) throws Exception {
        System.out.println("springmvc文件上傳...");
        // 使用fileupload組件完成文件上傳
        // 上傳的位置
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        // 判斷,該路徑是否存在
        File file = new File(path);
        if(!file.exists()){
            // 建立該文件夾
            file.mkdirs();
        }
        // 說明上傳文件項
        // 獲取上傳文件的名稱
        String filename = upload.getOriginalFilename();
        // 把文件的名稱設置惟一值,uuid
        String uuid = UUID.randomUUID().toString().replace("-", "");
        filename = uuid+"_"+filename;
        // 完成文件上傳
        upload.transferTo(new File(path,filename));
        return "success";
    }

跨服務器方式的文件上傳

導入jar包:

    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-core</artifactId>
      <version>1.18.1</version>
    </dependency>
    <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-client</artifactId>
      <version>1.18.1</version>
    </dependency>

代碼實現:

    /**
     * 跨服務器文件上傳
     * @return
     */
    @RequestMapping("/fileupload3")
    public String fileuoload3(MultipartFile upload) throws Exception {
        System.out.println("跨服務器文件上傳...");
        // 定義上傳文件服務器路徑,uploads就是文件服務器一個目錄,文件服務器不須要實現上傳的邏輯
        String path = "http://localhost:9090/uploads/";
        // 說明上傳文件項
        // 獲取上傳文件的名稱
        String filename = upload.getOriginalFilename();
        // 把文件的名稱設置惟一值,uuid
        String uuid = UUID.randomUUID().toString().replace("-", "");
        filename = uuid+"_"+filename;
        // 建立客戶端的對象
        Client client = Client.create();
        // 和圖片服務器進行鏈接
        WebResource webResource = client.resource(path + filename);
        // 上傳文件
        webResource.put(upload.getBytes());
        return "success";
    }

 

異常處理

實現接口

/**
 * 異常處理器
 */
public class SysExceptionResolver implements HandlerExceptionResolver{

    /**
     * 處理異常業務邏輯
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @return
     */
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        // 獲取到異常對象
        SysException e = null;
        if(ex instanceof SysException){
            e = (SysException)ex;
        }else{
            e = new SysException("系統正在維護....");
        }
        // 建立ModelAndView對象
        ModelAndView mv = new ModelAndView();
        mv.addObject("errorMsg",e.getMessage());
        mv.setViewName("error");
        return mv;
    }

}

<!--配置了bean,配置自定義異常處理器 -->

<bean id="handlerExceptionResolver"  class="com.itheima.exception.CustomExceptionResolver"/>
後端

拋出SysException異常,SysException實現了Exception接口

    @RequestMapping("/testException")
    public String testException() throws SysException{
        System.out.println("testException執行了...");
        try {
            // 模擬異常
            int a = 10/0;
        } catch (Exception e) {
            // 打印異常信息
            e.printStackTrace();
            // 拋出自定義異常信息
            throw new SysException("查詢全部用戶出現錯誤了...");
        }
        return "success";
    }

 

攔截器

基本概念

Spring MVC 的處理器攔截器相似於 Servlet 開發中的過濾器 Filter,用於對處理器進行預處理和後處理。

攔截器鏈:攔截器鏈就是將攔截器按必定的順序聯結成一條鏈。在訪問被攔截的方法或字段時,攔截器鏈中的攔截器就會按其以前定義的順序被調用。

區別:

過濾器是 servlet 規範中的一部分,任何 java web 工程均可以使用。
攔截器是 SpringMVC 框架本身的,只有使用了 SpringMVC 框架的工程才能用。
過濾器在 url-pattern 中配置了/*以後,能夠對全部要訪問的資源攔截。
攔截器它是隻會攔截訪問的控制器方法,若是訪問的是 jsp,html,css,image 或者 js 是不會進行攔截的。

實現配置過程

第一步:編寫一個普通類實現HandlerInterceptor接口

/**
 * 自定義攔截器
 */
public class MyInterceptor1 implements HandlerInterceptor{

    /**
     * 預處理,controller方法執行前
     * return true 放行,執行下一個攔截器,若是沒有,執行controller中的方法
     * return false不放行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor1執行了...前1111");
        // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
        return true;
    }

    /**
     * 後處理方法,controller方法執行後,success.jsp執行以前
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor1執行了...後1111");
        // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
    }

    /**
     * success.jsp頁面執行後,該方法會執行
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor1執行了...最後1111");
    }

}

 第二步:配置攔截器

    <!--配置攔截器-->
    <mvc:interceptors>
        <!--配置攔截器-->
        <mvc:interceptor>
            <!--要攔截的具體的方法-->
            <mvc:mapping path="/user/*"/>
            <!--不要攔截的方法
            <mvc:exclude-mapping path=""/>
            -->
            <!--配置攔截器對象-->
            <bean class="cn.itcast.controller.cn.itcast.interceptor.MyInterceptor1" />
        </mvc:interceptor>

        <!--配置第二個攔截器-->
        <mvc:interceptor>
            <!--要攔截的具體的方法-->
            <mvc:mapping path="/**"/>
            <!--不要攔截的方法
            <mvc:exclude-mapping path=""/>
            -->
            <!--配置攔截器對象-->
            <bean class="cn.itcast.controller.cn.itcast.interceptor.MyInterceptor2" />
        </mvc:interceptor>
    </mvc:interceptors>
相關文章
相關標籤/搜索