SpringMVC入门与数据绑定(二)

简介: SpringMVC入门与数据绑定

二.Spring MVC数据绑定


1.URL Mapping(URL映射)


URL Mapping 指将URL与Controller方法绑定,通过将URL与方法绑定,Spring MVC便可以通过Tomcat对外暴露服务。


我们可以这么理解,作为web应用来说,所有对外暴露的接口都是一个个URL网址,我们通过URL来执行后端的程序代码。


URL Mapping注解

@RequestMapping 通过绑定 @GetMapping 绑定Get请求 @PostMapping 绑定Post请求


下面来对这三种注解进行演示:

创建一个新的控制器类,先编写如下代码测试:


package com.haiexijun.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class URLMappingController {
    @GetMapping("/g")
    @ResponseBody
    public String getMapping(){
        return "this is get method";
    }
    @PostMapping("/p")
    @ResponseBody
    public String postMapping(){
        return "this is post method";
    }
}


运行项目后打开浏览器,分别输入对应的url地址,get请求成功被响应,post请求因为不能通过浏览器来访问,所以报405错误。


fc7e6967ce2f42e6b86f6976c069c26e.png

c00dc45e86994ff3be7309a4a8c6e5b8.png

我们可以通过编写一个表单来验证post请求。这里不演示了。


**@RequestMapping可写在类名前。这个注解在大多数情况下是用于进行URL的全局设置的,我们都知道作为URL,它可能是有多级结构的。**比如,希望当前这个Controller里面所有的映射地址都是以 /um开始的。如果不用@RequestMapping,那GetMapping和PostMapping都要改为“/um/g”和“/um/p” .


package com.haiexijun.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/um")
public class URLMappingController {
    @GetMapping("/g")
    @ResponseBody
    public String getMapping(){
        return "this is get method";
    }
    @PostMapping("/p")
    @ResponseBody
    public String postMapping(){
        return "this is post method";
    }
}


@RequestMapping也可以写在方法名前,表示该方法不在区分post请求和get请求了。也就是说所有类型的请求都可以访问得到这个方法所映射的URL了。但并不推荐这么来用 @RequestMapping也可以配置,使其分post请求和get请求。配置value和method就好了。


    @RequestMapping(value = "/g",method = RequestMethod.GET)
    @ResponseBody
    public String getMapping(){
        return "this is get method";
    }


2.Controller方法参数接收请求参数


在大多数情况下,一个请求发过来的时候是要包含一些数据,这些数据通常是由请求参数的方式来体现的。比如说用户登陆的时候,要输入用户名和密码,那么这些数据就以post请求参数的形式发送到Controller的方法中。


接收请求参数的常用做法: 可以通过Controller方法接收参数,或使用java Bean接收数据。


下面是通过Controller方法参数接收请求参数,方法会自动进行类型转换。


376ff2cff4b545bbb81f527921ac1635.png


对于get请求,有一个小小的注意点。就是如果get请求输入的请求参数为manager_name(localhost:8888/g?manager_name=lily)的话,controller方法里面的参数该怎么写呢?java可不支持manager_name的命名规则。这时候就要用到一个新的注解:@RequestParam

这个注解写在参数前,专用于这种特殊的参数进行描述的,@RequestParam还要传入原始的请求参数。


    @RequestMapping(value = "/g",method = RequestMethod.GET)
    @ResponseBody
    public String getMapping(@RequestParam("manager_name") String managerName){
        return "this is get method";
    }


这里其实如果注解里面添加了原始的参数名称,后面的请求参数则可以为任意,比如abc都可以。



## 3.Controller实体对象接收请求参数(使用javaBean接收请求参数) 假设一个表单的输入项非常的多没有一百多个的话,问题就产生了,难道我要将这一百多个输入项的参数一个个在controller方法里面写出来吗?可想而至,方法声明该会有多长啊?维护起来是十分困难的。为了解决这个问题,Spring MVC允许我们一次性将我们前台输入的数据保存为指定的javaBean。一步到位,完成了由数据到对象的转换工作。

下面来演示具体使用步骤:

