一、注解使用及概念解释
1.1、SpringMVC M 模型 V 视图 C 控制器
也有这种设计模式
**设计模式(......)**不是新的技术 是优秀代码的实现
1.2、转发和重定向
在springmvc中 转发 return "forword:easyb" 默认就是转发 重定向 return "redirect":
easya
方法中设置了request属性,但使用了redirect
重定向重定向会发起新的请求,原request对象及其属性不会传递到新请求中
所以在
easyb
方法中获取不到student_name
属性
@RequestMapping("easya") public String easya(HttpServletRequest request){ request.setAttribute("student_name","张三"); return "redirect:easyb";//默认是转发到b } @RequestMapping("easyb") @ResponseBody public String easyb(HttpServletRequest request, HttpServletResponse response){ System.out.println(request.getAttribute("student_name")); return "method B"; }
如果需要在方法间传递数据:
-
使用转发(forward):
return "forward:easyb"; // 保持同一个请求
-
使用重定向时传递参数:
return "redirect:easyb?student_name=张三"; // 通过URL参数传递
-
使用会话(Session):
request.getSession().setAttribute("student_name", "张三"); return "redirect:easyb";
总结对比表
特性 | 转发(forward) | 重定向(redirect) |
---|---|---|
请求次数 | 1次 | 2次 |
URL变化 | 不变 | 改变 |
数据传递 | 保持request属性 | 不保持request属性 |
速度 | 更快 | 更慢 |
使用场景 | 同一应用内的页面跳转 | 跨应用跳转或需要改变URL时 |
1.3 关于 @RequestMapping("easya")
的解释
基本功能
-
映射地址:
-
@RequestMapping("easya")
指定了一个映射地址/easya
-
当用户访问这个地址时,Spring MVC 会调用被注解的方法
-
-
Handler 封装:
-
Spring MVC 会将标注了
@RequestMapping
的方法封装成一个 Handler(处理器) -
这个 Handler 包含两部分信息:
-
地址(如
/easya
) -
要执行的方法(Method)
-
-
注解使用位置
@RequestMapping
可以标注在:
-
类级别(Type Level):
-
定义该类中所有方法的公共路径前缀
-
例如:
@Controller @RequestMapping("easy")
-
-
方法级别(Method Level):
-
定义具体处理方法的路径
-
例如:
@RequestMapping("A")
-
组合路径规则
当类和方法上都有 @RequestMapping
时:
-
类路径 + 方法路径 = 完整访问路径
-
如您例子中:
-
类上标注
@RequestMapping("easy")
-
方法上标注
@RequestMapping("A")
-
则完整访问路径为
/easy/A
-
实际代码示例
java
@Controller
@RequestMapping("easy") // 类级别映射
public class MyController {
@RequestMapping("A") // 方法级别映射
public String methodA() {
return "viewA";
}
@RequestMapping("B") // 方法级别映射
public String methodB() {
return "viewB";
}
}
-
访问
/easy/A
→ 调用methodA()
-
访问
/easy/B
→ 调用methodB()
其他特性
-
支持多种请求方法:
-
可以指定处理哪种 HTTP 方法(GET/POST/PUT/DELETE 等)
-
例如:
@RequestMapping(value="A", method=RequestMethod.GET)
-
-
路径变量:
-
支持 RESTful 风格的路径变量
-
例如:
@RequestMapping("users/{id}")
-
-
组合注解:
-
Spring 4.3+ 提供了更简洁的注解:
-
@GetMapping
、@PostMapping
等 -
这些是
@RequestMapping
的特定方法变体
-
-
二、SpringMVC常见注解(1到11 11!!!)
@PutMapping("user") @ResponseBody public User editUser(User user) { return user; } @DeleteMapping("user/{id}") public boolean deleteUser(@PathVariable("id") int id){ return false; } @PostMapping("user") public User addUser(@RequestParam User user){ System.out.println("RequestParam---表单数据"); return user; } @PostMapping("usera") @ResponseBody public User addUsera(@RequestBody User user){ System.out.println("RequestBody---JSON数据"); return user; } @GetMapping("user/{id}") @ResponseBody public User getOne(@PathVariable("id") int id){ User user=new User(); user.setId(id); user.setUsername("zhangsan"); user.setPassword("123123"); return user; } }
1 @GetMapping get请求映射 获取数据
2 @PostMapping post 请求映射 新增数据
3 @PutMapping put请求映射 修改数据
4 @DeleteMapping delete请求映射 删除数据
5 @ResponseBody 将下面方法体内的内容转化成JSON
js:{name:'zhangsan'} JSON :"{"name":"zhangsan")"
6 @GetMapping("user/{id}")
7 @PathVariable 获取地址上的参数
8 @ResponseBody将方法的放回直接写入Response中,取消默认转发形式
springmvc中返回对象,会使用JACKSON工具包将对象转成JSON数据
//9 @RequestBody接收JSON格式的参数 并且json格式的参数只能接收一个 下面只能一个 // (user)
10 @PostMapping("user")
public User addUser(@RequestParam User user){
System.out.println("RequestParam---表单数据");
return user;
}@PostMapping("usera")
@ResponseBody
public User addUsera(@RequestBody User user){
System.out.println("RequestBody---JSON数据");
return user;
}//对应第9个
11、@RequestMapping("")
//接收参数 //1、通过值的方式接受 @RequestMapping("easyaa") public void easya(@RequestParam("num") int num){ System.out.println(num); } //2、使用Map接收 @RequestMapping("easybb") public void easya(@RequestParam Map params){ System.out.println(params); } //3、使用封装对象 (最推荐) @RequestMapping("easycc") public void easycc(UserQueryParams params) { System.out.println("用户名: " + params.getUsername()); System.out.println("年龄: " + params.getAge()); System.out.println("邮箱: " + params.getEmail()); } 有一个类定义在前
三、SpringMVC常见方法
3.1、get add delete edit方法
获取数据 getuser 新增数据 adduser 删除数据 deleteuser
修改数据 edituser
3.2、RESTFUL风格
Restful风格 Get:user/1 Post:user Delete:user/1 Put:/user
REST 资源状态转换
REST思想将服务器中所有可以通过地址访问的内容,都看成一个资源,
每一个资源都有一个对应的地址,访问该地址就访问到了该资源,
对这个资源的处理(增删改查)转换成了对这个资源的请求方式
编写Restful风格的请求可以在类上标注@RestController注解
标注@RestController注解后,该类中所有的请求方法相当于默认使用@ResponseBody
3.3、拦截器 HandlerInterceptor

