zoukankan      html  css  js  c++  java
  • SSM应用(五)--参数绑定

    参数绑定

      通过方法的输入获得参数的值叫做参数绑定;参数绑定可以分为简单参数绑定、pojo类型参数绑定、vo类型参数绑定、数组类型参数绑定以及集合类型参数绑定;

    简单参数绑定

        页面:

    <form action="reg.action" method="post">
        用户名:<input type="text" name="username" /><br/>
        密码:<input type="text" name="password" /><br/>
        <input type="submit" value="注册" />
    </form>

      当页面传递的参数名和传递的参数名一致时,可以直接绑定输入参数:  

    //文本框的名字与参数的名字一样的时候,可以直接实现参数绑定
    @RequestMapping("/reg.action")
    public String reg2(String username,String password) {
        System.out.println(username+","+password);
        return "result";    
    }

      页面所传递的参数名和输入参数名不一致时,可以使用:@PequestParam;

    //文本框与参数的名字不一致的时候:使用:@RequestParam:匹配页面所产地的参数的名字
    @RequestMapping("/reg.action")
    public String reg(@RequestParam(value="username")String name,String password) {
        System.out.println(name+","+password);
        return "result";    
    }

    pojo类型参数绑定

      pojo 类:

    public class User {
        private String username;
        private String password;
    }

      对象类型:参数名与pojo类的属性名一致的时候,参数值作为对象的属性值,会直接绑定为对象;

    <form action="reg.action" method="post">
        用户名:<input type="text" name="username" /><br/>
        密码:<input type="text" name="password" /><br/>
        <input type="submit" value="注册" />
    </form>

      controller层:

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

    vo类参数绑定

      vo类:

    public class UserVO {
        private int id;
        private User user;
    }

      在参数传递页面,可以使用:对象.对象属性名 做匹配

    <form action="reg6.action" method="post">
        <!-- id参数名和vo的id属性名一致的时候,可以直接绑定到vo对象 -->
        id:<input type="text" name="id" /><br/>
        <!--vo的另外一个属性时user,参数名:类.属性名 -->
        用户名:<input type="text" name="user.username" /><br/>
        密码:<input type="text" name="usser.password" /><br/>
        <input type="submit" value="注册" />
    </form>

      controller层:

    @RequestMapping("/reg.action")
    public String reg(UserVO userVO) {
        System.out.println(userVO);
        return "result";
    }

    数组类型参数的绑定

      和基本参数类型的绑定类似,可以直接通过数组名进行绑定;

        页面:

    <form action="reg.action" method="post">
        用户名:<input type="text" name="username" /><br/>
        密码:<input type="text" name="password" /><br/>
        爱好:
        <input type="checkbox" name="intrests" value="1">踢球
        <input type="checkbox" name="intrests" value="2">阅读
        <input type="checkbox" name="intrests" value="3">编程
        <br/>
        <input type="submit" value="注册" />
    </form>

        controller层:

    @RequestMapping("/reg.action")
    public String reg(Integer[] intrests,User user) {
        System.out.println(intrests.length+","+user);
        return "result";
    }

    List类型参数绑定

      和VO对象参数绑定类似,在页面中使用 list[i].属性名 进行绑定;

        页面:

    <form action="reg.action" method="post">
        <!-- id参数名和vo的id属性名一致的时候,可以直接绑定到vo对象 -->
        id:<input type="text" name="id" /><br/>
        用户名:<input type="text" name="userlist[0].username" /><br/>
        密码:<input type="text" name="userlist[1].password" /><br/>
        <input type="submit" value="注册" />
    </form>

        vo类:

    public class UserVO {
        private int id;
        private List<User> userlist;
    }

        controller层:

    @RequestMapping("/reg.action")
    public String reg(UserVO userVO) {
        System.out.println(userVO.getUserlist());
        return "result";
    }

    Map类型参数绑定

      在页面中利用键值对的方式绑定参数;

        页面:

    <form action="reg.action" method="post">
        <!-- id参数名和vo的id属性名一致的时候,可以直接绑定到vo对象 -->
        id:<input type="text" name="id" /><br/>
    
        用户名:<input type="text" name="userMap['user1'].username" /><br/>
        密码:<input type="text" name="userMap['user1'].password" /><br/>
    
        用户名:<input type="text" name="userMap['user2'].username" /><br/>
        密码:<input type="text" name="userMap['user2'].password" /><br/>
        <input type="submit" value="注册" />
    </form>

        vo类:

    public class UserVO {
        private int id;
        private Map<String,User> userMap;
    }

        controller层:

    @RequestMapping("/reg8.action")
    public String reg8(UserVO userVO) {
        System.out.println(userVO.getUserMap());
        return "result";
    }

    参数绑定中的中文乱码问题

      在我们进行中文字符的参数传递的时候,会出现乱码的问题,这时候我们就需要把字符编码转换为 UTF-8;所以,我们就可以使用过滤器的方式,对传递的参数转化字符编码;

      而对于post和get请求,转换编码的方式也是不同的;

      对于POST请求,

    request.setCharacterEncoding("utf-8");
    response.setCharacterEncoding("utf-8");

      只需加入这两行代码,而对于get请求,则需要使用手动转码的方式,使用wrapper

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //POST 方法
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
            
        //GET 方法
        HttpServletRequest req=(HttpServletRequest) request;
        if(req.getMethod().equals("GET")) {
            RequestWrapper myRequest = new RequestWrapper(req);
            //传递的是wrapper的请求对象,默认getParameter方法就进行了乱码的解决
            chain.doFilter(myRequest, response);
        }else {
            chain.doFilter(request, response);
        }
    }

      wrapper类:需要重写getParameter()方法

    public String getParameter(String name) {
        String oValue = super.getParameter(name);
        String rValue = null;
        try {
            rValue = new String(oValue.getBytes("iso-8859-1"),"utf-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return rValue;
    }

      这样,对于乱码问题就能解决了;

    自定义参数实现日期转换

      一般值类型(String/int/…)可以直接绑定到输入参数中;

      但是Date类型不能由界面传入的值直接绑定成功;

      所以我们就需要自定义一个类型转换器(String--Date);

      步骤:

        创建一个类型转换器类,实现Converter接口

    public class DateConverter implements Converter<String, Date> {
    
        @Override
        public Date convert(String arg0) {
            // TODO Auto-generated method stub
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            try {
                return sdf.parse(arg0);
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }
    
    }

        注册为Spring中的一个类型转换的bean

    <!-- 配置类型转换器:实现自定义类型转换器和参数绑定的联系 -->
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
         <!-- 注册自定义类型转换器 -->
         <property name="converters">
             <list>
                 <bean class="converter.DateConverter"></bean>
             </list>
         </property>
     </bean>

        需要注意的是:我们需要对类型转换器启用注解

    <!-- 启用注解 -->
    <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

      这样,就能够实现日期类型的转换了;

    以上就是参数绑定以及中文乱码解决方法的介绍了;

    PS:因作者能力有限,如有误还请谅解;

  • 相关阅读:
    问题账户需求分析
    需求分析初学理解
    GitHub初步探索-1-使用本地代码管理工具,简化上传的过程
    软件工程概论-个人总结
    第二次冲刺-个人工作总结05
    第二次冲刺-个人工作总结04
    第二次冲刺-个人工作总结03
    第二次冲刺-个人工作总结02
    第二次冲刺-个人工作总结01
    第一次冲刺-个人工作总结10
  • 原文地址:https://www.cnblogs.com/WHL5/p/9001695.html
Copyright © 2011-2022 走看看