SpringMVC入门与数据绑定(三)

简介: SpringMVC入门与数据绑定

下面继续回到复合数据的接受,作为数组接收数据固然没有问题,但是大家发现了没有,数组其实用得越来越少了。因为java提供了更加有效的数据结构,就是集合。就可以通过List集合来保存数据。用法其实也差不多,默认以ArrayList来存储数据。区别在于,用List集合接收符合数据,要在前面添加@RequestParam注解 ,下面编写代码:


    //通过List来接收表单复合数据
    @PostMapping("/apply")
    @ResponseBody
    public String apply(String name, String course, @RequestParam List<Integer> purpose){
        return name+" "+course+" "+purpose.size();
    }


上面对于这些参数都是单独接收的,下面来试试采取对象的形式来接收。

在entity包下面创建一个新的实体类Form


package com.haiexijun.springmvc.entity;
import java.util.List;
public class Form {
    private String name;
    private String course;
    private List<Integer> purpose;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getCourse() {
        return course;
    }
    public void setCourse(String course) {
        this.course = course;
    }
    public List<Integer> getPurpose() {
        return purpose;
    }
    public void setPurpose(List<Integer> purpose) {
        this.purpose = purpose;
    }
}


对controller里面的apply方法进行修改:


    //通过List来接收表单复合数据
    @PostMapping("/apply")
    @ResponseBody
    public String apply(Form form){
        return form.getName()+" "+form.getCourse()+" "+form.getPurpose().size();
    }


下面再扩展一个额外的知识点,用Map来接收表单数据。同样要加@RequestParam注解,并且表单传过来的参数不能有复合数据,不然只显示复合数据的第一项。


    //通过List来接收表单复合数据
    @PostMapping("/apply")
    @ResponseBody
    public String apply(@RequestParam Map map){
        return (String) map.get("name");
    }


4.关联对象赋值


关联对象就是在一个对象中引用了另外一个对象,我们需要对这个被引用的对象进行赋值的操作。


下面用一个案例来了解一下

在我们上网的时候,一些关键性的操作往往是要进行实名认证的,比如我们去12306买票,除了输入用户名和密码以外,你还要去登记你的姓名、身份证号、以及身份证的过期时间。等等这些信息。这时,就要对IdCard对象关联赋值了。


cfad03686fc6493fbbb812667fe83968.png


e168b13d754a43379ec5c3dd23878997.png


我们要在前端表单进行一下修改,把原有的身份证相关输入的部分变成对象名.属性名的形式。


3279703528154b6985a132dde749beff.png


5.日期类型转换


本节学习一个非常实用的技巧,在SpringMVC中接收日期类型的数据。我们都知道全世界各地,对于日期的表达方式都不同,我们如何接收程序中的日期数据,然后将他转换为日期对象呢?


<form action="/apply" method="post">
    <input type="text" name="createTime">
    <input type="submit" value="提交">
</form>


上面是前端的一个简单的表单,输入日期,然后再下面的controller里面的方法中进新处理:

    @PostMapping("/apply")
    @ResponseBody
    public String apply(Date createTime){
        return createTime;
    }


但是上面这样写明显是不行的。spring mvc无法将它转换成日期类型

必须要加上@DateTimeFormat这个注解。 这个注解专用于将前台传入的日期字符串转换为日期格式。注解里面pattern要传入特定的日期格式。


    @PostMapping("/apply")
    @ResponseBody
    public String apply(@DateTimeFormat(pattern = "yyyy-MM-dd") Date createTime){
        return createTime.toString();
    }


下面运行测试一下:


7abbda98086e4da18ffc0c1d90a8bf44.png

如果要javaBean里面接收参数的话,就要再Bean中的Date类型的参数上面添加@DateFormat注解。


6aaab14e845a46f48addf5ad47ac0243.png


三.解决中文乱码问题


本节来学习如何在Spring MVC中解决中文乱码的问题。


Tomcat默认使用的字符集是ISO-8859-1,属于西欧字符集。解决乱码的核心思路就是将ISO-8859-1转换为UTF-8。Controller中请求与响应都要设置UTF-8字符集。


中文乱码的配置:

Get请求乱码—server.xml(tomcat里面的)中添加URIEncoding属性。


f050c3d5c7d9450ab76fa417073122c9.png


Post请求乱码—web.xml(项目的)中配置CharacterEncodingFilter这个过滤器,通过spring提供的这个过滤器来解决post请求当中中文乱码的问题。


<web app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
     ···············
     ················
    <filter>
        <filter-name>characterFilter</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>characterFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web app>


