zoukankan      html  css  js  c++  java
  • SpringMVC框架三:参数绑定

    这篇文章整合了SpringMVC和MyBatis:

    https://www.cnblogs.com/xuyiqing/p/9419144.html

    接下来看看参数绑定:

    默认Conrtroller可以绑定四种参数:HttpServletRequest,HttpServletResponse,HttpSession,Model 

    案例:利用request取出传递的参数

        //获取参数
        @RequestMapping(value = "/itemEdit.action")
        public ModelAndView toEdit(HttpServletRequest request, HttpServletResponse response, HttpSession session,Model model) {
            //Servlet方式
            String id = request.getParameter("id");
            
            Items items = itemService.selectItemsById(Integer.parseInt(id));
            
            ModelAndView mav = new ModelAndView();
            mav.addObject("item", items);
            mav.setViewName("editItem");
            return mav;
        }

    然而,其实可以不需要这样取出参数:可以直接绑定:

        // 获取参数
        @RequestMapping(value = "/itemEdit.action")
        public ModelAndView toEdit(Integer id, HttpServletRequest request, HttpServletResponse response,
                HttpSession session, Model model) {
    
            Items items = itemService.selectItemsById(id);
            ModelAndView mav = new ModelAndView();
            mav.addObject("item", items);
            mav.setViewName("editItem");
            return mav;
        }

    这种简单参数绑定其实还可以用@RequestParam来做:

    如果传递的参数是id,而我们非要使用ID来接收,就需要这个注解:

    (required默认为true,意味着如果传递参数为空,将会报错)

        // 获取参数
        @RequestMapping(value = "/itemEdit.action")
        public ModelAndView toEdit(@RequestParam(value = "id", required = false, defaultValue = "1") Integer ID,
                HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model) {
    
            Items items = itemService.selectItemsById(ID);
            ModelAndView mav = new ModelAndView();
            mav.addObject("item", items);
            mav.setViewName("editItem");
            return mav;
        }

    然而如果传递的参数是一个对象(POJO类)?

    场景:用户写完博客,设置好分类等信息后,将要发布,设置后传递的参数就是POJO类(博客POJO)

    使用限制:传递表单各项的name属性的名字必须和POJO类的属性名一致

    很简单,直接绑定即可:注意使用限制:

        @RequestMapping(value = "/updateitem.action")
        public ModelAndView updateitem(Items items) {
            
            itemService.updateItemsById(items);
            
            ModelAndView mav = new ModelAndView();
            mav.setViewName("success");
            return mav;
        }

    另外,就写博客这个场景,会出现中文乱码问题,这里顺便解决了:

    web.xml中配置filter过滤器:

        <!-- 处理POST提交乱码问题 -->
        <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>*.action</url-pattern>
        </filter-mapping>

    接下来,绑定包装POJO类:

     简单的包装类包装商品:

    package org.dreamtech.springmvc.pojo;
    
    public class QueryVo {
        
        //商品
        private Items items;
    
        public Items getItems() {
            return items;
        }
    
        public void setItems(Items items) {
            this.items = items;
        }
        
    }
    View Code

    绑定包装类:

     其实和绑定POJO类相同,不过注意提交表单各项的name属性必须是item.属性名

        @RequestMapping(value = "/updateitem.action")
        public ModelAndView updateitem(QueryVo vo) {
            
            itemService.updateItemsById(vo.getItems());
            
            ModelAndView mav = new ModelAndView();
            mav.setViewName("success");
            return mav;
        }

    场景:传递商品时候,可以修改生产日期,而日期的格式未必规范,于是SpringMVC适配器无法辨认

    比如我们这里商品POJO类有一个时间属性类型是Date,而表单传过来的一定是String,于是我们想到能否转换?

    自定义转换:

    首先需要在springmvc配置文件中配置:

        <mvc:annotation-driven conversion-service="conversionServiceFactoryBean" />
    
        <!-- 配置Conveter转换器 转换工厂 -->
        <bean id="conversionServiceFactoryBean"
            class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
            <!-- 配置 多个转换器 -->
            <property name="converters">
                <list>
                    <bean class="org.dreamtech.springmvc.conversion.DateConveter" />
                </list>
            </property>
        </bean>

    DateConveter类:输入String类型数据,返回Date类型数据

    package org.dreamtech.springmvc.conversion;
    
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.springframework.core.convert.converter.Converter;
    
    public class DateConveter implements Converter<String, Date>{
    
        public Date convert(String source) {
    
            try {
                if(null != source){
                    //转换2018-8-5 11:14:15
                    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    return df.parse(source);
                }
            } catch (Exception e) {
    
            }
            return null;
        }
    
    }

    参数绑定数组:

     场景:商品页面选定多个商品点击删除按钮,后端接收数组(商品ID)

        @RequestMapping(value = "/deletes.action")
        public ModelAndView deletes(Integer[] ids) {
            
            itemService.delete(ids);
            
            ModelAndView mav = new ModelAndView();
            mav.setViewName("success");
            return mav;
        }

    这时候只需要前端的表单checkbox的name是ids,各项的value分别是item.id即可

    参数绑定List:

    和数组应用场景一致:

     前端代码需要写成示例这样:

    <c:forEach items="${itemList}" var="item" varStatus="s">
    <tr>
        <td><input type="checkbox" name="ids" value="${item.id }"></td>
        <td><input type="text" name="itemsList[${s.index}].name" value="${item.name }"></td>
        <td><input type="text" name="itemsList[${s.index }].price" value="${item.price }"></td>
        <td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
    
    </tr>
    </c:forEach>

    绑定List需要写成上边提到的包装类方式:不能直接绑定在参数上

        public ModelAndView updateitem(QueryVo vo) {
            //service...
            
            ModelAndView mav = new ModelAndView();
            mav.setViewName("success");
            return mav;
        }

    只需要QueryVo类有一个List且名为itemList

        private List<Items> itemsList;
    
        public List<Items> getItemsList() {
            return itemsList;
        }
    
        public void setItemsList(List<Items> itemsList) {
            this.itemsList = itemsList;
        }
  • 相关阅读:
    websocket初体验(能传文字和图片)
    展开折叠效果 height未知 transition无效
    微信小程序自定义键盘
    微信小程序 selectComponent 值为null
    css 斜线 animation
    【转】怎样在ubuntu12.04下创建一个启动器
    以ontouch为例说明android事件发送机制
    谈谈移动应用设计——从一个普通开发者的角度
    Launch error: Failed to connect to remote VM. Connection refused.的解决办法
    Beyond compare代码比较工具。
  • 原文地址:https://www.cnblogs.com/xuyiqing/p/9424662.html
Copyright © 2011-2022 走看看