首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring MVC入门与数据绑定

Spring MVC入门与数据绑定

作者头像
Breeze.
发布于 2022-10-31 06:57:13
发布于 2022-10-31 06:57:13
49600
代码可运行
举报
运行总次数:0
代码可运行

Spring MVC

  • Spring MVC是Spring体系的轻量级Web MVC框架
  • Spring MVC的核心Controller控制器,用于处理请求,产生响应
  • Spring MVC基于Spring IOC容器运行,所有对象被IOC管理

环境配置

  1. Maven依赖:spring-webmvc
  2. web.xml配置DispatcherServlet
  3. 配置applicationContext的mvc标记
  4. 开发Controller控制器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--引入Spring MVC-->
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.22</version>
    </dependency>
</dependencies>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--DispatchServlet:对所有请求进行拦截-->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <!--
            DispatcherServlet是Spring MVC最核心的对象
            DispatcherServlet用于拦截Http请求,
            并根据请求的URL调用与之对应Controller方法,来完成Http请求的处理
        -->
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--applicationContext.xml-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </init-param>
    <!--在Web应用启动时自动创建Spring IOC容器,并初始化DispatcherServlet-->
    <load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!--/”拦截所有请求-->
    <url-pattern>/</url-pattern>
</servlet-mapping>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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"
       xmlns:mv="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--
    context:component-scan 标签作用
    在Spring IOC初始化过程中,自动创建并管理com.hua.springmvc及子包中
    拥有以下注解的对象.
    @Repository     语义注解,说明当前类用于业务持久层,通长描述对应的Dao类
    @Service        语义注解,说明当前类是Service业务服务类
    @Controller     语义注解,说明当前类是MVC应用中的控制器类
    @Component      组件注解,通常注解,被该注解描述的类将被IoC容器管理并实现
    -->
    <context:component-scan base-package="com.hua.springmvc"/>
    <!--启用Spring MVC注解开发模式-->
    <mvc:annotation-driven/>
    <!--将图片/JS/CSS等静态资源排除在外,可提高执行效率-->
    <mvc:default-servlet-handler/>
</beans>

注解

用途

@GetMapping

将当前方法绑定某个Get请求方式的URL

@ResponseBody

直接向响应输出字符串数据,不跳转页面

数据绑定

URL Mapping

  • 将URL与Controller方法绑定
  • 同过URL与方法绑定,SpringMVC便可通过Tomcat对外暴露服务

注解

  1. @RequestMapping - 通用绑定
  2. @GetMapping - 绑定Get请求
  3. @PostMapping - 绑定Post请求

接受请求参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Controller
@RequestMapping("/um") //定义类下所有方法的访问前缀
public class URLMappingController {

    @GetMapping("/g")
    //用用在方法上,不再区分Get/Post请求
    //@RequestMapping(value = "/g", method = RequestMethod.GET)
    @ResponseBody
    //@RequestParam 专用于特殊描述的参数,要书写在参数之前。同时增加映射原始请求参数
    public String getMapping(@RequestParam("manager_name")String managerName) {
        System.out.println("manager_name:" + managerName);
        return "This is Get method";
    }

    @PostMapping("/p")
    @ResponseBody
    public String postMapping(String username, String password) {
        System.out.println(username + ":" + password);
        return "This is Post method";
    }

    @PostMapping("/p1")
    @ResponseBody
    public String PostMapping1(User user) {
        System.out.println(user.getUsername() + ":" + user.getPassword());
        return "This is Post method";
    }
}

接收表单复合数据

  • 如果要接受复合数据可以使用数组、LIst和Map接收,List集合接收数据是需要添加@RequestParam声明,Map接受符合数据会出现数据丢失的情况
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Controller
public class FormController {

//    @PostMapping("/apply")
    @ResponseBody
    // 当值参数名n不存在的时候返回默认值ANON
    public String Apply(@RequestParam(value = "n",defaultValue = "ANON") String name, String course, Integer[] purpose) {
        System.out.println(name);
        System.out.println(course);
        for (Integer p : purpose) {
            System.out.println(p);
        }
        return "success";
    }

//    @PostMapping("/apply")
    @ResponseBody
    // 使用List接收符合数据需要在参数前添加 @RequestParam 声明
    public String Apply(String name, String course, @RequestParam List<Integer> purpose) {
        System.out.println(name);
        System.out.println(course);
        for (Integer p : purpose) {
            System.out.println(p);
        }
        return "success";
    }

//    @PostMapping("/apply")
    @ResponseBody
    public String Apply(Form form) {
        return "success";
    }

