笔记三、请求参数的绑定

第三章:请求参数的绑定

请求参数的绑定说明

  • 绑定机制

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

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

2、基本数据类型和字符串类型

  • 提交表单的name和参数的名称是相同的

  • 区分大小写

3、实体类型(JavaBean)

  • 提交表单的name和JavaBean中属性名称需要一致

  • 如果一个JavaBean类中包含其它的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name

4、给集合属性数据封装

    用户姓名:<input type="text" name="list[0].uname" /><br/>
    用户年龄:<input type="text" name="list[0].age" /><br/>

    用户姓名:<input type="text" name="map['one'].uname" /><br/>
    用户年龄:<input type="text" name="map['one'].age" /><br/>

5、解决中文乱码

6、自定义类型转换器

表单提交的任何数据类型都是字符串类型,但是后台定义Integer类型,数据可以封装,说明Spring框架内部会默认进行数据类型转换。
如果想自定义类型转换可以实现Converter接口。

7、在控制器中使用原生的ServletAPI对象

只需要在控制器的方法参数定义HttpServletRequest和HttpServletResponse对象

一、入门示例:

  • webapp下编写params.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <%--请求参数绑定--%>
    <a href="param/testParam?username=hehe&password=123">请求参数绑定</a>

</body>
</html>
  • controller下编写ParamController
/**
 * 请求参数绑定
 */
@Controller
@RequestMapping("/param")
public class ParamController {

    /**
     * 请求参数绑定入门
     * @return
     */
    @RequestMapping("/testParam")
    public String testParam(String username,String password){
        System.out.println("执行了。。。");
        System.out.println("用户名:" + username);
        System.out.println("密码:" + password);
        return "success";
    }
}

二、把数据封装到JavaBean的类中:

  • webapp下编写params.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <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="user.uname" /><br/>
        用户年龄:<input type="text" name="user.age" /><br/>
        <input type="submit" value="提交" />
    </form>

</body>
</html>
  • controller下编写ParamController
/**
 * 请求参数绑定
 */
@Controller
@RequestMapping("/param")
public class ParamController {

    /**
     * 请求参数绑定入门
     * @return
     */
    @RequestMapping("/testParam")
    public String testParam(String username,String password){
        System.out.println("执行了。。。");
        System.out.println("用户名:" + username);
        System.out.println("密码:" + password);
        return "success";
    }

    /**
     * 请求参数绑定把数据封装到JavaBean的类中
     * @return
     */
    @RequestMapping("/saveAccount")
    public String saveAccount(Account account){
        System.out.println("执行了。。。");
        System.out.println(account);
        return "success";
    }
}
  • domain下Account和User:

public class Account implements Serializable {

    private String username;
    private String password;
    private Double money;

    private User user;
    
    //省略get,set,tostring方法。
}

public class User implements Serializable {

    private String uname;
    private Integer age;
	
	//省略get,set,tostring方法。
}
  • 解决中文乱码,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>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  • 在Account里添加List和Map集合,给集合封装,在param.jsp上改:
    用户姓名:<input type="text" name="list[0].uname" /><br/>
    用户年龄:<input type="text" name="list[0].age" /><br/>

    用户姓名:<input type="text" name="map['one'].uname" /><br/>
    用户年龄:<input type="text" name="map['one'].age" /><br/>
  • 三种执行结果:

在http://localhost:8080/springmvc_day01_01_start/params.jsp上填入表单数据。

执行了。。。
Account{username='hehe', password='456', money=300.0, user=User{uname='haha', age=20}}

执行了。。。
Account{username='哈哈', password='111', money=1.0, user=User{uname='呵呵', age=10}}

执行了。。。
Account{username='呵呵', password='123', money=1000.0, list=[User{uname='哈哈', age=20}], map={one=User{uname='嘿嘿', age=30}}}

三、自定义类型转换器

日期输入2000/1/1时,属于正常格式,可以转换;但是2000-1-1就会报错。

  • 在User加入Date属性,

  • 添加utils层:

package cn.itcast.utils;

import org.springframework.core.convert.converter.Converter;

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("请您传入数据");
        }
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

        //转换
        try {
            return df.parse(source);
        } catch (Exception e) {
            throw new RuntimeException("数据类型转换出错");
        }
    }
}

  • 配置springmvc.xml:
    <!--配置自定义类型转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="cn.itcast.utils.StringToDateConverter"></bean>
            </set>
        </property>
    </bean>

    <!--开启Spring对MVC注解的支持-->
    <mvc:annotation-driven conversion-service="conversionService"/>
  • 修改params.jsp:
    <%--自定义类型转换器--%>
    <form action="param/saveUser" method="post">
        用户姓名:<input type="text" name="username" /><br/>
        用户密码:<input type="text" name="password" /><br/>
        用户生日:<input type="text" name="date" /><br/>
        <input type="submit" value="提交" />
    </form>
  • 结果,表单日期栏输入2000-1-1,转换成功:
执行了。。。
User{uname='null', age=null, date=Sat Jan 01 00:00:00 CST 2000}

四、在控制器中使用原生的ServletAPI对象

  • 修改params.jsp:
    <a href="param/testServlet">Servlet原生的API</a>
  • 修改ParamController:
    /**
     * 原生API
     * @param
     * @return
     */
    @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";
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值