SpringBoot学习总结(3)之集成MVC

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jokeMqc/article/details/88977477

1.集成MVC框架

1.1 引入依赖

SpringBoot集成SringMVC框架并且实现自动配置,只需要在pom.xml文件中添加以下依赖即可,不需要其他的配置。

    <!--thymeleaf模板依赖-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<!--web集成依赖-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

1.2Web目录结构

Web的模板文件位于resources/templates目录下,模板文件使用的静态文件,如js,css、图片、存放在resources/static目录结构之下。在MVC框架中,视图名自动在templates目录下找到对应的模板名称,模板中使用的静态资源在static目录下查找。

1.3Java包名结构

如图所示,SpringBoot项目中,通常会创建一下子包名:

  • controller此包下包含了MVC 的Controll er ,如UserController;
  • service一一此包下有业务处理代码, 如UserServ ice ;
  • entity一一包含了业务实体, 如User 类:
  • conf一一包含了一些配置类,比如用于配置数据源的DataSourceCon旬, 还有本章的JSON 序列化配JacksonConf。

SpringBoot应用程序入口SpringbootMvcApplication建立在这些包之上,这样子SpringBoot就能够自动扫描整个项目的目录结构。

SpringbootMvcApplication同其他Spring Boot 程序一样, 仅仅是一个带有@SpringBootApplication 注解的类:

package com.mqc;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootMvcApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringbootMvcApplication.class, args);
	}

}

2.使用Controller

SpringMVC框架不像传统的MVC框架那样子必须要去继承某个基础类才能够处理用户的HTTP请求,SpringMVC框架只要在对应的类上加上@controller注解即可,对于用户请求通过@RequestMappring映射HTTP请求到某个方法处理即可。

package com.mqc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author maoqichuan
 * @ClassName: HelloController
 * @description: springboot整合mvc框架控制器
 * @date 2019-04-0210:55
 **/
@Controller
@RequestMapping("user")
public class HelloController {

    @RequestMapping("/register")
    public String register(String username,String password){
        return "success";
    }
}

如上代码所示,@Controller作用这个类上,那么这个类就具有处理HTTP请求的能力,表示这是一个控制类,@requestmappring作用在方法上,也可以作用在类上,如上代码所示,用户如果访问/user/register,那么这个请求就会交给register方法来处理。

3.URL映射到方法

这里将会学习总结一下HTTP请求到Spring Controller的方法的映射,SpirngMVC提供了各种各样的映射方式,尽管会让Spring MVC框架的学习成本以及难度提升,但是Spring MVC框架能让Web应用的代码更加容易阅读和维护。而且在实际开发过程中,我们只需要熟悉其中的几种即可。

3.1 @RequestMapping

你可以使用@RequestMapping来映射URL,比如/test到某个Controller类,或者是某个具体的方法。通常类上的注解@RequestMapping用来标记请求的路径,方法上的@RequestMapping注解的作用将是映射到特定的URL到某个具体的处理方法。

@RequestMapping有多个属性来进一步匹配/划分HTTP请求到某个具体的Controller方法,分别是:

  • value,请求的URL路径,支持URL模板,正则表达式。这也是我们最常用的一种映射方式。
  • method,HTTP请求方法,有GET,POST,PUT等。
  • consumes,允许的媒体类型Media Types ),如consumes = ”application/ison ”, 对应于请求的HTTP 的Content-Type 。
  • produces ,相应的媒体类型,如produces =”application/json”, 对应于H TTP 的Accept字段。
  • params , 请求的参数,如params =” action=update ” 。
  • headers , 请求的HTTP 头的值,如headers = ”myHeade r=myValu e ” 。

3.1.1 HTTP method匹配

@requestMappring提供method属性来映射对应的HTTP的请求方法,通常HTTP请求方法有如下内容:

  1. GET,用来获取URL对应的内容。
  2. POST,用来向服务器提交信息。
  3. HEAD,同GET,但不返回消息体,通常用于返回URL对应的元信息,如过期信息等,搜索引擎通常用HEAD来获取网页信息。
  4. PUT , 同POST ,用来向服务器提交信息,但语义上更像一个更新操作。同一个数据,多次PUT 操作,也不会导致数据发生改变。而POST 在语义上更类似新增操作。
  5. DELETE ,删除对应的资源信息。
  6. PATCH 方法, 类似PUT 方法, 表示信息的局部更新。

通常对于Web应用,GET和POST是经常使用的选项,但是对于REST接口,则会使用PUT、DELETE等用来从语义上进一步区分操作。

Spring提供了简化后的@requestmappring,提供了新的注解来表示HTTP方法:

  • @GetMappring
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping
@GetMapping("/register")
    public String register(String username,String password){
        return "success";
    }

