SpringMVC
1.SpringMVC 工作原理:
/**
* 高大王
*/
@Controller
public class FirstController {
@RequestMapping("/first")
public ModelAndView test1() {
ModelAndView modelAndView = new ModelAndView("index.jsp");
return modelAndView;
}
@RequestMapping("/first2")
public String test2(){
System.out.println("2执行了");
return "index.jsp";
}
}
- 客户端(浏览器)发送HTTP请求到Web服务器(Tomcat等)。
- Web服务器接收到请求后,将请求发送给DispatcherServlet(前提是在web.xml注解中配置了DispatcherServlet)。在这里插入图片描述
3. DispatcherServlet是Spring MVC框架的核心,它是一个Servlet,负责接收所有的请求并进行分发,DispatcherServlet收到请求调用HandlerMapping处理器映射器。 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- DispatcherServlet根据请求的URL或其他定义的条件来确定请求应该由哪个控制器来处理。
- 在这个例子中,两个请求"/first"和"/first2"分别由FirstController中的test1()和test2()方法来处理,也就是说在这里DispatcherServlet 调用相关处理器适配器来调用Controller的具体方法来处理请求,执行相应的业务逻辑。
- test1()方法使用了ModelAndView对象,它包含要返回的视图名,这里是"index.jsp"。通过返回ModelAndView对象,DispatcherServlet知道要使用"index.jsp"作为视图进行渲染。
- test2()方法使用了String类型的返回值,这个值是视图名,也是"index.jsp"。通过返回视图名,DispatcherServlet知道要使用"index.jsp"作为视图进行渲染。
- @RequestMapping注解上还可以指定请求方法和其他条件。
- 视图渲染完成后,DispatcherServlet将响应返回给Web服务器。
- Web服务器将响应发送回客户端(浏览器)。
- 客户端(浏览器)接收到响应,并根据渲染后的视图展示页面。
2.环境搭建
环境搭建注意在配置pom的时候为了避免出现一些版本冲突问题可以吧相关内容提前放到maven的本地仓库,导入的时候直接使用本地仓库内的就行了。
3.@RequestMapping注解(里面的属性都用一下子)
1.value
:指定URL路径。
@RequestMapping(value = "/example")
2.name
:给控制单元定义一个名称。可以理解name是控制单元的注释。。
@RequestMapping(name = "ExampleMapping")
3.path
:与value
属性类似,用于指定URL路径(控制单元的映射路径)。
@RequestMapping(path = "/example")
4.method
:指定请求方法。
@RequestMapping(method = RequestMethod.GET)
5.params
:指定请求参数条件。
@RequestMapping(params = "id=123")
6.headers:指定请求头条件。
@RequestMapping(headers = "Content-Type=application/json")
7.consumes
:指定请求的Content-Type
。
@RequestMapping(consumes = "application/json")
8.produces
:指定响应的Content-Type
。
@RequestMapping(produces = "application/json")
4.映射路径
映射路径在使用的时候注意多级路径中尽量去根目录下面去寻找相关内容,例如在控制单元(/test/test2)跳转到视图资源(first.jsp)时,由于路径中写的是相对路径(return “first.jsp”😉,所以Tomcat会在webapp/test(这里的不是真实存在的是虚拟的)目录下找一个叫做first.jsp的文件
5.Spring MVC 中的转发和重定向
当在 Spring MVC 中使用转发和重定向时,可以使用不同的方式来实现它们。
- 转发(Forward):
- 使用转发,可以将请求发送到同一个应用程序中的其他控制器方法或视图。
- 在控制器方法中,可以使用 return “forward:/path” 或者 return “forward:/view” 来执行转发操作。
例如:
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/register")
public String register() {
// 执行注册逻辑
return "forward:/user/welcome";
}
@GetMapping("/welcome")
public String showWelcomePage() {
// 显示欢迎页面
return "welcome";
}
}
在上述代码中,register() 方法执行注册逻辑后,使用 return “forward:/user/welcome” 进行转发到 /user/welcome 路径,最终返回 welcome 视图页面。这是一个转发操作。
2. 重定向(Redirect):
- 使用重定向,可以将请求发送到同一应用程序或不同应用程序中的不同 URL。
- 在控制器方法中,可以使用 return “redirect:/url” 或者 return “redirect:https://example.com” 来执行重定向操作。
例如:
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/login")
public String login() {
// 执行登录逻辑
return "redirect:/user/profile";
}
@GetMapping("/profile")
public String showProfilePage() {
// 显示用户信息页面
return "profile";
}
}
在上述代码中,login() 方法执行登录逻辑后,使用 return “redirect:/user/profile” 进行重定向到 /user/profile 路径,最终返回 profile 视图页面。这是一个重定向操作。
总结:
- 转发是将请求传递给另一个控制器方法或视图,URL 不会改变,适用于在同一应用程序内进行页面跳转或保持请求连贯性的场景。
- 重定向是发送一个新的请求到不同的 URL,URL 会改变,适用于跳转到其他应用程序或需要保护敏感信息的场景。
需要注意的是,转发和重定向的路径可以是相对路径或绝对路径。使用相对路径时,可以直接指定相对于当前路径的目标路径。使用绝对路径时,需要以斜杠 /
开头指定绝对路径。
它们的不同
- 实现方式:
- 重定向是在服务器端发送一个特殊的响应给客户端,告诉客户端去请求新的 URL。客户端收到响应后会自动发送一个新的请求到指定的 URL。
- 转发是在服务器端内部进行的,服务器将当前请求交给另一个目标路径来处理,目标路径处理完后将结果直接返回给客户端,客户端并不知道这个过程。
- URL 变化:
- 重定向会改变浏览器的 URL 地址,客户端会发起一个全新的请求。
- 转发不会改变浏览器的 URL 地址,客户端并不知道跳转到了另一个页面。
- 请求对象和响应对象:
- 重定向会创建一个新的请求对象和响应对象,无法共享原始请求对象和响应对象。
- 转发会保持相同的请求对象和响应对象,可以在目标页面中获取原始请求携带的所有信息。
- 跳转范围:
- 重定向可以跳转到任意的 URL 地址,包括外部链接。
- 转发只能在当前 Web 应用程序内部进行跳转。
总结起来,重定向是一种完全新的请求,会导致 URL 地址的改变,适用于跳转到其他应用或者需要保护敏感信息的场景。而转发是在服务器内部进行的,URL 地址不会改变,适用于在同一应用内部进行页面跳转或者保持请求的连贯性。具体使用哪种跳转方式,取决于具体的需求和场景。