简介
- springMVC是Spring框架的一个部分、一个模块。
- SSM中Mybatis对应着Dao层,Spring对应着Service层,SpringMVC就对应着Controller层和View层。
工作流程
简要描述
具体描述
- 浏览器发送请求到中央调度器(前端控制器)DispatcherServlet。
- DispatcherServlet解析请求,调用HandlerMapping映射处理器。
- HandlerMapping根据请求url查找对应处理器(根据xml配置或注解进行查找),并返回一个处理器执行链HandlerExecutionChain(Handler+HandlerIntecepter)。
- DispatcherServlet通过HandlerAdapter处理器适配器执行处理器(Handler,Controller,也叫后端控制器)。
- 处理器执行完成后返回一个ModelAndView。
- 再由HandlerAdapter将这个ModelAndView返回给DispatcherServlet。
- DispatcherServlet将ModelAndView传给ViewResolver视图解析器。
- ViewReslover解析后返回一个封装好的View
- DispatcherServlet调用View,让其自己进行渲染,即进行数据填充,形成响应对象。
- DispatcherServlet响应浏览器。
- DispatcherServlet是SpringMVC中唯一的Servlet
代码描述
<mvc:annotation-driven/>
<context:component-scan base-package="com.st.controller" />
package com.st.controller;
import com.st.model.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping(value = "d")
public class DefController {
@RequestMapping("/t1")
@ResponseBody
public String test1(){
return "hello";
}
@RequestMapping("/t2")
public String test2(String name){
System.out.println(name);
return "hello";
}
@GetMapping("/t3")
public String test3(Student student){
System.out.println(student.getId());
System.out.println(student.getName());
System.out.println(student.getAge());
return "hello";
}
@PostMapping("/t4")
public String test4(){
return "hello";
}
@GetMapping("/t5")
public ModelAndView test5(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("name", "wayserkon");
modelAndView.setViewName("hello");
return modelAndView;
}
@RequestMapping(value ="/t6", method = RequestMethod.POST)
public String test6(){
return "hello";
}
@RequestMapping(value = "/t7", produces = "text/html; charset=utf-8")
@ResponseBody
public String test7(){
return "哈哈";
}
}
- 数据处理完成后,由视图解析器进行视图解析(xml配置)
<mvc:default-servlet-handler/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/page/"/>
<property name="suffix" value=".jsp"/>
</bean>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
hello hihihihhhihihihihihi
<br>
${name}
</body>
</html>
配置文件
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>spring-mvc_demo</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
- DispatcherServlet的xml配置文件(放在resources目录中)
<?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:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<mvc:annotation-driven/>
<context:component-scan base-package="com.st.controller" />
<mvc:default-servlet-handler/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix" value="/page/"/>
<property name="suffix" value=".jsp"/>
</bean>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/d/*"/>
<bean class="com.st.interceptor.DefInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.st</groupId>1
<artifactId>maven1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>maven1 Maven Webapp</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.1.6.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
</project>
拦截器Interceptor
- 通过继承HandlerInterceptor实现,接口中含有三个默认方法,分别在三个时机调用。
- 与Filter的区别:
- 拦截器是基于java反射机制的,而过滤器是基于函数回调的。
- 过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
- 拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
- 拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
- 在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。
拦截器类
package com.st.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DefInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("*****preHandle*****");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("*****postHandle*****");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("*****afterCompletion*****");
}
}
拦截器配置
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/d/*"/>
<bean class="com.st.interceptor.DefInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>