Response响应乱码—Spring配置StringHttpMessageConverter这个消息转换器来往成响应输出的中文解决。

打开applicationContext.xml文件,在<mvc:annotation-driven>里面添加如下的代码:


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.1.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
    <!--自动扫描组件,自动扫描符合条件的bean-->
    <context:component-scan base-package="com.haiexijun.springmvc"></context:component-scan>
    <!--启用Spring MVC的注解开发模式-->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=utf-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    <!--将图片/JS/CSS等静态资源排除在外,可提高执行效率-->
    <mvc:default-servlet-handler/>
</beans>

基本上在我们任何一个项目中,这三部都要进行设置。


四.响应输出


前面一直在学习请求中如何接收数据,如何URL映射,本节学习响应是如何对外输出结果的。


在响应中产生结果主要有两种方式,第一种是在我们Controller的方法上增加@ResponseBody注解,来产生响应文本。我们光产生文本很多时候是不够的,往往是需要显示对应的页面。就要用到ModelAndView对象,在利用模板引擎渲染输出。


1.@ResponseBody


@ResponseBody直接产生响应体的数据,过程不涉及任何视图,@ResponseBody可产生标准字符串/JSON/XML等格式数据。@ResponseBody被StringHttpMessageConverter所影响。


2.ModelAndView对象的用法


在我们项目开发的时候,很多时候都是需要进行页面展现的,那如果要在SpringMVC中进行页面展现的话,就要实用ModelAndView这个对象了。所谓ModelAndView对象是指“模型(数据)与视图(界面)”对象,这个对象的作用呢就是将模型和视图进行绑定。通过ModelAndView对象可以将包含数据对象与模板引擎进行绑定。Spring MVC中默认的View是JSP,也可以配置其他模板引擎。


下面来小小的演示一下:


    //返回值类型为ModelAndView
    @GetMapping("/view")
    public ModelAndView showView(){
        //构造函数里面传入一个jsp页面
        ModelAndView mav=new ModelAndView("view.jsp");
        return mav;
    }


然后创建view.jsp页面。


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>I am view page</h1>
</body>
</html>


浏览器输入URL地址后:


bc6e036abaa54017bfc94b9697de663f.png


上面的案例你可能会觉得也没什么了不起嘛,其实可以将方法中传入的参数进行在里面渲染后输出的。

下面对进行更改讲解


    @GetMapping("/view")
    public ModelAndView showView(Integer userId){
        //构造函数里面传入一个jsp页面
        ModelAndView mav=new ModelAndView("view.jsp");
        User user=new User();
        if (userId==1){
            user.setUsername("lily");
        }else if (userId==2){
            user.setUsername("smith");
        }
        mav.addObject("u",user);
        return mav;
    }


上面接收一个get请求的参数,然后把参数传进JSP内渲染。


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>I am view page</h1>
<hr/>
<h2>uaername:${u.username}</h2>
</body>
</html>


但是这些还是远远不够的,下面就来对ModelAndView进行深入的学习。


作为数据绑定,ModelAndView对象提供了一个addObject()方法,addObject()方法设置的属性默认存放在当前请求中。里面存入的对象可以是任何java对象。ModelAndView对象默认使用请求转发(forward)至页面。

如果要使用响应重定向,就要使用 new ModelAndView(“redirect:/xxx.jsp”) ,即添加redirect


ModelAndView可以不在创建对象时,在构造方法里面写跳转的地址,可以在创建对象后,通过ModelAndView对象的setViewName()方法来设置跳转的视图的地址。


 ModelAndView mav=new ModelAndView();
 mav.setViewName("/view.jsp")


下面再来扩展一个知识点,就是利用String与ModelMap这两个对象来实现与 ModelAndView类似的一个功能。

Controller方法返回String的情况:

1.方法被@ResponseBody注解,SpringMVC注解响应String字符串本身。

2.方法不存在@ResponseBody注解,SpringMVC处理String为视图(页面)


    @GetMapping("/view")
    public String showView(Integer userId, ModelMap modelMap){
        String view="/view.jsp";
        User user=new User();
        if (userId==1){
            user.setUsername("lily");
        }else if (userId==2){
            user.setUsername("smith");
        }
        //与ModelAndView的addObject完全相同
        modelMap.addAttribute("u",user);
        return view;
    }


五.Spring MVC整合FreeMarker


整合的步骤主要分为3步:

1.pox.xml中引入freemarker的maven依赖和一个Spring上下文的支持包。 Spring上下文的支持包要与spring-webmvc版本一致。


    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.13</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>5.3.13</version>
        </dependency>
    </dependencies>


2.启用Freemarker模板引擎