package com.easy.controller; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class EasyInterceptor implements HandlerInterceptor { /*拦截器 HandlerInterceptor springmvc中提供一个请求预处理组件。 1 preHandle 返回 boolean 在handler执行之前处理 返回true放行请求,返回false终止请求 2 postHandle handler执行完成后处理 3 afterCompletion Springmvc整个请求过程执行完毕后处理 * */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("1-------preHandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("2-------postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("3-------afterCompletion"); } }
3.4、异常处理器 ExceptionHandler(异常类型)
package com.easy.controller; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @ControllerAdvice public class EasyExceptionHandler { /\*异常处理器 \* ExceptionHandler(异常类型) \* \* 1.ExceptionHandler定义在Controller中只对当前类中的方法起作用 \* 2.可以使用@ControllerAdvice标注类,类中的异常处理器就是全局的异常处理器 \* \*/ @ExceptionHandler(RuntimeException.class) @ResponseBody public String handlerRunTimeException(){ return "发生了一点小问题,请稍后"; } @ExceptionHandler(value={NullPointerException.class, IndexOutOfBoundsException.class}) public String handlerNullPointerException(){ return "有个小外衣没找到"; } }
3.5、SpringMVC视图登录小部分
接下来我使用伪代码简单表述一下此图 // 浏览器端流程 Browser { 当用户访问 main.html { if (用户未登录) { 拦截器.拦截请求(); 重定向到 login.html; } else { 显示 main.html 内容; 显示当前登录用户信息; } } 当用户点击"退出登录" { 清除用户登录状态; 重定向到 login.html; } } // 拦截器逻辑 Interceptor { boolean preHandle(request, response) { if (request 访问的是需要登录的页面 && 用户未登录) { 重定向到 login.html; return false; // 拦截请求 } return true; // 放行请求 } } // 登录页面 login.html { 显示登录表单; 当用户提交登录信息 { 发送请求到 LoginController; if (返回"登录成功") { 跳转到 main.html; } else { 显示"用户名或密码错误"; } } } // 控制器 LoginController { @PostMapping("/login") String handleLogin(用户名, 密码) { if (用户服务.验证(用户名, 密码)) { 创建用户会话; return "redirect:/main.html"; } else { return "用户名或密码错误"; } } @GetMapping("/logout") String handleLogout() { 销毁用户会话; return "redirect:/login.html"; } }
3.6、SpringMVC改文件:
package com.easy.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.util.UUID; @RestController public class FileUploadController { @RequestMapping("upload") public String upload(@RequestParam("file") MultipartFile file) throws IOException { String oldName=file.getOriginalFilename();//文件原有名称 String fileType=oldName.substring(oldName.lastIndexOf("."));//截取后缀名 String newName= UUID.randomUUID().toString()+fileType;//新的文件名 File target=new File("D:/uploadfile/"+newName);//要存储的目标路径 file.transferTo(target); return "/easyfile/"+newName; } }
3.7、SpringMVC文件路径目标配置:
package com.easy.config;
import com.easy.controller.EasyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class EasyConfig implements WebMvcConfigurer {@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new EasyInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/easyaa");
}@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/easyfile/**").addResourceLocations("file:D:/uploadfile/");
}
}
四、springMVC的执行顺序。
例,接收到客户发来的请求,MVC怎么运行??即这道题,非常重要

4.1、用户通过浏览器发起一个 HTTP 请求,该请求会被 DispatcherServlet(前端控制器)拦截;
4.2、DispatcherServlet 调用 HandlerMapping(处理器映射器)找到具体的处理器(Handler)及拦截器,
4.3、HandlerMapping将Handler以 HandlerExecutionChain 执行链的形式返回给 DispatcherServlet。
4.4、DispatcherServlet 将执行链返回的 Handler 信息发送给 HandlerAdapter(处理器适配器);
4.5、HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(即 Controller 控制器)对请求进行处理;
4.6、Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC 的底层对象,包括 Model 数据模型和 View 视图信息);
4.7、HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;
4.8、DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对视图进行解析;
4.9、ViewResolver 解析完成后,会将 View 视图并返回给 DispatcherServlet;
4.10、DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);
4.11、视图负责将结果显示到浏览器(客户端)。
