• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • springmvc請求參數綁定 | 中文亂碼 | 自定義類型轉換器

    標簽: # SpringMVC

    1. 綁定的機制

    表單中請求參數都是基于 key=value 的。
    SpringMVC 綁定請求參數的過程是通過把表單提交請求參數,作為控制器中方法參數進行綁的。

    例如:
    <a href="account/findAccount?accountId=10">查詢賬戶</a>
    	中請求參數是:accountId=10
    /**
    * 查詢賬戶
    * @return
    */
    @RequestMapping("/findAccount")
    public String findAccount(Integer accountId) {
    	System.out.println("查詢了賬戶。。。。"+accountId);
    	return "success";
    }
    

    2. 支持的數據類型

    • 基本類型參數:包括基本類型和 String 類型。
    • POJO 類型參數:包括實體類,以及關聯的實體類。
    • 數組和集合類型參數:包括 List 結構和 Map 結構的集合(包括數組)

    SpringMVC 綁定請求參數是自動實現的,但是要想使用,必須遵循使用要求。

    使用要求

    • 如果是基本類型或者 String 類型:

    要求我們的參數名稱必須和控制器中方法的形參名稱保持一致。(嚴格區分大小寫)

    • 如果是 POJO 類型,或者它的關聯對象:

    要求表單中參數名稱和 POJO 類的屬性名稱保持一致。并且控制器方法的參數類型是 POJO 類型。

    • 如果是集合類型,有兩種方式:

    方式一:要求集合類型的請求參數必須在 POJO 中。在表單中請求參數名稱要和 POJO 中集合屬性名稱相同。

    給 List 集合中的元素賦值,使用下標。給 Map 集合中的元素賦值,使用鍵值對。

    方式二:接收的請求參數是 json 格式數據。需要借助一個注解實現。

    注意:

    1. 它還可以實現一些數據類型自動轉換。
    2. 如遇特殊類型轉換要求,需要我們自己編寫自定義類型轉換器。

    代碼示例

    <form action="success/getBean" method="post">
      id:  <input type="text" name="id"/><br/>
       name: <input type="text" name="user.name"/><br/>
        age:<input type="text" name="user.age"/><br/>
        <input type="submit" value="submit"/><br/>
    </form>
    
    <form method="post" action="success/getCollection">
        name:  <input type="text" name="list[0].name"/><br/>
        age: <input type="text" name="list[1].age"/><br/>
        name: <input type="text" name="map[0].name"/><br/>
        age: <input type="text" name="map[1].age"/><br/>
        <input type="submit" value="submit"/>
    </form>
    
    /**
     * 參數綁定1:
     * bean中包含bean
    */
    @RequestMapping("/getBean")
    public String getBean(Person person){
      System.out.println("getBean()...");
      System.out.println(person);
      return "success";
    }
    
    /**
     * 參數綁定2
     * 集合類型
    */
    @RequestMapping("/getCollection")
    public String getList(MyCollection collection){
      System.out.println("getList()....");
      System.out.println(collection);
      return "success";
    }
    

    3. 中文亂碼問題

    <!-- 編碼過濾器,必須放在web.xml最上面,防止緩存 -->
    <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>
    

    在這里插入圖片描述

    關于 get 請求

    tomacat 對 GET 和 POST 請求處理方式是不同的,GET 請求的編碼問題,要改 tomcat 的 server.xml

    配置文件,如下:

    <Connector connectionTimeout="20000" port="8080"
    protocol="HTTP/1.1" redirectPort="8443"/>
    改為:
    <Connector connectionTimeout="20000" port="8080"
    protocol="HTTP/1.1" redirectPort="8443"
    useBodyEncodingForURI="true"/>
    

    如果遇到 ajax 請求仍然亂碼,請把:useBodyEncodingForURI="true"改為URIEncoding="UTF-8"即可。

    4. 關于靜態資源處理

    在 springmvc 的配置文件中可以配置,靜態資源不過濾:

    <!-- location 表示路徑,mapping 表示文件,**表示該目錄下的文件以及子目錄的文件 -->
    <mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/images/" mapping="/images/**"/>
    <mvc:resources location="/js/" mapping="/js/**"/>
    
    或者:
    <!--讓springmvc 不處理靜態資源-->
    <mvc:default-servlet-handler/>
    

    5. 使用servletAPI對象作為方法參數

    springMVC 還支持使用原始 ServletAPI 對象作為控制器方法的參數。

    支持原始 ServletAPI 對象有:

        /**
         * 獲取原生ServletAPI
         */
        @RequestMapping("/getServlet")
        public String getServlet(HttpServletRequest request, HttpServletResponse response){
            System.out.println("getServlet()...");
            return "success";
        }
    
    <a href="success/getServlet">getServlet</a><br/>
    

    6. 自定義類型轉換器

    自定義類型轉換不是用在與數據庫交互,而是用在前后端交互。

    舉個例子:假如前段傳來的日期格式:2017-02-21 能封裝成功;但是假如前段傳來的是:2017/02/21 呢?

    代碼如下

    jsp頁面

    <form action="success/date" method="post">
        <input type="text" name="date"/><br/>
        <input type="submit" value="submit"/>
    </form>
    

    轉換器類

    public class StringToDate implements Converter<String, Date> {
        @Override
        public Date convert(String s) {
            if (s==null||"".equals(s)){
                throw new RuntimeException("輸入不能為空");
            }
            try {
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                return format.parse(s);
            } catch (Exception e) {
                throw new ClassCastException("類型轉換異常");
            }
        }
    }
    

    自定義類型轉換器

    spring 配置類型轉換器的機制是,將自定義的轉換器注冊到類型轉換服務中去。

    <!--自定義類型轉換-->
    <!-- 配置類型轉換器工廠 -->
        <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
            <!-- 給工廠注入一個新的類型轉換器 -->
            <property name="converters">
                <set><!-- 配置自定義類型轉換器 -->
                    <bean class="com.atguigu.utils.StringToDate"></bean>
                </set>
            </property>
        </bean>
    <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
    

    控制器

    /**
     * 自定義數據類型轉換
     * 1.編寫類型轉換類,實現 Converter 接口,該接口有兩個泛型。
     * 2.配置文件中配置轉換器,并在注解支持里面注冊。
     * 3.控制層參數列表傳入轉換類
    */
    @RequestMapping("/date")
    public String getDate(Date date){
      System.out.println(date.toString());
      return "success";
    }
    

    7. 自定義視圖解析器

    在這里插入圖片描述

    • 程序員可以選擇一種視圖解析器或混用多種視圖解析器 。
    • 每個視圖解析器都實現了 Ordered 接口并開放出一個 order 屬性,可以通過 order 屬性指定解析器的優先順序,order 越小優先級越高。
    • SpringMVC 會按視圖解析器順序的優先順序對邏輯視圖名進行解析,直到解析成功并返回視圖對象,否則將拋出 ServletException 異常。

    代碼如下

    //@Component 其他的組件
    @Component
    public class HelloView implements View {
    
    	@Override
    	public String getContentType() {
    		// TODO Auto-generated method stub
    		return "text/html;charset=utf-8";
    	}
    	@Override
    	public void render(Map<String, ?> arg0, HttpServletRequest req, HttpServletResponse res) throws Exception {
    		
    		res.setContentType("text/html;charset=utf-8");
    		PrintWriter out = res.getWriter();
    		System.out.println(" HelloView render 方法 執行 >>>>");
    		out.print("你好 自定義View");
    		out.flush();
    		out.close();
    	}
    
    }
    
    <!-- 配置自定義視圖 適配器 -->
    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" >
     <property name="order" value="100"></property>
    </bean>
    
    @Controller
    public class HelloController  {
    
    	@RequestMapping("/testzdyview")
    	public String testView(){
    		System.out.println("vie自定義 view >>>>>>>");
    		return "helloView";
    	}
    }
    

    如果有收獲!!! 希望老鐵們來個三連,點贊、收藏、轉發。
    創作不易,別忘點個贊,可以讓更多的人看到這篇文章,順便鼓勵我寫出更好的博客
    版權聲明:本文為weixin_45606067原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/weixin_45606067/article/details/108386672

    智能推薦

    SpringMVC自定義類型轉換器

    在表單提交得的數據類型都是字符串類型的,但是后臺定義的是int類型的,數據還是可以封裝進去,SpringMVC默認是進行數據類型轉換。但是對于日期類型的數據進行轉換,就會出現錯誤。 這時我們就需要自定義進行數據封裝。就比如下面的類型轉換(日期的格式轉換) Controller類 使用對象進行數據封裝  執行的代碼: 對于輸入的2021-04-14默認的數據類型是無法轉換的,輸入2021/...

    SpringMVC學習筆記14-----數據綁定與自定義類型轉換器

    一、問題分析        在之前的增刪改查中,數據都是通過表單傳向方法然后轉化成相應的數據類型!那么如果我們在java bean中再添加一個日期屬性birth時,就會有三個問題: 1.如何將表單中的字符串格式轉向日期格式:數據類型轉換 2.表單中輸入的字符串格式應該是怎么樣的:數據類型格式化 3.這是個生日屬性,既然是生日屬性就應該是當前日期的前面的時間,...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    猜你喜歡

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    精品国产乱码久久久久久蜜桃不卡