SpringMVC|參數(shù)綁定


1. 什么是SpringMVC參數(shù)綁定

就是將URL中的的請求參數(shù),進(jìn)行類型轉(zhuǎn)換(String或其他類型),將轉(zhuǎn)換后的值在賦值給Controller方法形參中,然后Controller就可以直接使用該形參。

2. 默認(rèn)的參數(shù)綁定類型

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • Model:數(shù)據(jù)模型,主要存儲要返回到客戶端的數(shù)據(jù)的。功能類似于Request對象。
  • ModelMap
  • 演示
@RequestMapping("/Parameter")
    public Stirng parameter(HttpServletRequest request,HttpServletResponse response,
                            HttpSession session,Model model,ModelMap modelMap) throws Exception{
        request.setAttribute("requestParameter", "request類型");
        response.getWriter().write("response");
        session.setAttribute("sessionParameter", "session類型");
        model.addAttribute("modelParameter", "model類型");
        modelMap.addAttribute("modelMapParameter", "modelMap類型");
         
        return "success";
    }

3. 簡單類型

  • 請求URL
http://localhost:8080/springmvc/test/queryById?id=1&name=zhangsan

參數(shù)為id=1&name=zhangsan

  • Controller
    注意:請求參數(shù)的key,需要和controller方法形參名稱一致,注意類型是否匹配。
@RequestMapping(“queryById”)
public String queryItemById(int id,String name){}
  • RequestParam
  • 作用:
    1. 相當(dāng)于request.getParameter(請求參數(shù)中的key);
    2. 將獲取的值,綁定到該注解修飾中的參數(shù)中;
  • 屬性:
    • value:URL請求參數(shù)中的key;
    • required:true/false,表示該URL是否必須要帶有該參數(shù),默認(rèn)是true;
    • default:如果required設(shè)置為true,但是URL中沒有指定的key,則默認(rèn)取該值進(jìn)行參數(shù)綁定。

4. POJO類型

  • 請求參數(shù)
id=10&name=zhangsan
  • Controller
    使用要求
    1. 使用一個POJO類型的參數(shù)作為Contoller方法的參數(shù)形參,進(jìn)行形參綁定。
    2. 請求參數(shù)的key,需要和一個POJO類型的屬性名稱一致。
    3. 如果參數(shù)的key出現(xiàn)這種方式address.provinceName,需要需要POJO類型中嵌套POJO類型的屬性進(jìn)行接受請求參數(shù)User#Address(address)#provinceName

代碼

@RequestMapping("saveUser")
    public String saveUser(User user,Model model) {
        model.addAttribute("msg", "接收到的參數(shù):"+user.toString());
        return "success";
    }
public class User {
    private int id;
    private String username;
    private Date birthday;
    private String sex;

    // 演示包裝POJO參數(shù)綁定
    private Address address;
}

5. 日期類型

  • 問題
    對于字符串類型的日期參數(shù),轉(zhuǎn)換成Data的參數(shù),會有轉(zhuǎn)換類型問題。原因是因?yàn)?,SpringMVC無法確定頁面?zhèn)魅氲娜掌诟袷绞鞘裁搭愋偷?,所以無法進(jìn)行無法參數(shù)轉(zhuǎn)換。
  • 解決辦法
    Converter:實(shí)現(xiàn)類型轉(zhuǎn)換
public class DateConverter implements Converter<String,Date>{