在applicationContext.xml中添加如下配置:


    <bean id="ViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <!--设置响应输出,解决中文乱码-->
        <property name="contentType" value="text/html;charset=utf-8"/>
        <!--指定FreeMarker模板文件拓展名-->
        <property name="suffix" value=".ftl"/>
    </bean>


3.配置Freemarker参数

在applicationContext.xml中添加如下配置:


    <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <!--设置模板保存的目录-->
        <property name="templateLoaderPath" value="/WEB-INF/ftl"/>
        <!--其他设置-->
        <property name="freemarkerSettings">
            <props>
                <!--设置Freemarker脚本与数据渲染时使用的字符集-->
                <prop key="defaultEncoding">UTF-8</prop>
            </props>
        </property>
    </bean>


具体使用,以后案例用到在演示。



相关文章
|
4月前
|
XML 前端开发 Java
SpringMVC入门到实战------2、SpringMVC创建实例Hello SpringMVC(maven+tomcat)
这篇文章是SpringMVC框架的入门教程,详细指导了如何在IDEA中使用Maven和Tomcat创建SpringMVC工程,包括添加依赖、配置web.xml、编写控制器、创建配置文件、配置Tomcat服务器以及进行基本的测试,展示了一个简单的Hello SpringMVC示例。
SpringMVC入门到实战------2、SpringMVC创建实例Hello SpringMVC(maven+tomcat)
|
JSON 前端开发 Java
Spring MVC入门必读:注解、参数传递、返回值和页面跳转(下)
Spring MVC入门必读:注解、参数传递、返回值和页面跳转(下)
112 0
SpringMVC入门到实战------5、域对象共享数据 Request、Session、Application、Model、ModelAndView、Map、ModelMap的详细使用及代码实例
这篇文章详细解释了在IntelliJ IDEA中如何使用Mute Breakpoints功能来快速跳过程序中的后续断点,并展示了如何一键清空所有设置的断点。
SpringMVC入门到实战------5、域对象共享数据 Request、Session、Application、Model、ModelAndView、Map、ModelMap的详细使用及代码实例
|
4月前
|
存储 前端开发 Java
SpringMVC入门到实战------1、SpringMVC简介
这篇文章是SpringMVC框架的入门介绍,阐述了MVC架构的概念和分层,解释了SpringMVC作为Spring家族的一部分在Web应用开发中的作用和重要性,并概述了SpringMVC的关键特点,包括与Spring IOC容器的无缝集成、基于Servlet的DispatcherServlet、全面的解决方案、代码简洁性、高内聚低耦合的组件化设计以及卓越的性能表现。
SpringMVC入门到实战------ 十一 拦截器的使用
这篇文章介绍了SpringMVC中拦截器的使用,包括拦截器的配置、拦截器的三个抽象方法`preHandle`、`postHandle`和`afterCompletion`的作用,以及多个拦截器的执行顺序和规则。
SpringMVC入门到实战------ 十一 拦截器的使用
|
4月前
|
JSON 前端开发 JavaScript
SpringMVC入门到实战------九 HttpMessageConverter @RequestBody 、@ResponseBody 、RequestEntity、ResponseEntity
这篇文章详细介绍了SpringMVC中的`HttpMessageConverter`接口及其相关的`@RequestBody`、`@ResponseBody`、`RequestEntity`和`ResponseEntity`注解和类型的使用,包括如何将请求体转换为Java对象、如何将Java对象转换为响应体、以及如何处理JSON和AJAX请求。
SpringMVC入门到实战------九 HttpMessageConverter @RequestBody 、@ResponseBody 、RequestEntity、ResponseEntity
|
4月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
4月前
|
缓存 Java 应用服务中间件
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
这篇文章详细介绍了在SpringMVC中创建JSP页面的全过程,包括项目的创建、配置、Tomcat的设置,以及如何实现页面跳转和配置模板解析器,最后还对比了JSP和HTML模板解析的差异。
SpringMVC入门到实战------七、SpringMVC创建JSP页面的详细过程+配置模板+实现页面跳转+配置Tomcat。JSP和HTML配置模板的差异对比(二)
|
4月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
4月前
|
前端开发
SpringMVC入门到实战------六、SpringMVC的视图。ThymeleafView、转发视图、重定向视图、视图控制器的使用详解
这篇文章详细介绍了SpringMVC中的视图类型,包括ThymeleafView、转发视图、重定向视图和视图控制器的使用,以及如何通过源码查看确定使用的视图渲染器类型。
SpringMVC入门到实战------六、SpringMVC的视图。ThymeleafView、转发视图、重定向视图、视图控制器的使用详解