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