• .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>
  • 相关阅读:
    一些正则表达式
    iOS汉字中提取首字母
    flutter 按钮弹簧动画AnimationController
    In iOS 14+,debug mode Flutter apps can only be launched from Flutter tooling,IDEs with Flutter plugins or from Xcode.
    Failed to connect to raw.githubusercontent.com port 443: Connection refused
    iOS组件库创建(二)
    iOS组件库创建(一)
    同个电脑多个ssh key的配置
    网络相关总结
    flutter 热更新实现方案—UI资源化(二)
  • 原文地址:https://www.cnblogs.com/zltao/p/10665527.html
Copyright © 2020-2023  润新知