3.1.2 consumes 和produces

属性consumes 意味着请求的HTTP 头的Content-Type 媒体类型与consumes 的值匹配, 才能调用此方法。

@GetMapping(value = "/register",consumes = "application/json")
    @ResponseBody
    public String register(String username,String password){
        return "success";
    }

这里映射指定请求的媒体类型是application/ison , 因此,此方法接受一个AJAX 请求。如果通过浏览器直接访问, 则会看到Spring Boot 报出如下错误,因为通过浏览器访问,通常并没有设置Content-Type ,所以说null 不支持。

为了成功调用上述Controller 方法, AJAX 调用必须设置Content -Type 为appli catio n/j s on ,
如以下JS 代码所示。

$.ajax({
    type : "get",
    url: "/user/register",
    content Type : "application /] son",
    .....
})

produces 属性对应于HTTP 请求的Accept 字段, 只有匹配得上的方法才能被调用。

@GetMapping(value = "/save",produces = MediaType.APPLICATION_PROBLEM_JSON_UTF8_VALUE)
    @ResponseBody
    public String save(String username,String password){
        return "success";
    }

通常浏览器都会将Accept 设置为* 子, 因此通过浏览器直接访问“ user/save”,浏览器总是返回success信息,井转成JSON 格式。

3.1.3 params 和header 匹配

可以从请求参数或者HTTP 头中提取值来进一步确定调用的方法,有以下三种形式:

  • 如果存在参数, 则通过;
  • 如果不存在参数,则通过;
  • 如果参数等于某一个具体值,则通过。
@GetMapping(value = "/saveAction",params = "action = save")
    @ResponseBody
    public void saveAction(String username){
        System.out.print("call save action");
    }

    @GetMapping(value = "/updateAction",params = "action = update")
    @ResponseBody
    public void updateAction(String username){
        System.out.print("call update action");
    }

4.方法参数

Spring 的Contro ller 方法可以接受多种类型参数,比如我们看到的path 变量,还有MVC 的Model 。除此之外,方法还能接受以下参数。

  • @PathVariable ,可以将URL 中的值映射到方法参数中。
  • Model, Spring 中通用的MVC 模型,也可以使用Map 和ModelMap 作为渲染视图的模型。
  • ModelAndView ,包含了模型和视图路径的对象。
  • JavaBean ,将HTTP 参数映射到JavaBean 对象。
  • MultipartFile ,用于处理文件上传。
  • @Mode IA时ibute ,使用该注解的变量将作为Model 的一个属性。
  • WebRequest 或者NativeW ebRequest ,类似Servlet Request ,但做了一定封装。(不常用)
  • java.io.InputStream 和java.io.Reader ,用来获取Servlet API 中的lnputStream/Reader 。(不常用)
  • java.io.OutputStream I java.io.Writer ,用来获取Servlet API 中的OutputStream/Writer 。(不常用)
  • HttpMethod , 枚举类型, 对应于HTTP Method ,如POST 、GET.
  • @RequestParam , 对应于HTTP 请求的参数,自动转化为参数对应的类型。
  • @RequestHeader ,对应于HTTP 请求头参数,自动转化为对应的类型。
  • @RequestBody , 自动将请求内容转为指定的对象, 默认使用HtψMessageConverters来转化。
  • @ RequestPart,用于文件上传,对应于HTTP 协议的multipart/form-data 。
  • @ SessionAttribute , 该方法标注的变量来自于Session 的属性。
  • @ RequestAttribute ,该标注的变量来自于request 的属性。
  • @InitBinder ,用在方法上,说明这个方法会注册多个转化器,用来个性化地将HTTP请求参数转化成对应的Java 对象,如转化为日期类型、浮点类型、JavaBean 等,当然,也可以实现WebBindinglnitializer 接口来用于Spring Boot 应用所需要的dataBinder 。
  • BindingResult 和Errors , 用来处理绑定过程中的错误。

这里部分含义比较明确,限于篇幅不做详细讲解,下面会对常用的PathVariable 、Model 、ModelAndView 、JavaBean 、文件上传、ModelAttribute 进行讲解。

4.1PathVariable

注解PathVariable 用于从请求URL 中获取参数井映射到方法参数中,如以下代码所示。

@GetMapping(value = "/register/{username}",consumes = "application/json")
    @ResponseBody
    public String register(@PathVariable String username,@PathVariable  String password){
        return "success";
    }

符号{}中的变量名与方法名字一一对应,如果不想对应,如Path 中的名字是id ,方法签名是userId,则可以使用@PathVariable(”id”) Long userld 来对应。

4.2Model&ModelAndView

