文章目录

(一)请求参数绑定入门
(二)请求参数绑定实体类型
(三)配置解决中文乱码的过滤器
(四)请求参数绑定集合类型
(五)自定义类型转换器演示异常
(六)自定义类型转换器代码编写
(七)获取Servlet原生的API

(一)请求参数绑定入门

比如说我们希望前端传usernamepassword,即前端请求username=hehe&password=123,那么使用MVC框架只需要在方法的参数指明即可,即sayHello(String username,String password)
底层原理:通过反射获取方法的参数信息,从而进行绑定

支持的数据类型:

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

下面代码演示一下
param.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--    请求参数绑定--%>
    <a href="param/testParam?username=hehe">请求参数绑定</a>
</body>
</html>

ParamController.java

/**
 * 请求参数绑定
 */
@Controller
@RequestMapping("/param")//一级目录
public class ParamController {

    /**
     * 请求参数绑定的入门
     *
     * @return
     */
    @RequestMapping("/testParam")
    public String testParam(String username) {
        System.out.println("username:" + username);
        return "success";
    }
}

运行结果如下:
在这里插入图片描述
在这里插入图片描述
如果传输多个参数就用&符号隔开,如下:
在这里插入图片描述
可以看到如果传输的参数数量太多,这种绑定方法就很麻烦了
如果传输的参数数量比较多,我们通常会封装成一个JavaBean对象,下面会介绍

(二)请求参数绑定实体类型

我们先创建一个实体类,如下:
在这里插入图片描述
然后写一个页面,注意name要跟实体类的属性一一对应,如下:
在这里插入图片描述
最后在控制器类编写方法,注意方法的参数是实体类,如下:

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

运行服务器测试,如下:
在这里插入图片描述
注意:现在不能输入中文,会出现乱码问题,下面再介绍解决办法
在这里插入图片描述
可以看到参数都被封装到实体类中了
下面再看一个问题,如果实体类中的属性类型是引用类型又该如何封装呢?
在这里插入图片描述
我们先创建一个User实体类,如下:
在这里插入图片描述
控制器类的方法不用改,主要改页面的,表达式:user.uname(其中user为Account实体类的User引用类型的参数名;uname则为User引用类型的属性名
在这里插入图片描述
运行服务器测试程序,如下:
在这里插入图片描述
在这里插入图片描述

(三)配置解决中文乱码的过滤器

先演示一下中文乱码问题,如下:
在这里插入图片描述
注意GET方法是不会乱码的,乱码的是POST方法,但是经过下面的配置,什么方法都不会乱码了
在这里插入图片描述
我们在黑马旅游网项目中曾经手写过一个过滤器专门处理中文乱码问题,现在springmvc给我们提供了一个过滤器,我们不用自己手写,直接调用即可,如下:
我们在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>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

此时再次测试,如下:
在这里插入图片描述

(四)请求参数绑定集合类型

我们准备一个List集合和一个Map集合,如下:
在这里插入图片描述
接着写页面,依然是有特定的表达式,如下:
(其中的list[0]是指List集合的第一个元素,map['one']是指Map集合的key为one的元素)

<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对象,然后把该User对象存入List集合--%>
    用户姓名:<input type="text" name="list[0].uname"></br>
    用户年龄:<input type="text" name="list[0].age"></br>
    <%--    把下面的数据封装成一个User对象,然后把该User对象存入Map集合--%>
    用户姓名:<input type="text" name="map['one'].uname"></br>
    用户年龄:<input type="text" name="map['one'].age"></br>
    <input type="submit" value="提交"></br>
</form>

控制器类的方法不用改,因为依然是封装成Account实体类,只是该实体类中包含集合类型数据
运行结果如下:
在这里插入图片描述
在这里插入图片描述

(五)自定义类型转换器演示异常

其实只要是浏览器请求的数据,服务器接收了之后都是String(字符串)类型的
那为什么我们的age属性会被转换成Integer呢?其实是SpringMVC帮我们转换的
在这里插入图片描述
理论上SpringMVC能转大多数的类型,但是有一些还是无法转换的,比如非标准的日期类型
2000/11//11是可以转的,但是2000-11-11就不可以了,我们可以自己写一个转换器实现转换
我们模拟上面的情景,给User实体类加多一个Date类型的属性,如下:
在这里插入图片描述
接着修改页面,如下:
(为了简单起见,直接保存User,所以要在控制器类写一个新方法)

<%--    请求参数绑定--%>
<form action="param/saveUser" method="post">
    用户姓名:<input type="text" name="uname"></br>
    用户年龄:<input type="text" name="age"></br>
    用户生日:<input type="text" name="date">
    <input type="submit" value="提交"></br>
</form>

控制器类中写一个新方法,如下:

    @RequestMapping("/saveUser")
    public String saveUser(User user) {
        System.out.println(user);
        return "success";
    }

运行结果如下:
在这里插入图片描述
在这里插入图片描述
下面演示非标准格式,如下:
在这里插入图片描述
在这里插入图片描述
可以看到出问题了数据无法正常封装
(此时只能从浏览器看到报错信息,服务器是没有报错信息的)

(六)自定义类型转换器代码编写

其实SpringMVC是写了很多Converter接口的实现类实现类型转换的,我们先看看该接口的源码
在这里插入图片描述
自定义转换器的核心思想也是自己写一个实现类实现上述接口
在这里插入图片描述
也就是<S>写字符串类型,<T>写日期类型,分析完毕,接下来开始编码
在这里插入图片描述
实现Converter接口并且实现接口的方法,如下:
在这里插入图片描述

    /**
     * @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("数据类型转换出现错误");
        }
    }

我们需要在springmvc配置自定义类型转换器,如下:
在这里插入图片描述
然后还需要配置依赖来绑定我们自己写的StringToDateConverter,完整代码如下:
(注意:converters是一个Set集合)

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

最后还要配置一个地方,如下:
在这里插入图片描述
之前介绍过annotation-driven标签会把适配器之类的帮我们全部配好,但是我们自定义的类型转换器就需要我们自己手动加上去了

运行结果如下:
在这里插入图片描述
在这里插入图片描述

(七)获取Servlet原生的API

如果我们想要拿到原生的request对象或者response对象应该怎么获取?
先写一个页面,如下:

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

再写一个控制器类方法,如下:

    /**
     * 原生的API
     *
     * @return
     */
    @RequestMapping("/testServlet")
    public String testServlet(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("request:" + request);
        HttpSession session = request.getSession();
        System.out.println("session:" + session);
        ServletContext servletContext = session.getServletContext();
        System.out.println("servletContext:" + servletContext);
        return "success";
    }

运行结果如下:
在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