    @PostMapping("/apply")
    @ResponseBody
    //使用Map接受复合数据会出现数据丢失
    public String Apply(@RequestParam Map map) {
        return "success";
    }
}

关联对象赋值

在参数名称前加上对象

日期类型转换

@DateTimeFormat注解

用于表示日期转换与 SimpleDataFormat 相似

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public String postMapping(String username, String password,@DateTimeFormat(pattern = "yyyy-MM-dd") Date createtime) {
    System.out.println(username + ":" + password);
    return "This is Post method";
}
实体类转换日期

这里也需要添加 @DateTimeFormat

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date createtime;
设置全局日期转换类

继承Converter接口,设置泛型<传入参数(K), 转换后的参数(V)>

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyDateConverter implements Converter<String, Date> {
    public Date convert(String s) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date d = sdf.parse(s);
            return d;
        } catch (ParseException e) {
            return null;
        }
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--在这里额外添加属性 conversion-service="conversionService"-->
<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 将前台传进的日期进行转换 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="com.hua.springmvc.converter.MyDateConverter"/>
        </set>
    </property>
</bean>
优先级问题

通常有全局转换器存在会优先选择转换器进行日期转换,没有转换器使用注解转换

中文乱码

  • Get请求乱码 - server.xml增加URIEncoding属性
  • Post请求乱码 - web.xml配置CharacterEncodingFilter
  • Response响应乱码 - Spring配置StringHttpMessageConverter
Get请求乱码

打开 Tomcat/conf/server.xml 添加 URIEncoding="UTF-8"

Post请求乱码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--过滤器-->
<filter>
    <filter-name>characterFilter</filter-name>
    <!--将Post请求中的ISO-8859-1转换为UTF-8-->
    <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>
Response响应乱码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<mvc:annotation-driven conversion-service="conversionService">
    <!--设置消息转换器-->
    <mvc:message-converters>
        <!--进行文本消息转换-->
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <!--支持的媒体类型-->
            <property name="supportedMediaTypes">
                <list>
                    <!--response.setContentType("text/html;charset=utf-8")-->
                    <value>text/html;charset=utf-8</value>
                </list>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

响应输出结果

  • @ResponseBody - 产生响应文本
  • ModelAndView - 利用模板引擎渲染输出
@ResponseBody
  1. 直接产生响应体的数据,过程不干涉任何视图
  2. 可产生标准的字符串/JSON/XML等格式数据
  3. 产生的字符串被StringHttpMessageConverter影响
ModelAndView

指"模型(数据)"与"视图(界面)"对象 通过ModelAndView可将包含数据对象与引擎进行绑定 SpringMVC中默认的View是JSP,也可以配置其他模板引擎

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@GetMapping("/view")
public ModelAndView showView() {
    ModelAndView mav = new ModelAndView();
    return mav;
}
  • mav.addObject()方法设置的属性默认存放在当前请求中
  • 默认ModelAndView使用请求转发(forward)至页面
  • 重定向使用new ModelAndView("redirect:/index.jsp")
String与ModelMap实现类似功能
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//String与ModelMap
//Controller方法返回String的情况
//1. 方法被@ResponseBody描述,SpringMVC直接响应String字符串本身
//2. 方法不存在@ResponseBody,则SpringMVC处理String指代的视图(页面)
@GetMapping("/xxxx")
//    @ResponseBody
public String showView1(Integer userId , ModelMap modelMap){
    String view = "/um/view.jsp";
    User user = new User();
    if(userId == 1){
        user.setUsername("lily");
    }else if(userId == 2){
        user.setUsername("smith");
    }else if(userId == 3){
        user.setUsername("lina");
    }
    modelMap.addAttribute("u", user);
    return view;
}

