一、Spring MVC
简介
Spring MVC(全称 Spring Web MVC)是 Spring 框架提供的一款基于 MVC 模式的轻量级 Web 开发框架。
MVC架构
(1)示意图
(2)各层职责
- Model:负责对请求进行处理,并将结果返回给 Controller
- View:负责将请求的处理结果进行渲染,展示在客户端浏览器上
- Controller:是 Model 和 View 交互的纽带;主要负责接收用户请求,并调用 Model 对请求处理,然后将 Model 的处理结果传递给 View
SpringMVC工作原理
(1)控件
DispatcherServlet(前端控制器)
负责拦截客户端请求并分发给其他组件,它是整个流程控制的中心,负责调度其他组件的执行,降低各组件之间的耦合,提升整体效率HandlerMapping(处理器映射器)
负责根据客户端请求的URL寻找处理器,Spring MVC中提供了配置文件、注解等映射方式,这些映射方式将由相应的处理器映射器负责处理Handler(处理器)
负责对客户端的请求进行处理,由开发者编写HandlerAdapter(处理器适配器)
负责根据特定的规则对处理器进行执行,它可以执行多种类型的处理器,是设计模式中适配器模式的具体应用ViewResolver(视图解析器)
负责视图解析,它可以将处理结果生成View(视图)并展示给用户View(视图)
展示给用户看,由开发者编写
(2)原理
用户发送请求到前端控制器(DispatcherServlet)
前端控制器请求处理器映射器(HandlerMapping)去查找处理器(Handler)
找到以后处理器映射器(HandlerMappering)向前端控制器返回执行链(HandlerExecutionChain)
前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)
处理器适配器去执行Handler
处理器执行完给处理器适配器返回ModelAndView
处理器适配器向前端控制器返回ModelAndView
前端控制器请求视图解析器(ViewResolver)去进行视图解析
视图解析器向前端控制器返回View
前端控制器对视图进行渲染
前端控制器向用户响应结果
二、使用xml开发
配置前端控制器(web.xml)
<!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>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--初始化参数,读取配置文件,组装三个组件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--启动时自动加载-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- / 拦截 不包括jsp的其他请求-->
<!-- /* 拦截 包括jsp的所有请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
配置映射器(springmvc-servlet.xml)
- 方式一:BeanNameUrlHandlerMapping
<!--BeanNameUrlHandlerMapping
浏览器发送/user请求,在spring容器中找到id="/user"的对应实例-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean id="/user" class="com.app.xml.UserController"/>
- 方式二:SimpleUrlHandlerMapping
<!--SimpleUrlHandlerMapping
在自己的实例中自定义一套映射规则properties(请求与实例id关系)
浏览器发送/user请求,在property中找到key="/user"映射的id,然后在spring容器中找到id对应实例-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/user">userController</prop>
</props>
</property>
</bean>
<!--配置Controller-->
<bean id="userController" class="com.app.xml.UserController"/>
配置适配器(springmvc-servlet.xml)
- 方式一:SimpleControllerHandlerAdapter(要求我们编写的Controller继承Controller接口)
<!--需要Controller继承Controller-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
- 方式二:HttpRequestHandlerAdapter(要求我们编写的Controller继承HttpRequestHandler接口)
<!--需要Controller继承HttpRequestHandler-->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
配置视图解析器(springmvc-servlet.xml)
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
编写Controller
- 继承Controller接口(使用了SimpleControllerHandlerAdapter适配器)
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class UserController implements Controller {
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) {
ModelAndView modelAndView = new ModelAndView();
// index即逻辑视图名,视图解析器会自动加上前缀(/)和后缀(.jsp),即 index -> /index.jsp
modelAndView.setViewName("index");
return modelAndView;
}
}
- 继承HttpRequestHandler接口(使用了HttpRequestHandlerAdapter适配器)
import org.springframework.web.HttpRequestHandler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class UserController2 implements HttpRequestHandler {
public void handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
System.out.println("UserController.handleRequest");
}
}
编写index.jsp
<html>
<body>
<h2>Hello SpringMVC!</h2>
</body>
</html>
运行tomcat服务器,使用浏览器访问
二、使用注解开发
添加自动扫包(springmvc-servlet.xml)
<context:component-scan base-package="com.app.annotation"/>
编写Controller类
- @Controller注解 —— 标识本类为Controller类,使Spring的IoC容器扫描到
- @RequestMapping —— 请求映射,标识出浏览器访问的url路径
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("user")
public class UserController {
@RequestMapping(value = "func1")
public ModelAndView func1() {
return null;
}
}
配置映射器和适配器(springmvc-servlet.xml)
- 方式一:配置bean类
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
- 方式二:配置<mvc:annotation-driven/>标签(推荐)
方法二除了自动配置方式一的bean类外,还添加了其他功能,利于后面的学习使用。
<mvc:annotation-driven/>
配置前端控制器(web.xml)
- 代码与使用xml开发相同
配置视图解析器(springmvc-servlet.xml)
- 代码与使用xml开发相同
运行tomcat服务器,使用浏览器访问