SpringMVC黑马:请求参数的绑定(各种数据类型,中文乱码等)


1.支持的数据类型

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

1.基本数据类型和字符串类型

  • 提交表单的name和参数的名称是相同的
  • 区分大小写

control层(控制层)

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

param.jsp

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

user类(domain) 省略set和get方法,toString()方法

public class User implements Serializable {
    private String uname;
    private Integer age;
    public String getUname() {
        return uname;
    }

结果:

testParam执行了
         你的用户名:jh
         你的登录密码:123

2.实体类型(JavaBean)

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

control层(控制层)

/请求参数绑定把数据封装到JavaBean的类中(这里封装到Account类中)
    @RequestMapping("/saveAccount")
    public String saveAccount(Account account) {
        System.out.println("saveAccount执行了");
        System.out.println(account);
        return "success";

param.jsp
提交表单的name和JavaBean中(Account类)的属性名称需要一致

<%--把数据封装到Account类中--%>
<form action="param/saveAccount" method="post">
    姓名:<input type="text" name="username"/><br/>
    密码:<input type="text" name="password"/><br/>
    金额:<input type="text" name="money"/><br/>
    User姓名:<input type="text" name="user.uname"/><br/>
    User年龄:<input type="text" name="user.age"/><br/>
    <input type="submit" value="提交"/>
</form>

Account类省略set和get方法,有引用类型User

public class Account implements Serializable {
    private String username;
    private String password;
    private double money;
    private User user;

结果:

1.请求参数绑定实体类型User
  saveAccount执行了
     Account{username='ghh', password='1234', money=1200.0,
     user=User{uname='jh', age=25}}


3. 给集合属性数据封装

  • JSP页面编写方式:list[0].属性

control层(控制层)

@RequestMapping("/saveAccount")
    public String saveAccount(Account account) {
        System.out.println("saveAccount执行了");
        System.out.println(account);
        return "success";

param.jsp
List集合和Map集合

 <%--把数据封装到Account类中,类中存在list和map集合--%>
    <form action="param/saveAccount" method="post">
        姓名:<input type="text" name="username"/><br/>
        密码:<input type="text" name="password"/><br/>
        金额:<input type="text" name="money"/><br/>
        <%--List集合--%>
        User姓名:<input type="text" name="list[0].uname"/><br/>
        User年龄:<input type="text" name="list[0].age"/><br/>
        User姓名:<input type="text" name="list[1].uname"/><br/>
        User年龄:<input type="text" name="list[1].age"/><br/>
        <%--Map集合--%>
        User姓名:<input type="text" name="map['one'].uname"/><br/>
        User年龄:<input type="text" name="map['one'].age"/><br/>
        User姓名:<input type="text" name="map['two'].uname"/><br/>
        User年龄:<input type="text" name="map['two'].age"/><br/>
        <input type="submit" value="提交"/>
    </form>

Account类 只有List和Map属性,其他省去

public class Account implements Serializable {
    private List<User> list;
    private Map<String,User> map;

结果:(解决中文乱码)

3.参数绑定集合list和map
Account{username='张天', password='12389', money=12000.0, user=null,
list=[User{uname='光头强', age=23}, User{uname='光头黑', age=24}],
map={one=User{uname='熊大', age=12}, two=User{uname='熊二', age=11}}}

4.请求参数中文乱码的解决

  • 在web.xml中配置Spring提供的过滤器类
<!-- 配置过滤器,解决中文乱码的问题 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filterclass>
<!-- 指定字符集 -->
<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>

结果:

2.在web.xml中解决post提交中文乱码问题:
         saveAccount执行了
Account{username='张三', password='12334', money=14525.0, user=User{uname='李四', age=34}}

5. 自定义类型转换器

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

control层(控制层)

/*封装到User2类中,类型转换器:日期格式:只有这种格式不报错1998/12/11*/
    @RequestMapping("/saveDate")
    public String saveUser2(User2 user) {
        System.out.println("saveAccount执行了");
        System.out.println(user);
        return "success";
    }

param.jsp

<form action="param/saveDate" method="post">
       姓名:<input type="text" name="uname"/><br/>
       密码:<input type="text" name="age"/><br/>
       日期:<input type="text" name="date"/><br/>
       <input type="submit" value="提交"/>
   </form>

user2类(domain) 省略set和get方法,toString()方法

/**添加了日期属性*/
public class User2 implements Serializable {
    private String uname;
    private Integer age;
    private Date date;

自定义类型转换器(自己写的,不是SpringMVC提供的)
StringToDateConverter类

/**将字符串转换日期:标准日期格式不报错 1998/12/11
 * 为了解决日期格式:1998-12-12等格式的异常,需要定义一个类型转换器
 * */
public class StringToDateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String source) {//source是传进来的字符串
        //判断
        if (source == null) {
            throw new RuntimeException("请您传入数据:");
        }
        DateFormat df=new SimpleDateFormat("yyyy-MM-dd");
        //将字符串转换成日期
        try {
            return df.parse(source);
        } catch (ParseException e) {
            throw new RuntimeException("数据类型转换出现错误");
        }
    }
}

结果:

User2{uname='张甜甜', age=1425, date=Fri Dec 11 00:00:00 CST 1998}
  	1995-12-12格式结果如下:
User2{uname='撒', age=12, date=Tue Dec 12 00:00:00 CST 1995}

2.如果不想自己写类型转换器,在springmvc.xml配置文件中编写配置

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

    <!-- 开启SpringMVC框架注解的支持 -->
    <mvc:annotation-driven conversion-service="conversionService"/><!--conversionService把自定义类型转换器生效-->

6.获取原生API

control层(控制层)

 //获取原生的API
    @RequestMapping("/testServlet")
    public String testServlet(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("testServlet执行了");
        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";
    }

param.jsp

 <a href="param/testServlet">Servlet原生的API</a>

结果:

org.apache.catalina.connector.RequestFacade@5a09c28e
org.apache.catalina.session.StandardSessionFacade@5f6c9ddb
org.apache.catalina.core.ApplicationContextFacade@5120c2c2
 org.apache.catalina.connector.ResponseFacade@87f414

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值