任何MVC 框架都有一个类似Map 结构的Model ,可以向Model 添加视图需要的变量, SpringMVC 中的Model 就是完成此功能的。Model 对象主要有如下方法:

  • Model addAttribute( String attributeName, Object attribute Value ) ,向模型添加一个变量,attributeN ame 指明了变量的名称,可以在随后的视图里引用, attributeValue 代表了变量。
  • Model addAttribute (Obj ect attribute Value), 向模型添加一个变量,变量的名字就是其类名字首字母小写后转为的Java 变量。
  • Mode l addAllAttributes(Map attributes ),添加多个变量,如果变量已经存在,则覆盖。
  • Mode l merge Attributes(Map attributes),添加多个变量, 如果变量己经存在于模型中,则忽略。
  • Model addAllAttributes(Collection<?> attribute Values ), 添加多个变量,变量来自于集合的元素, 变量命名规范同时dAttribute ( Object attributeValue) 。
  • boolean containsAttribute(String attributeN ame ), 判断是否存在变量。

4.3JavaBean 接受HTTP 参数

HTTP 提交的参数可以映射到方法参数上, 按照名称来映射, 比如一个请求/javabean/update.json?name=abc&id = I ,将会调用以下方法:

@GetMapping(value = "/update.json")
    @ResponseBody
    public void saveAction(Integer id,String name){
        System.out.print("call save action");
    }

可以通过注解@ RequestParam 来进一步限定HTTP 参数到Co n t roller 方法的映射关系,RequestP aram 支持如下属性:

  • value,指明HTTP 参数的名称。
  • required, boolean 类型,声明此参数是否必须有,如果HTT P 参数里没有, 则会抛出400 错误。
  • defaultValue , 字符类型,如果HTTP 参数没有提供,可以指定一个默认字符串, Spring类型转化为目标类型,如上一个例子,我们可以提供默认参数。
@GetMapping(value = "/update.json")
    @ResponseBody
    public void getUser(@RequestParam(required = true,name = "id") Integer id, String name){
        System.out.print("call save action");
    }

4.4MultipartFile

通过MultipartFile 来处理文件上传:

@RequestMapping("/form")
    @ResponseBody
    public String updateFile(String name, MultipartFile file){
        if(!file.isEmpty()){
            String originalFilename = file.getOriginalFilename();
            String name1 = file.getName();

            //上传文件的操作
            return "success";
        }
        return null;
    }

MultipartFile 提供了以下方法来获取上传的文件信息:

  1. getOriginalFilename , 获取上传的文件名字;
  2. getBytes ,我取上传文件内容,转为字节数组:
  3. getlnputStream,获取一个InputStream;
  4. isEmpty , 文件上传内容为空,或者就没有文件上传:
  5. getSize , 文件上传的大小;
  6. transferTo(File file), 保存上传文件到目标文件系统。

如果是同时上传多个文件, 则使用MultipartFil e 数组类来接受多个文件上传:

@RequestMapping("/form")
    @ResponseBody
    public String updateFile(String name, MultipartFile[] files) throws Exception{
       // todo something
    }

这要求你的HTTP 请求中包含多个名字为“files ”的文件:

可以通过配置文件application.properties 对Spring Boot 上传的文件进行限定(一般都是需要配置的),默认为如下配置:

spring.http.multipart.enabled=true #默认支持附件上传.
spring.http.multipart.file-size-threshold=0 #支持文件写入磁盘.
spring.http.multipart.location= # 上传文件的临时目录
spring.http.multipart.max-file-size=1Mb # 最大支持文件大小
spring.http.multipart.max-request-size=10Mb # 最大支持请求大小

参数enabled 默认为true , 即允许附件上传, file-size-threshold 限定了当上传的文件超过一定长度时,就先写到临时文件里。这有助于上传文件不占用过多的内存,单位是MB 或者阻,默认是0 , 即不限定阔值。location 指的是临时文件的存放目录,如果不设定,则是Web 服务器提供的一个临时目录。

max-file-size 属性指定了单个文件的最大长度,默认是lMB , max-request-s ize 属性说明单次HTTP 请求上传的最大长度,默认是10MB 。

4.5@ModelAttribute

注解ModelAttribute 通常作用在Controller 的某个方法上,此方法会首先被调用,井将方法结果作为Model 的属性, 然后再调用对应的Controller 处理方法。

@ModelAttribute
    public void findUser(@PathVariable Integer id, Model model){
        model.addAttribute("user",new UserInfo());
    }

对于HTTP 的请求, 会先调用findUser方法取得user , 并添加到模型里。使用addAttribute通常可以用来向一个Controller 中需要的公共模型添加数据。

至此,SpringBoot整合MVC框架就到这里了,后续还需继续完善,大家一起努力加油!

猜你喜欢

转载自blog.csdn.net/jokeMqc/article/details/88977477