SpringMVC框架基础

SpringMVC核心处理流程

注:上图是SpringMVC的核心处理流程,因为现在的控制器都是直接发送响应正文给浏览器,所以本图采用的是这种模式

一.关于SpringMVC框架

SpringMVC框架是基于Spring框架的一个主流框架,主要解决了后端服务器接收客户端提交的请求,并给予响应的相关问题.

MVC:

Model:数据模型,通常由业务逻辑层(Service)和数据访问层(Mapper)共同组成

View:视图

Controller:控制器

SpringMVC只关心V-C之间的交互,与M其实没有任何关系

二.接收客户端的请求

首先要将SpringMVC框架项目部署到Tomcat服务器上,启动Tomcat,并在浏览器地址栏输入指定的URL提交请求,可以进行简单的响应

1.添加依赖

spring-webmvc依赖项

<dependency> 
<groupId>org.springframework</groupId> 
<artifactId>spring-webmvc</artifactId> 
<version>5.3.14</version> 
</dependency>

Servlet依赖

<dependency> 
<groupId>javax.servlet</groupId> 
<artifactId>javax.servlet-api</artifactId> 
<version>3.1.0</version> 
<scope>provided</scope> 
</dependency>

2.准备两个配置类,一个是Spring的,一个是SpringMVC的

@Configuration
public class SpringConfig(){

}
@Configuration
@ComponentScan("包名")
public class SpringMvcConfig implements WebMvcConfigurer{
    
}

此处必须要添加组件扫描,必须在当前类配置,不能在Spring的配置类上配置

3.创建项目初始化类,此类必须继承AbstractAnnotationConfigDispatcherServletInitializer,并实现他的三个抽象方法

public class SpringMVCInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
    @Override protected Class<?>[] getRootConfigClasses() {
     // 返回自行配置的Spring相关内容的类 
        return new Class[] { SpringConfig.class };
    }
    @Override protected Class<?>[] getServletConfigClasses() { 
    // 返回自行配置的Spring MVC相关内容的类 return new Class[] { 
        SpringMvcConfig.class }; 
    }
    @Override protected String[] getServletMappings() { 
    // 返回哪些路径是由Spring MVC框架处理的 return new String[] { "*.do" }; 
    }
}

4.创建控制器类,用于接收客户端发送的请求,并简单的响应结果

@Controller
public class UserController{
    public UserController(){
        //打桩输出,查看是否执行了本控制器
        System.out.println("UserController.userController");
    }

    @RequestMapper("/hello.do")
    public String hello(){
        return "hello world!";
    }
}

5.启动项目,在主页的地址栏URL上补充/hello.do即可以实现访问,并看到结果,还可以在控制台查看控制器类的构造方法的输出内容

三.@RequestMapping

1.@RequestMapping注解的主要作用是配置请求路径与处理请求的方法的映射关系

注意:配置的请求路径值必须是初始化类getServletMapping()方法返回值可以匹配的,即xxx.do

2.此注解可以加在控制器类上,如果要访问控制器内部方法的路径则要加控制器类上@RequestMapping()的参数路径

3.@RequestMapping配置路径时,无意义的 / 会被忽略,必要的 / 会被补充

4.@RequestMapping还可以配置

method:请求方式----------method=RequestMethod.POST

headers:请求头

params:请求参数

consumes:请求文档类型

produces:响应文档类型以及设置字符集-----------produces="text/html;charset=utf-8"

以上配置在类上配置了,那么该类所有方法都有这些配置

5.SpringMVC框架还提供了@RequestMapping相关注解:

@GetMapping-----------------提交方式必须是GET

@PostMapping---------------提交方式必须是POST

@PutMapping

@DeleteMapping等

6.我们通常在类上使用@RequestMapping,而在具体的方法上使用5中的相关注解,即什么请求方式就用什么注解

四.响应正文

1.响应正文的注解:@ResponseBody

2.一旦配置了这个注解,那么处理请求的方法的返回值会直接响应到客户端

3.如果没有配置为"响应正文",则处理请求的方法的返回值表示"视图组件的名称",当方法返回后,服务器端并不会直接响应,而是根据"视图组件的名称"在服务器找到对应的视图组件,并处理,最后,将处理后的视图响应到客户端,这不是前后端分离

4.@ResponseBody可以添加在方法,仅作用于当前方法,也可添加在类上,作用于当前类的所有方法

5.@RestController,同时具有@ResponseBody和@Controller注解的效果,所以,在响应正文的控制器上,只需要使用@RestController即可,不必再添加@ResponseBody和@Controller注解

6.SpringMVC内置了一系列的转换器,用于将方法的返回值转换为响应到客户端的数据,并且,SPringMVC会跟你讲方法的返回值不同,自动选取某个转换器

7.一般我们使用响应XML或JSON来作为响应正文数据

主流的做法是使用JSON格式的字符串,需要在项目中添加 jackson-databind依赖

添加依赖:

<dependency>
 <groupId>com.fasterxml.jackson.core</groupId> 
<artifactId>jackson-databind</artifactId>
 <version>2.12.3</version> 
</dependency>

注意:在SpringMVC项目中,还需要在SpringMVC的配置类上添加@EnableWebMvc注解,否则响应时将导致出现406错误

小结

1.响应正文的定义:将处理请求的方法的返回值作为响应到客户端的正文数据

2.响应正文的做法:添加@RestController注解在类上,或在方法上添加@ResponseBody

3.响应正文的格式:

响应的结果通常需要包含多想数据,响应1个字符串并不便于表示这些数据,通常响应JSON格式的字符串

4.需要响应JSON格式的正文时,需要:

-添加 jackson-databind依赖

-在SpringMVC配置类上添加@EnableWebMvc注解

-自定义类,作为处理请求的方法的返回值类型(类的属性要添加Setter和Getter)

五.接收请求参数

在SpringMVC中,当需要接收客户端的请求参数时,只需要将各参数直接声明为处理请求的方法的参数即可

@RestController
public class UserController{
    @RequestMapping("/login.do")
    public String login(String username , String password){
        return "OK";
    }
}

在声明参数时,你可以将参数声明为你期望的数据类型,Spring会自动执行类型转换

1.如果客户端提交的请求中根本没有匹配名称的参数,那么以上获取到的值是null

2.如果客户端仅提交了参数名称,却没有值,那么以上获取到的只是长度为0的字符串

3.如果客户提交了匹配名称的参数,并且值是有效的,那么就可以获取到值

如果有必要,可以在以上各参数声明之前加@ResuestParam

作用有:

1.配置name属性:客户端将按照此配置的值提交请求参数,而不是根据方法的参数名称来提交请求参数

2.配置required属性:是否要求客户端必须按照此配置提交,

3.配置deraultValue属性:是否需要客户端中必须提交此请求参数,默认为true,如果不提交,会出现404,当设置为false时,如果不提价,那么服务器将此参数值认作null

4.理论上来说,由于一个个的声明请求参数更加简单并且直观,所以,当请求参数数量非常少时,应该使用这种做法,当参数较多时,我们应该将这些参数做一个封装

小结

1.可以将请求参数一个个的声明为处理请求方法的参数,也可以将多个参数封装到一个自定义类中.使用自定义类作为处理请求的方法的参数,SpringMVC框架会自动接收客户端提交的请求参数,并用于调用你编写的处理请求的方法

2.在大部分情况下,推荐使用将参数封装到自定义类的做法

3.需要保证非String类型的参数是Spring框架可以成功自动转换类型的,或者,对转换失败有进一步的处理,或可以接收转换失败带来的后果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值