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:因作者能力有限,如有误还请谅解;

原文地址:https://www.cnblogs.com/WHL5/p/9001695.html