栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring MVC-入门版本.02

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring MVC-入门版本.02

Author:宇哥 WeChat/QQ: Warmheart170712 / 939638113
整理不易,重在分享,欢迎转发收藏,助力面试上岸,学编程找宇哥

1 Spring MVC简介 1.1 什么是MVC
MVC是一种软件架构的思维,将软件按照模型,视图,控制器来换分

M:Model,模型层,指工程中的JavaBean,作用是处理数据
	JavaBean分为两类:
		一类成为实体类Bean,专门存储数据业务,如POJO实体类
		一类成为业务处理Bean,指Service或者Dao对象,专门用于处理业务逻辑或和数据访问
V:View,视图层,指工程中的html或者jsp页面,作用是与用户进行交互,展示数据

C:Controller,控制层,指工程中的Servlet,作用是接收请求和响应浏览器

MVC的工作流程:
	用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,
	Controller调用相应的Model层处理请求,处理完毕将结果返回给Controller。
	Controller再根据请求的结果找到相应的View视图,渲染数据后最终响应给浏览器
1.2 什么是Spring MVC
SpringMVC是Spring的一个后续产品,,是Spring的一个子项目
SpringMVC是Spring为表述层开发提供的一套完备的解决方案,
目前普遍使用SpringMVC作为javaEE项目表述层的首选方案
备注:三层架构分为表述层,业务逻辑层,数据访问层,表述层是表示前台页面和后台servlet
1.3 Spring MVC的特点
SpringMVC是Spring框架的一个子项目,与IOC容器无缝对接
基于原生的Servlet,通过功能强大的前端控制器DispatcherServlet,
	对请求和响应进行统一处理
代码清晰简洁,大幅度提升开发效率
内部组件化程度高,可插拔式组件,即插即用
性能卓著,尤其适合大型互联网项目的要求
2 环境搭建 2.1 开发环境
IDEA 2020.1
Maven 3.6.3
MariaDB:10.3.7
Tomcat 8
Spring 5.3.7
2.2 创建maven工程

1 添加web模块

2 打包方式 war
	war
3 引入依赖

        
        
            org.springframework
            spring-webmvc
            5.3.7
        

        
        
            ch.qos.logback
            logback-classic
            1.2.3
        

        
        
            javax.servlet
            javax.servlet-api
            3.1.0
            provided
        

        
        
            org.thymeleaf
            thymeleaf-spring5
            3.0.15.RELEASE
        
    

2.3 配置web.xml
注册SpringMVC的前端控制器:dispatcherServlet
1 默认配置方式
	在配置作用下,SpringMVC的配置文件默认位于WEB-INF下
	默认名称为< servlet-name >-servlet.xml
	文件名为:SpringMVC-servlet.xml

	设置SpringMVC的核心控制器所能处理的请求的请求路径
	/ 匹配的请求可以是/login或.html或.css或.js等方式的额请求路径
	但是不能匹配 .jsp 请求路径的请求
	
	
	
        SpringMVC
        org.springframework.web.servlet.DispatcherServlet
    
    
        
        SpringMVC
        /
    
2 扩展配置方式 - 常用方式
可通过init-param标签设置SpringMVC配置文件的位置和名称,
通过load-on-startup标签设置SpringMVC前端控制器DispatcherServlet的初始化时间





    
    
        SpringMVC
        org.springframework.web.servlet.DispatcherServlet
        
        
            
            contextConfigLocation
            
            classpath:springmvc.xml
        
        
        1
    
    
        
        SpringMVC
        /
    

面试题:标签中使用/和
    @RequestMapping(value = "/")
    public String index(){
        //返回视图的名称
        return "index";
    }
}

配置tomcat

DEBUG运行
其中 /springmvc/ 表示上下文路径

请求跳转,跳转到target.html页面,
本质是请求的转发,地址栏未发生改变

    

首页

访问目标页面target.html
在请求控制器中创建处理请求的方法:

@RequestMapping("/target")
public String target(){
    return "target";
}
2.7 总结
1 浏览器发送请求,若请求地址符合前端控制器的url-pattern,
2 该请求会被前端控制器DispatcherServlet处理,
3 前端控制器会读取SpringMVC的核心配置文件,通过扫描组件找到控制器
4 将请求地址和控制器中的@RequestMapping的value属性值进行匹配
5 若匹配成功,该注解所标识的控制器方法就是处理请求的方法
6 处理请求的方法需要返回一个字符串类型的视图名称,
7 该视图名称会被视图解析器解析,加上前缀和后缀组成视图的路径,
8 通过thymeleaf对视图进行渲染,最终转发到视图所对应的页面
3 @RequestMapping注解详解 3.1 @RequestMapping注解的功能
从注解的名称上可以看到,
@RequestMapping注解的作用是:
将请求和处理请求的控制器方法关联起来,建立映射关系。
SpringMVC接收到指定的请求,就回来找到在映射关系中对应的控制器方法来处理这个请求
3.2 @RequestMapping注解的位置
@RequestMapping标识一个类,设置映射请求的请求路径的初始信息
@RequestMapping标识一个方法,设置映射请求路径的具体信息
@Controller
@RequestMapping("/req")
public class ReqMappingController {

    
    @RequestMapping("/testRequestMapping")
    public String testReqMapping(){
        return "success";
    }
}

1 thymeleaf中的@{}的含义:
	thymeleaf中的@{}:表示获取应用的上下文路径
	等同于Jsp 的老方法:
	${pageContext.request.contextPath} = @{}
	
	jsp中获取上下文路径拼接资源路径:
		th:action= "${pageContext.request.contextPath}/upload
	thymeleaf中获取上下文路径拼接资源路径:
		th:action= "@{/upload}
2 为什么 Tomcat 运行时默认打开 index.html,或者 index.jsp
	Tomcat 安装目录下的 confweb.xml 包含所有项目的配置信息
	如果 IDEA 中的 web.xml 没有相关的配置信息,
	就运行 Tomcat 安装目录下的 confweb.xml。
	
        index.html
        index.jsp
    

	如果需要修改模块的欢迎页面也是可以的,
	只需要在当前模块的 web.xml 文件配置即可
	
        love.html
    
3.3 @RequestMapping注解的value属性
@RequestMapping注解的value属性通过请求的请求地址匹配请求映射
@RequestMapping注解的value属性是一个字符串类型的数组,
	表示该请求映射能够匹配多个请求地址所对应的请求
@RequestMapping注解的value属性必须设置,至少通过请求地址匹配请求映射
测试@RequestMapping注解value属性--/testValue1
测试@RequestMapping注解value属性--/testValue2
    
    @RequestMapping(value = {"/testValue1","/testValue2"})
    public String testValue(){
        return "success";
    }
3.4 @RequestMapping注解的method属性
@RequestMapping注解的method属性通过请求的请求方式(GET/POST)匹配请求映射
@RequestMapping注解的method属性是一个RequestMethod类型的数组,
	表示请求映射能能够匹配多种请求方式的请求
若当前请求的请求地址满足请求映射的value属性,
	但是请求方式不满足method属性,则浏览器报405.Request method ‘POST’ not support
    @RequestMapping(value = "/testMethod",method = {RequestMethod.GET,RequestMethod.POST})
    public String testMethod(){
        return "success";
    }
备注:
1 兑取处理指定请求方式的控制器方法,
  SpringMVC中提供了@RequestMapping的派生注解
  	处理GET请求的映射:GetMapping
  	处理POST请求的映射:PostMapping
  	处理PUT请求的映射:PutMapping
  	处理DELETE请求的映射:DeleteMapping
  	
2 常用的请求方式有get post put delete:
	但目前浏览器只支持get和post,若在form表单提交时,
	为method设置了其他请求方式的字符串,put或者delete,
	则按照默认的GET请求方式处理
	
	若要发送put和delete请求,
	则需要通过spring提供的过滤器HiddenHttpMethodFilter。
	
3.5 @RequestMapping注解的params属性
@RequestMapping注解的headers属性通过请求的请求参数匹配请求映射
@RequestMapping注解的headers属性是一个字符串类型的数组,
	可以通过四种表达式设置请求参数和请求映射的匹配关系
	
‘param’:要求请求映射所匹配的请求必须携带param请求参数
‘!param’:要求请求映射所匹配的请求必须携带param请求参数
‘param=value’:要求请求映射所匹配的请求必须携带param请求参数,且param=value
‘param!=value’:要求请求映射所匹配的请求必须携带param请求参数,但是param=value
 测试@RequestMapping注解的param属性
    
    @RequestMapping(value = {"/testParam"},
            params = {"username","password"})
    public String testParam(String username,String password){
        System.out.println(username+password);
        return "success";
    }