    @Override
    public Date convert(String source) {
        // 使用Java中 SimpleDateFormat API完成日期轉(zhuǎn)換
        String pattern = "yyyy-MM-dd HH:mm:ss";
        SimpleDateFormat dateFormat = new SimpleDateFormat(pattern );
        try {
            return dateFormat.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}

將Converter注冊到處理器適配器中

<!-- 配置注解方式處理器對應(yīng)的適配器和映射器,同時還注入了很多其他的bean -->
    <mvc:annotation-driven
        conversion-service="conversionService" />

    <!-- 配置ConversionService -->
    <bean id="conversionService"
        class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.springmvc.controller.converter.DateConverter"></bean>
            </set>
        </property>
    </bean>

6. 集合或者類型

6.1 元素是簡單類型的集合或數(shù)組

  • 注意
    1. 直接使用LIst集合或者數(shù)組作為形參,List集合會報(bào)錯。
    2. 直接使用POJO類型作為形參,并且該P(yáng)OJOlei類型擁有一個List集合屬性或者數(shù)組屬性。這種情況下List和數(shù)組都可以成功接收參數(shù)。
    3. 請求參數(shù)key和形參名稱或者屬性名稱要一致。
  • 請求參數(shù)
id=1&id=2&id=3
  • Controller方法
    第一個和第三個是成功的,第二個不成功。
    @RequestMapping("findUserByIds")
    public String findUserByIds(Integer[] id,Model model) {
        model.addAttribute("msg", "接收到的參數(shù):"+id);
        return "success";
    }
    @RequestMapping("findUserByIds2")
    public String findUserByIds2(List<Integer> id,Model model) {
        model.addAttribute("msg", "接收到的參數(shù):"+id);
        return "success";
    }
    @RequestMapping("findUserByIds3")
    public String findUserByIds3(User user,Model model) {
        model.addAttribute("msg", "接收到的參數(shù):"+user.getUid());
        return "success";
    }
public class User {

    // 演示批量簡單類型參數(shù)接收
    private List<Integer> uid = new ArrayList<>();
}

6.2 元素是POJO的類型或數(shù)組

  • 注意
    1. 直接使用List集合或者數(shù)組作為形參,都會報(bào)錯。
    2. 必須使用POJO類型作為形參,并且該P(yáng)OJO類型擁有一個List集合屬性或者數(shù)組屬性。這種情況下List和數(shù)組都可以成功接收參數(shù)。
    3. 請求參數(shù)key和屬性名稱要一致。
  • 請求參數(shù)
    POST請求
<!-- 將request請求參數(shù),綁定到[元素是POJO類型的List集合或Map集合]參數(shù) -->
    <form action="${pageContext.request.contextPath}/user/updateUser" method="post">
        <!-- itemList[集合下標(biāo)]:集合下標(biāo)必須從0開始 -->
        <!-- 輔助理解:先將name屬性封裝到一個Item對象中,再將該Item對象放入itemList集合的指定下標(biāo)處 -->
        購買商品1名稱:<input type="text" name="itemList[0].name"><br />
        購買商品1價(jià)格:<input type="text" name="itemList[0].price"><br />
        購買商品2名稱:<input type="text" name="itemList[1].name"><br />
        購買商品2價(jià)格:<input type="text" name="itemList[1].price"><br />

        <input type="submit" value="保存">
    </form>

GET請求

itemList[0].id=1&itemList[0].name=zhangsan&itemList[0].price=100&itemList[1].id=2&itemList[1].name=lisi&itemList[1].price=200
  • Controller方法
@RequestMapping("updateUser")
    public String updateUser(User user,Model model) {
        model.addAttribute("msg", "接收到的參數(shù):"+user.getUid());
        return "success";
    }
public class User {
    
    // 將request請求參數(shù),綁定到[元素是POJO類型的List集合]參數(shù) 
    private List<Item> itemList = new ArrayList<>();

}

6.3 Map集合

  • 注意
    1. 需要使用POJO類型來接受,POJO類型中有一個Map類型的參數(shù)。
    2. Map類型的屬性和名稱,要求和請求參數(shù)[]前面的名稱一致。
    3. Map的key要唯一,value要求是一個POJO類型。
  • 請求參數(shù)
itemMap['item1'].name=zhangsan&itemMap['item1'].price=100&itemMap['item2'].name=lisi&itemMap['item2'].price=200
  • POJO
public class User {

    // 將request請求參數(shù),綁定到[元素是POJO類型的Map集合]參數(shù) 
    private Map<String, Item> itemMap = new HashMap<>();
}
public class Item {
    private Integer id;

    private String name;

    private Float price;

    private String pic;

    private Date createtime;

}

7. 文件類型

  • 注意
    JSP
form表單需要設(shè)置enctype=multipart/form-data

第三方依賴

commons-fileupload
commons-io

SpirngMVC的支持

MultipartResolver:解析文件類型的參數(shù),綁定到MultipartFile類型的參數(shù)中,需要在springmvc.xml配置
MultipartFile:通過該參數(shù),可以獲取文件數(shù)據(jù),包括文件名稱和文件內(nèi)容。
  • 代碼配置
    JSP
<!-- 文件類型參數(shù)綁定 -->
    <form action="${pageContext.request.contextPath}/fileupload" method="post" enctype="multipart/form-data">
        圖片:<input type="file" name="uploadFile" /><br /> 
        <input type="submit" value="上傳" />
    </form>

springmvc.xml

<!-- 配置多部件解析器 -->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 限制上傳文件的大小,最大可以上傳多大,單位是字節(jié) -->
        <property name="maxUploadSize" value="5000000"></property>
    </bean>

Controller

@RequestMapping("fileupload")
    public String findUserById(MultipartFile uploadFile,Model model) throws Exception {
        //編寫文件上傳邏輯(mvc模式和三層結(jié)構(gòu)模式)
        //三層模式:表現(xiàn)層(controller、action)、業(yè)務(wù)層(service、biz)、持久層(dao、mapper)
        //MVC模式主要就是來解決表現(xiàn)層的問題的(原始的表現(xiàn)層是使用Servlet編寫,即編寫業(yè)務(wù)邏輯,又編寫視圖展示)
        
        if(uploadFile != null){
            System.out.println(uploadFile.getOriginalFilename());
            //原始圖片名稱
            String originalFilename = uploadFile.getOriginalFilename();
            //如果沒有圖片名稱,則上傳不成功
            if(originalFilename != null && originalFilename.length()>0)
            {
                //存放圖片的物理路徑
                String picPath = "E:\\";
                //獲取上傳文件的擴(kuò)展名
                String extName = originalFilename.substring(originalFilename.lastIndexOf("."));
                //新文件的名稱
                String newFileName = UUID.randomUUID()+extName;
                //新的文件
                File newFile = new File(picPath+newFileName);
                //把上傳的文件保存成一個新的文件
                uploadFile.transferTo(newFile);
                //同時需要把新的文件名更新到數(shù)據(jù)庫中
            }
        }

        
        model.addAttribute("msg", "文件上傳成功");
        return "success";
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容