映射路径
a)映射路径的概述
所谓的映射路径,就是匹配请求路径和执行方法关系的路径
请求路径:http://localhost:8080/springmvc-demo-cofig/say.do
映射路径:@RequestMapping(value=“/say.do”)
基于注解的映射路径可以忽略前后缀
例:@RequestMapping(value=“/say.do”)与下面三种表达式相同
1.@RequestMapping(value="say.do")
2.@RequestMapping(value="/say")推荐使用:“/”表示路径,不指定后缀,无论拦截规则如何更改均可拦截
3.@RequestMapping(value="say")
b)三种映射路径
1.标准的映射路径
不带通配符,不带路径变量的映射路径
例:@RequestMapping(value="say.do")
2.带通配符的映射路径
三种通配符:
通配符 |
说明 |
? |
匹配1个字符,仅匹配1个字符 |
* |
匹配同一级目录下0~N个字符 |
** |
匹配多级路径目录 |
代码实例:
index.jsp
Controller
运行结果
通配符的优先级,通配范围小的通配符大于通配范围大的通配符且被通配符
范围小的通配后,通配范围大的就不能通配了
没有通配符 > “?”>“*”>“**”
3.带路径变量的映射路径
路径变量指的是将参数放在路径里面,而不是放在?的后面
index.jsp(发送请求,参数为zhangsan)
Controller层(对传入的参数进行接收)利用注解@PathVariable进行接收
测试:
接收多个值,就在Controller的方法中添加多个@PathVariable
如图:
路径变量的作用主要用于实现伪静态
c)两种限制
SpringMVC支持对请求的限制,如果不满足限制条件,就不让访问执行方法,提高了执行方法的安全性
主要的限制有两种:方法限制和参数限制
- 方法限制:通过设置请求的method类型,如果发送过来的请求和方法设置的method不一致,就不能访问执行方法
例:
Controller层配置接收方法为Post
发送一次post请求
测试结果
发送一次get请求
测试结果
Controller层也可配置多个方法接收参数
发送post和get请求进行测试
测试结果
2.参数限制:就是请求里面必须包括哪些参数,或不包括哪些参数;必须包含哪些参数值,必须不包含哪些参数值
限制参数格式
1.参数必须包括:params={”username”,”password”}
2.参数不能包括:params={“!userid”}
3.参数值必须是指定的值:params={“username=zhangsan”}
4.参数值必须不是指定的值:params={“password!=123”}
代码实例:
Controller层参数必须包括username和password
前台发送数据不包括username和password时
测试结果
将前台请求数据增加username和password
测试结果
d)命名空间
当@RequestMapping放在类上面时,这时候@RequestMapping的值作为命名空间使用;由于在开发过程中不同的Controller会出现方法的映射路径是一样的,命名空间就是为了为了解决不同的Controller之间的请求冲突问题
例:现在有AdminController和UserController两个处理登录请求的Controller
当前台发起登录请求时,无法确定选择拿一个Controller处理请求,故报“404错误”
解决方式:为两个Controller分别添加命名空间
并在发送登录请求时,加上所要Controller的命名空间
测试结果
数据绑定
a) 数据绑定是什么
SpringMVC中,数据绑定就是将请求中的数据绑定到执行方法的参数变量
b) 内置对象绑定
内置绑定就是只要在方法参数加入指定内置的接口或者类的参数声明,SpringMVC会自动赋予该类或者接口兼容类型的对象,并且请求参数已经封装在对象中,可以通过对象获取请求参数。
内置绑定类与对象:
Servlet原有的API
- HttpServletRequest
- HttpServletResponse
- HttpSession
两个SpringMVC内置的对象
- Model
- ModelMap
Model和ModelMap默认都是存储了Request请求作用域的数据的对象,两个对象作用相同,就将数据返回到页面
代码实例:
前台发送数据:
Controller处理数据
利用内置对象中HttpServletRequest获取请求参数
利用内置对象中HttpServletRequest获取请求参数,并用内置对象Model设置参数传回到页面中
利用@requestScope参数进行接收
运行结果
注:只可以使用内置的接口接收数据,自己新建的接口,由于Spring容器中没有相应的实现类对象,因此不能使用!!
a) 数据自动绑定
SpringMVC框架支持不需要任何数据绑定注解,直接将表单参数绑定到我们的执行方法的参数上
表单参数:包括POST以及GET发送过来的参数
就是以内容类型为:enctype="application/x-www-form-urlencoded"的参数
a) 参数变量的绑定
当前台传入的参数名和后台处理方法的参数名相等时,即可实现参数变量绑定
由于当前台传入的参数过多时,可能导致后台处理方法的参数过长,因此引入
了
b) 将参数变量绑到javabean
新建一个javabean,注:javabean中的属性名和传入的参数名一一对应
将Controller处理方法中的参数改为javabean对象
前台发送数据
测试结果
javabean嵌套类型,在javabean中在嵌套一个javabean
将Controller处理方法中的参数改为javabean对象
前台发送数据
测试结果
c) 自动绑定数据到数组
注意事项:
- 数组的类型只能是Spring内置已经实现的类型(如:MultipartFile)以及标量类型。
标量类型=String+基础数据类型+基础数据类型包装类
- 页面的参数必须要同名!!!
前台发送数据
后台接收并处理数据
测试结果
b) 集合的自动封装
SpringMVC的执行方法的参数不支持集合数据直接自动绑定的。
需要将集合转换成一个JavaBean的类型.把集合作为JavaBean的一个属性来实现.
前台请求页面
实体类
后台处理请求代码
测试结果
a) 数据的强制绑定
SpringMVC有些数据是不能自动绑定,需要我们使用他提供的注解强制绑定
需要强制绑定的几种情况:
- 默认参数自动绑定的是表单数据,如果数据不是来自表单,那么必须进行强制绑定
- 数据是来自表单的,但是参数名不匹配,那么也需要强制绑定
- 数据是来自表单的,但是需要将数据绑定在Map对象里面,需要强制绑定
1.1 @CookieValue获得Cookie值的注解
1.2 @PathVariable 绑定路径参数(当传入参数不是表单参数时需要)
2.1 通过@RequestParam绑定表单数据(当方法参数名跟传入参数名不同时使用)
3.1 将表单数据绑定到Map里面默认情况下,表单是不能自动绑定参数到Map里面的,如果要绑定数据到Map,需要加上@RequestParam强制绑定
前台数据
后台处理
关于中文乱码的处理
在web.xml中增加一个拦截器filter
来源:https://www.cnblogs.com/lch-Hao/p/10739355.html