forward(请求转发)和redirect(重定向)区别
forward:1、请求转发地址栏路径不变
2、请求转发只能访问当前服务器下的资源
3、请求转发是一次请求,可以使用request对象来共享数据
@RequestMapping("/h1")
public String h1() {
System.out.println("user mvc controller is running ...");
return "forward:index.jsp";
}
redirect:1、重定向地址栏发生改变
2、重定向可以访问其他网站(服务器)的资源
3、重定向是两次请求,不能使用request对象来共享数据
@RequestMapping("/h2")
public String h2() {
System.out.println("user mvc controller is running ...");
return "redirect:https://www.baidu.com/";
}
什么是MVC
MVC:模型/Model(dao,service) 视图/View(jsp) 控制器/Controller(Servlet),它是一种软件设计规范。它是将业务逻辑,数据,显示分离的方法来组织代码。主要作用是降低视图和业务逻辑间的双向耦合。
Model:数据模型,用于封装数据
View:页面视图,用于展示数据 eg:jsp、html
Controller:处理用户交互的调度器,用于根据用户需求处理程序逻辑 eg:Servlet、SpringMvc
三层架构
web层:数据展示
service层:业务处理
dao层:数据操作
SpringMVC简介
SpringMVC是一种基于Java实现的MVC模型的轻量级Web框架
优点
轻量级,简单易学
性能突出(相较于现有的框架技术)
高效,基于请求响应的MVC框架
灵活性强
SpringMVC执行流程
(1)当用户通过浏览器发起一个HTTP请求,请求直接到前端控制器DispatcherServlet;
(2)前端控制器接收到请求以后调用处理器映射器HandlerMapping,处理器映射器根据请求的URL找到具体的Handler,并将它返回给前端控制器;
(3)前端控制器调用处理器适配器HandlerAdapter去适配调用Handler;
(4)处理器适配器会根据Handler去调用真正的处理器去处理请求,并且处理对应的业务逻辑; (5)当处理器处理完业务之后,会返回一个ModelAndView对象给处理器适配器,HandlerAdapter再将该对象返回给前端控制器;这里的Model是返回的数据对象,View是逻辑上的View。
(6)前端控制器DispatcherServlet将返回的ModelAndView对象传给视图解析器ViewResolver进行解析,解析完成之后就会返回一个具体的视图View给前端控制器。(ViewResolver根据逻辑的View查找具体的View)
(7)前端控制器DispatcherServlet将具体的视图进行渲染,渲染完成之后响应给用户(浏览器显示)
入门案例
导入SpringMVC相关坐标
<!-- servlet3.1规范的坐标 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--jsp坐标-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<!--spring的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--spring web的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<!--springmvc的坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
定义表现层业务处理器Controller,并配置成spring的bean(等同于Servlet)
package com.buka.controller;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
public void save(){
System.out.println("user mvc controller is running ...");
}
}
在resources包下创建一个 spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描加载所有的控制类类-->
<context:component-scan base-package="com.buka"/>
</beans>
web.xml中配置SpringMVC核心控制器,用于将请求转发到对应的具体业务处理器Controller中(等同于Servlet配置)
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 前端控制器-->
<servlet>
<servlet-name>DispatcherServle</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- DispatcherServlet要绑定Spring的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServle</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
设定具体Controller的访问路径(等同于Servlet在web.xml中的配置)
package com.buka.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/save")//设定当前方法的访问映射地址
public class UserController {
public void save(){
System.out.println("user mvc controller is running ...");
}
}
在webapp包下建一个jsp/save.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>欢迎光临</h1>
</body>
</html>
设置返回页面
package com.buka.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("save")//设定当前方法的访问映射地址
//设置当前方法返回值类型为String,用于指定请求完成后跳转的页面
public class UserController {
@RequestMapping("h1")
public String save(){
System.out.println("user mvc controller is running ...");
//设定具体跳转的页面
return "save.jsp";
}
}