SpringMVC:提交參數名與接收參數名問題


1、提交的域名稱和處理方法的參數名一致

提交數據 : http://localhost:8080/hello?name=111

處理方法 :

@RequestMapping("/hello")
public String hello(String name){
    System.out.println(name);
    return "hello";
}

后台輸出 : 111

 

2、提交的域名稱和處理方法的參數名不一致

提交數據 : http://localhost:8080/hello?username=222

//@RequestParam("username") : username提交的域的名稱 .
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name){
    System.out.println(name);
    return "hello";
}

后台輸出 :222

3、提交的是一個對象

要求提交的表單域和對象的屬性名一致 , 參數使用對象即可

  1. 實體類

    public class User {
        private int id;
        private String name;
        private int age;
        //構造
        //get/set
        //tostring()
    }

     

  2. 提交數據 : http://localhost:8080/mvc04/user?name=111&id=2&age=13
  3. 處理方法 :

    @RequestMapping("/user")
    public String user(User user){
        System.out.println(user);
        return "hello";
    }

     

    后台輸出 : User { id=2, name='111', age=13 }

說明:如果使用對象的話,前端傳遞的參數名和對象名必須一致,否則就是null。

數據顯示到前端

第一種 : 通過ModelAndView

我們前面一直都是如此 . 就不過多解釋

public class ControllerTest1 implements Controller {

    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //返回一個模型視圖對象
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","ControllerTest1");
        mv.setViewName("test");
        return mv;
    }
}

第二種 : 通過ModelMap

ModelMap

@RequestMapping("/hello")
public String hello(@RequestParam("username") String name, ModelMap model){
    //封裝要顯示到視圖中的數據
    //相當於req.setAttribute("name",name);
    model.addAttribute("name",name);
    System.out.println(name);
    return "hello";
}

第三種 : 通過Model

Model

@RequestMapping("/ct2/hello")
public String hello(@RequestParam("username") String name, Model model){
    //封裝要顯示到視圖中的數據
    //相當於req.setAttribute("name",name);
    model.addAttribute("msg",name);
    System.out.println(name);
    return "test";
}

對比

就對於新手而言簡單來說使用區別就是:

Model 只有寥寥幾個方法只適合用於儲存數據,簡化了新手對於Model對象的操作和理解;

ModelMap 繼承了 LinkedMap ,除了實現了自身的一些方法,同樣的繼承 LinkedMap 的方法和特性;

ModelAndView 可以在儲存數據的同時,可以進行設置返回的邏輯視圖,進行控制展示層的跳轉。

當然更多的以后開發考慮的更多的是性能和優化,就不能單單僅限於此的了解。

請使用80%的時間打好扎實的基礎,剩下18%的時間研究框架,2%的時間去學點英文,框架的官方文檔永遠是最好的教程。

亂碼問題

測試步驟:

  1. 我們可以在首頁編寫一個提交的表單

    <form action="/e/t" method="post">
      <input type="text" name="name">
      <input type="submit">
    </form>
  2. 后台編寫對應的處理類

    @Controller
    public class Encoding {
        @RequestMapping("/e/t")
        public String test(Model model,String name){
            model.addAttribute("msg",name); //獲取表單提交的值
            return "test"; //跳轉到test頁面顯示輸入的值
        }
    }
  3. 輸入中文測試,發現亂碼
    1570176982690.png

不得不說,亂碼問題是在我們開發中十分常見的問題,也是讓我們程序猿比較頭大的問題!

以前亂碼問題通過過濾器解決 , 而SpringMVC給我們提供了一個過濾器 , 可以在web.xml中配置 .

修改了xml文件需要重啟服務器!

<filter>
    <filter-name>encoding</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>encoding</filter-name>
    <url-pattern>/</url-pattern> // 注意 /* (包含jsp)和 / 的區別
</filter-mapping>

有些極端情況下.這個過濾器對get的支持不好 .

 