注意:
若当前请求满足@RequestMapping注解的value和method属性,但是不满足params属性,
此时页面会报400错误
Parameter conditions "username,password" not met for actual
 request parameters: username={tom}, password={123456}
3.6 @RequestMapping注解的headers属性
@RequestMapping注解的headers属性通过请求的请求头信息匹配请求映射
@RequestMapping注解的headers属性是一个字符串类型的数组,
可以通过四种表达式设置请求头信息和请求映射的匹配关系
‘header’,要求请求映射所匹配的请求必须携带header请求头信息
‘!header’:要求请求映射所匹配的请求不能携带header请求头信息
‘header=value’:要求请求映射所匹配的请求必须携带header请求头信息,且header=value
‘header!=value’:要求请求映射所匹配的请求必须携带header请求头信息,且header!=value
若当前请求满足@RequestMapping和value和method属性,但不满足headers属性,此时页面报404错误,即资源未找到
测试@RequestMapping注解的headers属性
    
    @RequestMapping(value = {"/testHeader"},
            params = {"username","password"},
            headers = ("Host=localhost:8085"))
    public String testHeader(){
        return "success";
    }
3.7 SpringMVC支持ant风格的路径
? 表示任意的单个字符
* 表示任意的0个或者多个字符
** 表示任意的一层或多层目录
注意:在使用**时,只能使用xxx方式,注解中不允许在**前后添加内容
测试@RequestMapping注解的ant风格路径
    
    @RequestMapping("/a?a/testAnt")
    public String testAnt(){
        return "success";
    }
执行后的请求路径:
GET
	http://localhost:8085/springmvc/req//a1a/testAnt
3.8 SpringMVC支持路径中的占位符
原始方式:/deleteById?id=1
rest方式:/deleteById/1
SpringMVC路径中的占位符常用语restful风格中,
当请求路径中将某些数据通过路径的方式传输到服务器中,
就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}表示传输的数据,
再通过@PathVariable注解,将占位符所表示的数据复制给控制器方法的形参
注意:路径中的占位符名称必须和@PathVariable中的value属性值一致
测试@RequestMapping注解支持路径中的占位符
  
    @RequestMapping("/testPath/{id}")
    public String testPath(@PathVariable(value = "id") Integer ids){
        System.out.println(ids);
        return "success";
    }
4 SpringMVC获取请求参数 4.1 通过servletAPI获取请求参数
将HttpServletRequest作为控制器方法的形参,
此时HttpServletRequest类型的参数表示封装了当前请求报文的对象
通过servletAPI获取请求参数
    
    @RequestMapping("/testServletAPI")
    //形参位置的request表示当前的请求的封装对象
    public String testServletAPI(HttpServletRequest request){
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println(username+password);
        return "success";
    }
4.2 通过控制器方法的形参获取请求参数
在控制器方法的形参位置,设置和请求参数同名的形参,
当浏览器发送请求,匹配到请求映射时,在DispatcherServlet中。
就会将请求参数赋值给相应的形参
通过控制器方法的形参获取请求参数
用户名:
密码:
爱好:篮球 足球 羽毛球
提交:
    
    @RequestMapping("/testMethodParam")
    //形参位置的request表示当前的请求的封装对象
    public String testMethodParam(String username,String password){
        System.out.println(username+password);
        return "success";
    }

    @RequestMapping(value = "/testMethodParam2")
    //形参位置的request表示当前的请求的封装对象
    public String testMethodParam2(String username,String password,String[] hobby){
        //若请求参数中出现多个同名的请求参数,
        // 可以在控制器方法的形参位置设置字符串类型,或者字符串数组接受参数
        //使用字符串,参数值会使用逗号拼接
        System.out.println(username+password+ Arrays.toString(hobby));
        return "success";
    }
注:
若请求所传输的请求参数中有多个同名的请求参数,
此时可以在控制器方法的形参中:
设置字符串数组或者字符串类型的形参接收此请求参数
若使用字符串数组类型的形参,此参数的数组中包含了每一个数据
若使用字符串类型的形参,此参数的值为每个数据中间使用逗号拼接的结果
4.3 @RequestParam
@RequestParam是将请求参数与控制器方法的形参创建映射关系
@RequestParam注解一共有三个属性:
	value:指定为形参赋值的请求参数的参数名
	required 设置是否必须传输此请求参数,默认值为true
	
4.4 @RequestHeader 4.5 @CookieValue 4.6 通过POJO获取请求参数 4.9 解决获取请求参数的乱码问题 5 域对象共享数据
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/852480.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号