创建一个entity包,在包下面创建一个User实体类。这个实体类就是一个标准的javaBean。


package com.haiexijun.springmvc.entity;
public class User {
    private String username;
    private Long password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public Long getPassword() {
        return password;
    }
    public void setPassword(Long password) {
        this.password = password;
    }
}


编写一个表单:


<form action="/um/p1" method="post">
    <input type="text" name="username">
    <input type="password" name="password">
    <input type="submit" value="提交">
</form>


然后在Controller里面编写一个方法:

在程序运行的时候Spring MVC就会自动创建User 这个对象,并且根据前面的请求参数,便会在实体内寻找同名属性,对User实体内的属性依依赋值。要保证前台传入的参数名与属性名保持一致,并且对于数值类型,也得要求前台传入的这个数据能够成功地转换到实体属性对应的类型。


    @PostMapping("/p1")
    @ResponseBody
    public String postMapping1(User user){
        return user.getUsername()+":"+user.getPassword();
    }


启动运行:


dcf3733f02914f09a2523bda7a90c507.png


3.接收表单复合数据


下面通过一个案例来演示复合数据获取。比如复选框传过来的数据。


42f1b1b45e9c4132a0df5c36a86d6db1.png


知识点:首先我们会利用数组或者List接收请求中的复合数据。利用@RequestParam为参数设置默认值。使用Map对象接收请求参数及注意事项。

下面通过代码学习:

下面是前端html表单的代码:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学员调查问卷</title>
    <style>
        .container {
            position: absolute;
            border: 1px solid #cccccc;
            left: 50%;
            top: 50%;
            width: 400px;
            height: 300px;
            margin-left: -200px;
            margin-top: -150px;
            box-sizing: border-box;
            padding: 10px;
        }
        h2{
            margin: 10px 0px;
            text-align: center;
        }
        h3{
            margin: 10px  0px;
        }
    </style>
</head>
<body>
    <div class="container">
        <h2>学员调查问卷</h2>
        <form action="./apply" method="post">
        <h3>您的姓名</h3>
        <input name="name" class="text"  style="width: 150px">
        <h3>您正在学习的技术方向</h3>
        <select name="course" style="width: 150px">
            <option value="java">Java</option>
            <option value="h5">HTML5</option>
            <option value="python">Python</option>
            <option value="php">PHP</option>
        </select>
        <div>
            <h3>您的学习目的:</h3>
            <input type="checkbox" name="purpose" value="1">就业找工作
            <input type="checkbox" name="purpose" value="2">工作要求
            <input type="checkbox" name="purpose" value="3">兴趣爱好
            <input type="checkbox" name="purpose" value="4">其他
        </div>
        <div style="text-align: center;padding-top:10px" >
            <input type="submit" value="提交" style="width:100px">
        </div>
        </form>
    </div>
</body>
</html>


在Controller包下创建FormController类,下面编写代码,进行表单处理:


package com.haiexijun.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class FormController {
    //通过数组来接收表单复合数据
    @PostMapping("/apply")
    @ResponseBody
    public String apply(String name,String course,Integer[] purpose){
        return name+" "+course+" "+purpose.length;
    }
}


启动运行:


cc74856c66464ef18536b5c52d0d51ba.png


这里再扩展一个小的知识点,如果作为我们上面的表单,假如name我们没有填写任何东西。那么接收时,controller里面的参数会为一个空的值,那对于空的值进行后续操作时,程序就很可能产生错误。为了解决这个情况,我们也可以对可能不存在的参数设置默认值。这里也用到@RequestParam注解来设置默认值。如下:


86271fb20b3541e79738c14f0642169f.png


    @PostMapping("/apply")
    @ResponseBody
    public String apply(@RequestParam(value = "name",defaultValue = "haiexijun") String name, String course, Integer[] purpose){
        return name+" "+course+" "+purpose.length;
    }


上面,name的默认值就被设置为haiexijun了,当表单的name项为填入参数时,就会默认值为haiexijun。



相关文章
|
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、转发视图、重定向视图、视图控制器的使用详解