🎈个人主页:靓仔很忙i
💻B 站主页:👉B站👈
🎉欢迎 👍点赞✍评论⭐收藏
🤗收录专栏:java实战基础
🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步!
springMVC简介
高内聚,低耦合
可扩展性太差
反复迭代
mvc回顾
springmvc 整体架构
1、用户发起请求到控制器 DispatcherServlet(前端控制器)
2、前端控制器去handlerMapper查找Handler对象
3、HandlerMapper返回HandlerExecutorChain 执行链(包含两部分内容:Handler ,拦截器集合)
4、前端控制器,通过HandlerAdapter 适配器执行 Handler对象
5、Handler处理具体的业务逻辑
6、Handler处理完业务逻辑之后,返回ModelAndView 其中的View是视图名称
7、将ModelAndView返回前端控制器
8、前端控制器,通过ModelAndView 中的视图名称。在视图解析器中查找视图
9、返回真正的View 视图对象
10、渲染视图
11、返回用户响应
使用RequestMapping映射请求
在SpringMVC中的众多Controller以及每个Controller的众多方法,请求是如何映射到具体的处理方法上?这个就是靠@RequestMapping完成的。
@RequestMapping既可以定义在类上也可以定义在方法上,
请求映射的规则是:
类上面的@RequestMapping.value + 方法上面的@RequestMapping.value。
五种映射:
1、标准URL映射
2、Ant风格的URL映射
3、占位符映射
4、限制请求方法映射
5、限制参数映射
标准url映射
Ant风格的URL映射
举例:
@RequestMapping("/test//show")
匹配:
/hello/test/a/show.do
/hello/test/b/show.do
都是有效的。
@RequestMapping(“/test/**/show”)
hello/test/a/b/c/show.do
测试:
配置一个 / 在地址栏中分别输入
http://localhost:8080/demo/show1/a/test.do
http://localhost:8080/demo/show1/b/test.do
配置 /** 在地址栏输入
http://localhost:8080/demo/show2/b/a/d/test.do
http://localhost:8080/demo/show2/b/d/test.do
占位符映射
Url中可以通过一个或多个{xxxx}占位符映射。
通过@PathVariable(“xxx”)绑定到方法的入参中。
例如:
@RequestMapping(“/user/{userId}/query")
请求URL:
http://localhost/user/8/query
限制请求方法映射
限制请求方法:
限定请求参数
处理方法与数据绑定(被动接受)
绑定servlet内置对象
@PathVariable获取占位符中的参数
@RequestParam
注意:当defaultValue有值的时候,required自动修改成false
未设置 defaultValue时,访问时必须带上绑定的参数,否则会报400错误
设置defaultValue后,required属性失效,会自动给出默认值( defaultValue内设置的值)
@CookieValue
POJO对象绑定参数
SpringMVC会将请求过来的参数名和POJO实体中的属性名进行匹配,如果名称一致,将把值填充到对象中。
Java的基本数据类型绑定
表单代码:
<form action="/demos/demo1.action" method="post">
<div>姓名:</div>
<div><input name="name" value="张三"/></div>
<div class="clear"></div>
<div>年龄:</div>
<div><input name="age" value="20"/></div>
<div class="clear"></div>
<div>收入:</div>
<div><input name="income" value="100000"/></div>
<div class="clear"></div>
<div>结婚:</div>
<div>
<input type="radio" name="isMarried" value="true" checked="checked"/>是
<input type="radio" name="isMarried" value="false"/>否</div>
<div class="clear"></div>
<div>兴趣:</div>
<div>
<input type="checkbox" name="interests" value="听歌" checked="checked"/>听歌
<input type="checkbox" name="interests" value="书法" checked="checked"/>书法
<input type="checkbox" name="interests" value="看电影" checked="checked"/>看电影
</div>
<div class="clear"></div>
<div><input type="submit" value="提交表单"/></div>
</form>
集合List绑定
解决方案2:参考json处理。
如果方法需要接受的list集合,不能够直接在方法中书写List
List的绑定,需要将List对象包装到一个类中才能绑定
要求:表单中的name的值
要求表单name的值, 和封装的对象中的结合的属性名一致。
如下:
类:
springmvc 和struts2的区别
使用ResponseBody输出JSON
ajax请求通常返回json数据,异步方法要使用@ResponseBody注解标明返回json
单个对象的输出:
@RequestMapping("getUser")
@ResponseBody
public User getUser(){
User user = new User();
user.setuserName("西门吹牛");
user.setName("西门吹雪");
user.setAge(1);
return user;
}
集合的输出:
@RequestMapping("getUsers")
@ResponseBody
public List<User> getUsers(){
List<User> users = new ArrayList<User>();
for(int i =0;i<8;i++){
User user = new User();
user.setuserName("西门吹"+i+"牛");
user.setName("西门吹雪"+i);
user.setAge(i+1);
users.add(user);
}
return users;
}
RequestBody
代码:
文件上传
添加依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
定义文件上传解析器
定义在springmvc-servlet.xml里面
<!-- 定义文件上传解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设定默认编码 -->
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 设定文件上传的最大值5MB,5*1024*1024 -->
<property name="maxUploadSize" value="5242880"></property>
</bean>
代码
package cn.itcast.springmvc.controller;
import java.io.File;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
@RequestMapping("/file")
@Controller
public class FileUploadController {
/**
* 文件上传
*/
@RequestMapping("/upload")
public String upload(@RequestParam("file") MultipartFile multipartFile)
throws Exception {
if (multipartFile != null) {
// multipartFile.getOriginalFilename() 获取文件的原始名称
multipartFile.transferTo(new File("d:\\tmp\\" + multipartFile.getOriginalFilename()));
}
return "success";
}
}
转发和重定向
重定向
使用视图名字前加:redirect:/success.html
访问路径:
实际响应后路径:
转发
在视图名称前加上: forward:
拦截器
拦截器执行过程
编写自定义拦截器
配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<!-- path: 拦截所有请求 -->
<mvc:mapping path="/**"/>
<!-- class:指定拦截器 -->
<bean class="cn.bd.springmvc.interceptor.MyHandlerInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
配置多个拦截器
多个拦截器执行顺序遵循 先入后出 的原则,先执行的拦截器后执行完成
<mvc:interceptors>
<mvc:interceptor>
<!-- path: 拦截请求 -->
<mvc:mapping path="/user/**"/>
<!-- class:指定拦截器 -->
<bean class="cn.bd.springmvc.interceptor.MyHandlerInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<bean class="cn.bd.springmvc.interceptor.MyHandlerInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>