zoukankan      html  css  js  c++  java
  • SSM框架之SpringMVC(2)参数绑定及自定义类型转换

    SpringMVC(2)参数绑定及自定义类型转换

    1、请求参数的绑定

    1.1、 请求参数的绑定说明

    1.1.1、绑定机制

    1. 表单提交的数据都是k=v格式的 username=haha&password=123
    2. SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
    3. 要求:提交表单的name和参数的名称是相同的

    例子:

    请求的html

    <a href="param/testParam?username=wf&password=123">参数绑定</a>
    

    对应方法

    @RequestMapping("/testParam")
    public String testParam(String username,String password){
        System.out.println("请求成功....");
        System.out.println("username = " + username + ",password = " + password);
        return "success";
    }
    

    1.1.2、支持的数据类型

    1. 基本数据类型和字符串类型
    2. 实体类型(JavaBean)
    3. 集合数据类型(List、map集合等)

    SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。

    1.1.3、使用要求

    如果是基本类型或者 String 类型:
    要求我们的参数名称必须和控制器中方法的形参名称保持一致。 (严格区分大小写)

    如果是 POJO 类型,或者它的关联对象:
    要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。

    如果是集合类型,有两种方式

    第一种:
    要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
    给 List 集合中的元素赋值, 使用下标。
    给 Map 集合中的元素赋值, 使用键值对。
    第二种:
    接收的请求参数是 json 格式数据。需要借助一个注解实现

    1.2、参数绑定示例

    1.2.1、对基本类型的绑定

    请求的html

    <a href="param/testParam?username=wf&password=123">参数绑定</a>
    

    对应方法

    @RequestMapping("/testParam")
    public String testParam(String username,String password){
        System.out.println("请求成功....");
        System.out.println("username = " + username + ",password = " + password);
        return "success";
    }
    

    1.2.2、对实体类型的绑定(pojo)

    实体类:

    public class Account implements Serializable {
        private String username;
        private String password;
        private Double money;
        /*getting和setting*/
    }
    

    请求的html

    <form action="param/saveAccount" method="post">
        姓名:<input type="text" name="username"/><br>
        密码:<input type="text" name="password"/><br>
        金额:<input type="text" name="money"/><br>
        <input type="submit" name="提交">
    </form>
    

    接收请求的方法

    @RequestMapping("/saveAccount")
    public String saveAccount(Account account){
        System.out.println("请求成功....");
        System.out.println(account);
        return "success";
    }
    

    1.2.3、对实体类型中包含集合类型的绑定(pojo)

    实体类:

    public class Account implements Serializable {
        private String username;
        private String password;
        private Double money;
    
        private List<User> list;
        private Map<String,User> map;
        /*getting和setting*/
    }
    
    
    public class User implements Serializable {
        private String uname;
        private Integer age;
        /*getting和setting*/
    }
    

    请求的html

    <form action="param/saveAccount" method="post">
        姓名:<input type="text" name="username"/><br>
        密码:<input type="text" name="password"/><br>
        金额:<input type="text" name="money"/><br>
    
        用户姓名:<input type="text" name="list[0].uname"/><br>
        用户年龄:<input type="text" name="list[0].age"/><br>
    
        用户姓名:<input type="text" name="map['1'].uname"/><br>
        用户年龄:<input type="text" name="map['1'].age"/><br>
        <input type="submit" name="提交">
    </form>
    

    接收请求的方法

    @RequestMapping("/saveAccount")
    public String saveAccount(Account account){
        System.out.println("请求成功....");
        System.out.println(account);
        return "success";
    }
    

    1.3、自定义类型转换器

    注意:
    它还可以实现一些数据类型自动转换。 内置转换器全都在:
    org.springframework.core.convert.support 包下。 有:
    java.lang.Boolean -> java.lang.String : ObjectToStringConverter
    java.lang.Character -> java.lang.Number : CharacterToNumberFactory
    java.lang.Character -> java.lang.String : ObjectToStringConverter
    java.lang.Enum -> java.lang.String : EnumToStringConverter
    java.lang.Number -> java.lang.Character : NumberToCharacterConverter
    java.lang.Number -> java.lang.Number : NumberToNumberConverterFactory
    java.lang.Number -> java.lang.String : ObjectToStringConverter
    java.lang.String -> java.lang.Boolean : StringToBooleanConverter
    java.lang.String -> java.lang.Character : StringToCharacterConverter
    java.lang.String -> java.lang.Enum : StringToEnumConverterFactory
    java.lang.String -> java.lang.Number : StringToNumberConverterFactory
    java.lang.String -> java.util.Locale : StringToLocaleConverter
    java.lang.String -> java.util.Properties : StringToPropertiesConverter
    java.lang.String -> java.util.UUID : StringToUUIDConverter
    java.util.Locale -> java.lang.String : ObjectToStringConverter
    java.util.Properties -> java.lang.String : PropertiesToStringConverter
    java.util.UUID -> java.lang.String : ObjectToStringConverter

    如遇特殊类型转换要求,需要我们自己编写自定义类型转换器

    mvc中的类型转换的内部转换器可以实现1999/11/11的字符串转为日期类型,但是如果1999-11-11字符串那么就不能被自动转换,需要我们自定义类型转换器。

    实现步骤

    1、定义类实现Converter接口,并在其中必须类型转换的方法

    import org.springframework.core.convert.converter.Converter;
    
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    /**
     * 字符串转日期
     */
    public class StringToDateConverter implements Converter<String , Date> {
    
        /**
         *
         * @param source 传入的字符串
         * @return 转换后的日期类型
         */
        @Override
        public Date convert(String source) {
            if (source == null){
                throw new RuntimeException("请传入数据");
            }
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            try {
                return df.parse(source);
            } catch (Exception e) {
                throw new RuntimeException("数据转换异常");
            }
        }
    }
    

    2、在配置文件中开启对自定义类型转换器的支持

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:component-scan base-package="wf"></context:component-scan>
    
        <!--配置视图解析器-->
        <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/pages/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <!--自定义类型转换器-->
        <bean id="conversionService2" class="org.springframework.context.support.ConversionServiceFactoryBean">
            <property name="converters">
                <set>
                    <bean class="wf.untils.StringToDateConverter"></bean>
                </set>
            </property>
        </bean>
    
        <!--开启springMVC框架注解的支持-->
        <!--conversion-service属性表示把自定义的类型转换器添加到环境中-->
        <mvc:annotation-driven conversion-service="conversionService2"></mvc:annotation-driven>
    
    </beans>
    

    3、测试

    使用的实体类

    import java.io.Serializable;
    import java.util.Date;
    
    public class User implements Serializable {
        private String uname;
        private Integer age;
        private Date date;
    }
    

    定义html测试表单

    <form action="param/saveUser" method="post">
        用户姓名:<input type="text" name="uname"/><br>
        用户年龄:<input type="text" name="age"/><br>
        用户生日:<input type="text" name="date"/><br>
    
        <input type="submit" name="提交">
    </form>
    

    2、请求参数乱码问题

    2.1、post 请求方式

    在 web.xml 中配置一个过滤器

      <!--解决中文乱码过滤器-->
      <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>
    

    在 springmvc 的配置文件中可以配置,静态资源不过滤:

    <!-- location 表示路径, mapping 表示文件, **表示该目录下的文件以及子目录的文件 -->
    <mvc:resources location="/css/" mapping="/css/**"/>
    <mvc:resources location="/images/" mapping="/images/**"/>
    <mvc:resources location="/scripts/" mapping="/javascript/**"/>
    

    2.2、get 请求方式:

    tomacat 对 GET 和 POST 请求处理方式是不同的, GET 请求的编码问题, 要改 tomcat 的 server.xml配置文件,如下 :

    <Connector connectionTimeout="20000" port="8080"
    protocol="HTTP/1.1" redirectPort="8443"/>
    

    改为:

    <Connector connectionTimeout="20000" port="8080"
    protocol="HTTP/1.1" redirectPort="8443"
    useBodyEncodingForURI="true"/>
    

    如果遇到 ajax 请求仍然乱码,请把:
    useBodyEncodingForURI="true"改为 URIEncoding=“UTF-8”
    即可

    3、获取servlet原生api

    SpringMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。支持原始 ServletAPI 对象有:

    HttpServletRequest
    HttpServletResponse
    HttpSession
    java.security.Principal
    Locale
    InputStream
    OutputStream
    Reader
    Writer

    我们可以把上述对象,直接写在控制的方法参数中使用。

    测试用例:

    <a href="param/testServlet">Servlet原生api</a>
    
    @RequestMapping("/testServlet")
    public String testServlet(HttpServletRequest request, HttpServletResponse response){
        System.out.println("请求成功....");
        System.out.println(request);
        HttpSession session = request.getSession();
        System.out.println(session);
        ServletContext servletContext = session.getServletContext();
        System.out.println(servletContext);
        System.out.println(response);
        return "success";
    }
    
  • 相关阅读:
    【华为云技术分享】40行代码教你利用Python网络爬虫批量抓取小视频
    【华为云技术分享】【Python成长之路】机器学习:10+分类算法汇总学习
    【华为云技术分享】漫谈LiteOS之开发板-中断(基于GD32450i-EVAL)
    【华为云技术分享】多模态融合算法——Multimodal Compact Bilinear Pooling
    【Java_基础】HashMap的工作原理
    【前端_js】jQuery动态设置元素的样式
    【前端_React】npm常用命令
    【前端_React】Node.js和webpack的安装
    【Java框架】Postman的使用
    【前端_js】javascript中数组的map()方法
  • 原文地址:https://www.cnblogs.com/wf614/p/11673822.html
Copyright © 2011-2022 走看看