SpringMVC整合Freemarker

1-引入依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.28</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
</dependencies>

2-启用Freemarker模板引擎

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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文件在哪

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <!--定义Freemarker存放地址-->
    <property name="templateLoaderPath" value="/WEB-INF/ftl"/>
    <!--模板在渲染过程中的中文乱码问题-->
    <property name="freemarkerSettings">
        <props><prop key="defaultEncoding">UTF-8</prop></props>
    </property>
</bean>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringMVC入门与数据绑定
从本节开始,我要学习在Spring生态体系中我们必须掌握的Web应用框架 Spring MVC。
害恶细君
2022/11/22
1.2K0
SpringMVC入门与数据绑定
Spring MVC知识梳理
浏览器发送请求,请求到达SpringMVC处理,然后调用业务层逻辑实现,跟着持久层操作获取数据,最后逆序响应到浏览器。前面我们复习了Mybaits和Spring框架,我们当然不陌生了,现在就来了解下SpringMVC到底有什么作用
晚上没宵夜
2020/03/10
5860
Java学习笔记-全栈-web开发-16-SpringMVC
Spring MVC是Spring提供的一个强大而灵活的web框架。借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单。这些控制器一般不直接处理请求,而是将其委托给Spring上下文中的其他bean,通过Spring的依赖注入功能,这些bean被注入到控制器中。
devi
2021/08/18
7050
Spring MVC浅入浅出——不吹牛逼不装逼
上文书说了Spring相关的知识,对Spring来了个浅入浅出,大家应该了解到,Spring在三层架构中主做Service层,那还有Web层,也就是Controller层,这个就由SpringMVC来解决了。SpringMVC是Web层的一个框架,它是Spring的组成部分,可以先看看下面这张图:
泰斗贤若如
2019/08/09
5960
Spring MVC浅入浅出——不吹牛逼不装逼
SpringMVC全面入门篇
其实SpringMVC的服务实际是对Servlet的扩展,其本质还是使用的Servlet只是对其进行了扩展,解决了原来的 web页面与业务逻辑强耦合的弊病
大话swift
2019/09/05
4180
SpringMVC全面入门篇
SpringMVC教程2[处理及响应请求]
此时,在浏览器端请求/test1接口,springmvc会默认去查找和方法同名的页面作为方法的视图返回。 如果确实不需要该方法返回页面,可以使用@ResponseBody注解,表示一个请求到此为止。
用户4919348
2019/04/02
6200
SpringMVC教程2[处理及响应请求]
史上最强Spring mvc入门
一、SpringMVC基础入门,创建一个HelloWorld程序   1.首先,导入SpringMVC需要的jar包。   2.添加Web.xml配置文件中关于SpringMVC的配置 <!--c
xiangzhihong
2018/02/01
1.4K0
史上最强Spring mvc入门
抛开深层次底层,快速入门SpringMVC
SpringMVC主要有三个核心部分组成,DispatcherServlet、Controller、ViewResolver。      DispatcherServlet:      请求输入时:类似于一个带分配功能的Filter,其直接与前端交互,并截所有符合 url-pattern 的请求,并根据Mapping路径分发给处理对应请求的Controller。      请求处理完毕时:将ViewResolver渲染好的视图回传给前端。      Controller:      处理Http传来的请求,通常调用Service,再在Service中调用Dao持久层进行完整的数据处理,并将处理完毕的数据返回,返回以ModelAndView的形式,Model,通俗来讲,就是承载数据的一个HashMap,而View则是数据要发送的逻辑视图名,如果View缺省,默认是转发到HTTP发起的页面。      ViewResolver:      根据Controller处理好的数据,对指定目录下的文件进行渲染解析,完毕后将视图(不一定为页面、可能是Joson、Map各种数据类型,这根据Controller回传的数据决定)返回给DispatcherServlet。
Rekent
2018/09/04
5450
抛开深层次底层,快速入门SpringMVC
SpringMVC原理,工作流程及实例
  Spring MVC是Spring提供的一个强大而灵活的web框架。借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单。这些控制器一般不直接处理请求,而是将其委托给Spring上下文中的其他bean,通过Spring的依赖注入功能,这些bean被注入到控制器中。