處理方法 :

  1. 修改tomcat配置文件 : 設置編碼!

    <Connector URIEncoding="utf-8" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
  2. 自定義過濾器

    package com.kuang.filter;
    
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.Map;
    
    /** * 解決get和post請求 全部亂碼的過濾器 */
    public class GenericEncodingFilter implements Filter {
    
        @Override
        public void destroy() {
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            //處理response的字符編碼
            HttpServletResponse myResponse=(HttpServletResponse) response;
            myResponse.setContentType("text/html;charset=UTF-8");
    
            // 轉型為與協議相關對象
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            // 對request包裝增強
            HttpServletRequest myrequest = new MyRequest(httpServletRequest);
            chain.doFilter(myrequest, response);
        }
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }
    
    }
    
    //自定義request對象,HttpServletRequest的包裝類
    class MyRequest extends HttpServletRequestWrapper {
    
        private HttpServletRequest request;
        //是否編碼的標記
        private boolean hasEncode;
        //定義一個可以傳入HttpServletRequest對象的構造函數,以便對其進行裝飾
        public MyRequest(HttpServletRequest request) {
            super(request);// super必須寫
            this.request = request;
        }
    
        // 對需要增強方法 進行覆蓋
        @Override
        public Map getParameterMap() {
            // 先獲得請求方式
            String method = request.getMethod();
            if (method.equalsIgnoreCase("post")) {
                // post請求
                try {
                    // 處理post亂碼
                    request.setCharacterEncoding("utf-8");
                    return request.getParameterMap();
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            } else if (method.equalsIgnoreCase("get")) {
                // get請求
                Map<String, String[]> parameterMap = request.getParameterMap();
                if (!hasEncode) { // 確保get手動編碼邏輯只運行一次
                    for (String parameterName : parameterMap.keySet()) {
                        String[] values = parameterMap.get(parameterName);
                        if (values != null) {
                            for (int i = 0; i < values.length; i++) {
                                try {
                                    // 處理get亂碼
                                    values[i] = new String(values[i]
                                            .getBytes("ISO-8859-1"), "utf-8");
                                } catch (UnsupportedEncodingException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    }
                    hasEncode = true;
                }
                return parameterMap;
            }
            return super.getParameterMap();
        }
    
        //取一個值
        @Override
        public String getParameter(String name) {
            Map<String, String[]> parameterMap = getParameterMap();
            String[] values = parameterMap.get(name);
            if (values == null) {
                return null;
            }
            return values[0]; // 取回參數的第一個值
        }
    
        //取所有值
        @Override
        public String[] getParameterValues(String name) {
            Map<String, String[]> parameterMap = getParameterMap();
            String[] values = parameterMap.get(name);
            return values;
        }
    }

這個也是我在網上找的一些大神寫的,一般情況下,SpringMVC默認的亂碼處理就已經能夠很好的解決了!

然后在web.xml中配置這個過濾器即可!

亂碼問題,需要平時多注意,在盡可能能設置編碼的地方,都設置為統一編碼 UTF-8!

本文只是用於學習筆記,來源於https://blog.kuangstudy.com/index.php/archives/476/該博主,侵權請聯系刪除!

數據顯示到前端

第一種 : 通過ModelAndView

我們前面一直都是如此 . 就不過多解釋

public class ControllerTest1 implements Controller {

    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //返回一個模型視圖對象
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","ControllerTest1");
        mv.setViewName("test");
        return mv;
    }
}

第二種 : 通過ModelMap

ModelMap

@RequestMapping("/hello")
public String hello(@RequestParam("username") String name, ModelMap model){
    //封裝要顯示到視圖中的數據
    //相當於req.setAttribute("name",name);
    model.addAttribute("name",name);
    System.out.println(name);
    return "hello";
}

第三種 : 通過Model

Model

@RequestMapping("/ct2/hello")
public String hello(@RequestParam("username") String name, Model model){
    //封裝要顯示到視圖中的數據
    //相當於req.setAttribute("name",name);
    model.addAttribute("msg",name);
    System.out.println(name);
    return "test";
}

對比

就對於新手而言簡單來說使用區別就是:

Model 只有寥寥幾個方法只適合用於儲存數據,簡化了新手對於Model對象的操作和理解;

ModelMap 繼承了 LinkedMap ,除了實現了自身的一些方法,同樣的繼承 LinkedMap 的方法和特性;

ModelAndView 可以在儲存數據的同時,可以進行設置返回的邏輯視圖,進行控制展示層的跳轉。

當然更多的以后開發考慮的更多的是性能和優化,就不能單單僅限於此的了解。

請使用80%的時間打好扎實的基礎,剩下18%的時間研究框架,2%的時間去學點英文,框架的官方文檔永遠是最好的教程。

亂碼問題

測試步驟:

  1. 我們可以在首頁編寫一個提交的表單

    <form action="/e/t" method="post">
      <input type="text" name="name">
      <input type="submit">
    </form>
  2. 后台編寫對應的處理類

    @Controller
    public class Encoding {
        @RequestMapping("/e/t")
        public String test(Model model,String name){
            model.addAttribute("msg",name); //獲取表單提交的值
            return "test"; //跳轉到test頁面顯示輸入的值
        }
    }
  3. 輸入中文測試,發現亂碼
    1570176982690.png

不得不說,亂碼問題是在我們開發中十分常見的問題,也是讓我們程序猿比較頭大的問題!

以前亂碼問題通過過濾器解決 , 而SpringMVC給我們提供了一個過濾器 , 可以在web.xml中配置 .

修改了xml文件需要重啟服務器!

<filter>
    <filter-name>encoding</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>encoding</filter-name>
    <url-pattern>/</url-pattern>
</filter-mapping>

有些極端情況下.這個過濾器對get的支持不好 .

處理方法 :

  1. 修改tomcat配置文件 : 設置編碼!

    <Connector URIEncoding="utf-8" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
  2. 自定義過濾器

    package com.kuang.filter;
    
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.Map;
    
    /** * 解決get和post請求 全部亂碼的過濾器 */
    public class GenericEncodingFilter implements Filter {
    
        @Override
        public void destroy() {
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            //處理response的字符編碼
            HttpServletResponse myResponse=(HttpServletResponse) response;
            myResponse.setContentType("text/html;charset=UTF-8");
    
            // 轉型為與協議相關對象
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            // 對request包裝增強
            HttpServletRequest myrequest = new MyRequest(httpServletRequest);
            chain.doFilter(myrequest, response);
        }
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }
    
    }
    
    //自定義request對象,HttpServletRequest的包裝類
    class MyRequest extends HttpServletRequestWrapper {
    
        private HttpServletRequest request;
        //是否編碼的標記
        private boolean hasEncode;
        //定義一個可以傳入HttpServletRequest對象的構造函數,以便對其進行裝飾
        public MyRequest(HttpServletRequest request) {
            super(request);// super必須寫
            this.request = request;
        }
    
        // 對需要增強方法 進行覆蓋
        @Override
        public Map getParameterMap() {
            // 先獲得請求方式
            String method = request.getMethod();
            if (method.equalsIgnoreCase("post")) {
                // post請求
                try {
                    // 處理post亂碼
                    request.setCharacterEncoding("utf-8");
                    return request.getParameterMap();
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            } else if (method.equalsIgnoreCase("get")) {
                // get請求
                Map<String, String[]> parameterMap = request.getParameterMap();
                if (!hasEncode) { // 確保get手動編碼邏輯只運行一次
                    for (String parameterName : parameterMap.keySet()) {
                        String[] values = parameterMap.get(parameterName);
                        if (values != null) {
                            for (int i = 0; i < values.length; i++) {
                                try {
                                    // 處理get亂碼
                                    values[i] = new String(values[i]
                                            .getBytes("ISO-8859-1"), "utf-8");
                                } catch (UnsupportedEncodingException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    }
                    hasEncode = true;
                }
                return parameterMap;
            }
            return super.getParameterMap();
        }
    
        //取一個值
        @Override
        public String getParameter(String name) {
            Map<String, String[]> parameterMap = getParameterMap();
            String[] values = parameterMap.get(name);
            if (values == null) {
                return null;
            }
            return values[0]; // 取回參數的第一個值
        }
    
        //取所有值
        @Override
        public String[] getParameterValues(String name) {
            Map<String, String[]> parameterMap = getParameterMap();
            String[] values = parameterMap.get(name);
            return values;
        }
    }

這個也是我在網上找的一些大神寫的,一般情況下,SpringMVC默認的亂碼處理就已經能夠很好的解決了!

然后在web.xml中配置這個過濾器即可!

亂碼問題,需要平時多注意,在盡可能能設置編碼的地方,都設置為統一編碼 UTF-8!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM