.Net转Java自学之路—SpringMVC框架篇三(参数绑定、POST乱码)

SpringMVC参数绑定过程:从客户端请求key/value的数据,经过参数绑定,将key/value的数据绑定管道controller方法的形参中。

在SpringMVC中,接收页面提交的数据时,通过方法形参来接收,而不是controller类定义成员变量来接收。

流程:
  客户端请求key/value数据 >> 处理器适配器调用SpringMVC提供参数绑定组件将key/value数据转成controller方法的形参(参数绑定组件:在springmvc早期版本中使用PropertyEditor只能将字符串转成Java对象;后期使用converter可以进行任意类型的转换)。springmvc提供了很多converter转换器,在特殊情况下需要自定义converter(如对日期数据绑定需要自定义converter)>> 调用controller方法(形参)

参数绑定默认支持的类型:
  如要使用参数帮i的那个默认支持的类型,只需要直接在controller方法形参中定义默认支持的类型对象即可。这些对象就是在参数绑定的过程中,适配器如需要默认支持的类型直接进行绑定。
  HttpServletRequest:通过request对象获取请求信息。
  HttpServletResponse:通过response处理响应信息。
  HttpSession:通过session对象得到session中存放的对象。
  Model/ModelMap:Model是一个接口,ModelMap是一个接口实现。它们的作用就是将model模型数据填充到request域。

参数绑定简单类型:

  通过@RequestParam对简单类型的参数进行绑定。若不使用@RequestParam,要求request传入参数名称和controller方法的参数名称保持一致。若使用@RequestParam,不限制request参数参数名称和controller方法的形参名称一致。

//如:请求url    http://localhost/springmvc_projectname/goods/query.action?id=1

@RequestMapping(value="/query",method={RequestMethod.GET,RequestMethod.POST})
public String query1(Model model,Integer id)throws Exception{

}

@RequestMapping(value="/query",method={RequestMethod.GET,RequestMethod.POST})
public String query2(Model model,@RequestParam(value="id") Integer goods_id)throws Exception{
    //@RequestParam中指定request传入参数名称id和形参good_id进行绑定
}

@RequestMapping(value="/query",method={RequestMethod.GET,RequestMethod.POST})
public String query3(Model model,@RequestParam(value="id"required=true) Integer goods_id)throws Exception{
    //若在@RequestParam中指定required属性,则表示指定参数是否必须要传入。true时,若没有该参数则会报错。
}

@RequestMapping(value="/query",method={RequestMethod.GET,RequestMethod.POST})
public String query(Model model,@RequestParam(value="id",required=true,defaultValue="") Integer goods_id)throws Exception{
    //在@RequestParam中还可以指定defaultValue属性来设置默认值,当required=true且id没有传入时,将默认值和形参绑定。
}

参数绑定pojo类型:

  页面中input标签的name属性值和controller的pojo形参中的属性名称一致。才可以将页面中的数据绑定到pojo中。

参数绑定包装类型pojo:

  页面中input标签的name属性值和controller的形参包装类型pojo中的普通pojo的属性名称保持一致。才可以将页面中的数据帮i的那个到pojo中。该页面中input标签的name属性值的表现形式为:pojo类型.属性名.属性名......

参数绑定数组类型:

  如、复选框。
  controller形参中数组变量名要和页面中name值保持一致。

参数绑定List类型:

  使用List接收页面提交的批量数据,通过包装pojo接收,在包装pojo中定义list属性。页面name属性对应包装pojo中的 list属性名[下标].包装pojo中list类型属性中的pojo属性名。

自定义参数绑定:

  实现日期类型绑定,对于controller形参中pojo对象,若属性中有日期类型,需要自定义参数绑定。将请求日期数据串转成日期类型,要转换的日期类型和pojo中日期属性的类型保持一致。所以自定义参数绑定将日期串转成java.util.Date类型,需要向处理器适配器中注入自定义参数绑定组件。
  配置方式:

<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<!-- 自定义参数绑定 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <!-- 转换器 -->
    <property name="converter">
        <list>
            <!-- 日期类型转换 -->
            <bean class="cn.ccir.springmvctest.converter.CustomDateConverter"/>
            <bean class="自定义类型转换器类路径"/>
        </list>
    </property>
</bean>

  自定义日期转换器需要实现Converter<S,T>接口。

public class CustomDateConverter implements Converter<String,Date>{
    public Date convert(String source){
        //将日期串转成日期类型,格式:yyyy-MM-dd HH:mm:ss
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try{
            return sdf.parse(source);
        }catch(ParseException pe){
            pe.printStackTrace();
        }
        return null;
    }
}

SpringMVC中POST提交中文乱码:

  post提交中文乱码web.xml过滤器配置:

<!-- 配置springMVC编码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</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>
<!-- 启动过滤器 -->
<init-param>
    <param-name>forceEncoding</param-name>
    <param-value>true</param-value>
</init-param>
</filter>
<!-- 过滤所有请求 -->
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

 

posted @ 2019-04-07 15:23  水痕灬  阅读(161)  评论(0编辑  收藏  举报