用户7353950
2022/06/23
1.1K0
SpringMVC原理,工作流程及实例
跟松哥学 SpringMVC(1/2)
Spring Web MVC 是一种基于 Java 的实现了 Web MVC 设计模式的请求驱动类型的轻量级 Web 框架,即使用了 MVC 架构模式的思想,将 web 层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC 也是要简化我们日常 Web 开发的。在 传统的 Jsp/Servlet 技术体系中,如果要开发接口,一个接口对应一个 Servlet,会导致我们开发出许多 Servlet,使用 SpringMVC 可以有效的简化这一步骤。
江南一点雨
2020/01/02
5490
【万字长文】Spring MVC 层层递进轻松入门 !
Html是“名词”,CSS是“形容词”,JavaScript是“动词”,这三个兄弟凑在一起,就构成了 “静态” 页面,那么如何让他 “动态” 起来呢?这就需要后端相关技术的支持,这也是我们今天想要说的。
BWH_Steven
2020/03/26
1.5K0
【万字长文】Spring MVC 层层递进轻松入门 !
Spring学习笔记(3)一SpringMVC快速入门和基本流程
了解:入门,如何去使用这门技术 掌握:具体,它的原理是什么 熟悉:规则实践,在理解原理的基础上,如何去模仿, 精通:解决问题 专家:觉悟,扩展创新,如何去进一步演化
黄规速
2022/04/14
6480
Spring学习笔记(3)一SpringMVC快速入门和基本流程
springMVC基础
springMVC中默认的转发视图是InternalResourceView 当控制器方法中所设置的视图名称以“forward:”为前缀时,创建InternalResourceView视图,此时的视图名称不会被springmvc配置文件的视图解析器解析,而是通过转发方式实现跳转。
Java微观世界
2025/01/20
840
springMVC基础
springmvc笔记_SpringMVC优点
普通的web项目每次都要进行手动的把jar包导进去,否则会报500,class not found
全栈程序员站长
2022/11/04
4.9K0
springmvc笔记_SpringMVC优点
SpringMVC知识体系搭建
< context:component-scan/> 扫描指定的包中的类上的注解,常用的注解有:
时间静止不是简史
2020/07/25
2.2K0
SpringMVC框架介绍[通俗易懂]
1、前端控制器DispatcherServlet(不需要程序员开发) 作用接收请求,响应结果,相当于转发器,中央处理器。 有了DispatcherServlet减少了其它组件之间的耦合度。
全栈程序员站长
2022/09/06
1.4K0
SpringMVC框架介绍[通俗易懂]
Springmvc最全(必会知识合集)带Java代码示例(保姆级别讲解)包会
(4)ModelAndView 对象需要 new, 同时作为返回值类型
编程张无忌
2021/01/26
1.1K0
Springmvc最全(必会知识合集)带Java代码示例(保姆级别讲解)包会
SpringMVC笔记
在方法参数前加上**@PathVariable**注解,让方法参数的值对应绑定到一个URL模板变量上
菜鸟雷
2020/10/23
5540
SpringMVC笔记
SSM学习笔记之SpringMVC
本文主要涉及SpringMVC知识:SpringMVC部署,SpringMVC框架,请求流程,请求定制(日期和文件处理),统一异常处理,拦截流程。
Jetpropelledsnake21
2022/11/28
8.4K0
SSM学习笔记之SpringMVC
SpringMVC框架理解
应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件) 方式获取的,但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(spring配置文件) ,这样的弊端是配置文件加载多次,应用上下文对象创建多次。
全栈程序员站长
2022/09/09
1.2K0
SpringMVC框架理解
相关推荐
SpringMVC入门与数据绑定
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档