4-4 SpringMVC

简介

  • springMVC是Spring框架的一个部分、一个模块。
  • SSM中Mybatis对应着Dao层,Spring对应着Service层,SpringMVC就对应着Controller层和View层。
    在这里插入图片描述

工作流程

简要描述

在这里插入图片描述

具体描述

  1. 浏览器发送请求到中央调度器(前端控制器)DispatcherServlet。
  2. DispatcherServlet解析请求,调用HandlerMapping映射处理器。
  3. HandlerMapping根据请求url查找对应处理器(根据xml配置或注解进行查找),并返回一个处理器执行链HandlerExecutionChain(Handler+HandlerIntecepter)。
  4. DispatcherServlet通过HandlerAdapter处理器适配器执行处理器(Handler,Controller,也叫后端控制器)。
  5. 处理器执行完成后返回一个ModelAndView。
  6. 再由HandlerAdapter将这个ModelAndView返回给DispatcherServlet。
  7. DispatcherServlet将ModelAndView传给ViewResolver视图解析器。
  8. ViewReslover解析后返回一个封装好的View
  9. DispatcherServlet调用View,让其自己进行渲染,即进行数据填充,形成响应对象。
  10. DispatcherServlet响应浏览器。
    在这里插入图片描述
  • DispatcherServlet是SpringMVC中唯一的Servlet

代码描述

  • 请求url解析映射(根据注解查找)
<!-- 启用spring mvc 注解 -->
<mvc:annotation-driven/>
<!-- 使用扫描机制扫描控制器类,指定要扫描的包路径,并扫描所有被@controller注解声明的类 -->
<context:component-scan base-package="com.st.controller" />
  • 映射到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;

//所有能通过HTTP请求访问到的Controller方法称为接口
//controller 控制器: 接收来自dispatcherServlet转发的HTTP请求,处理请求

/*
 @RequestMapping属性:
    value 指定匹配的映射路径
    method 指定HTTP请求方式(RequestMethod.GET和RequestMethod.POST)
    produces 指定response内容格式和编码,配合@ResponseBody一起使用
    consumes 指定request内容格式,具体有:
        text/html   html格式
        text/plain  纯文本格式
        text/xml    xml格式
        application/json    json格式
        application/x-www-form-urlencoded   form表单提交数据格式
        multipart/form-data     form表单文件上传格式
*/
@Controller//声明当前类是一个控制器类
@RequestMapping(value = "d")//设置映射路径('/d'和'd')都可以
public class DefController {
    @RequestMapping("/t1")//只有一个值,默认指定value
    @ResponseBody//将返回值以字符串方式添加到response,返回给浏览器
    public String test1(){
        return "hello";
    }

    @RequestMapping("/t2")
    public String test2(String name){   //参数列表中指定要接收的request参数
        System.out.println(name);
        return "hello";//请求转发到页面
    }

    @GetMapping("/t3")//get请求映射
    public String test3(Student student){  //使用封装工作单元(bean),批量接收request参数
        System.out.println(student.getId());
        System.out.println(student.getName());
        System.out.println(student.getAge());
        return "hello";
    }

    @PostMapping("/t4")//post请求映射
    public String test4(){
        return "hello";
    }

    @GetMapping("/t5")
    //使用ModelAndView向请求中添加参数
    public ModelAndView test5(){
        ModelAndView modelAndView = new ModelAndView();
        //添加参数
        modelAndView.addObject("name", "wayserkon");
        //添加跳转页面名称
        modelAndView.setViewName("hello");
        return modelAndView;
    }

    @RequestMapping(value ="/t6", method = RequestMethod.POST)//通过配置参数,指定post方式请求
    public String test6(){
        return "hello";//请求转发到页面
    }

    //配置produces属性,防止中文乱码
    @RequestMapping(value = "/t7", produces = "text/html; charset=utf-8")
    @ResponseBody//将返回值以字符串方式添加到response,返回给浏览器
    public String test7(){
        return "哈哈";
    }
}
  • 数据处理完成后,由视图解析器进行视图解析(xml配置)
<!-- 对静态资源文件的访问,交给default servlet handler处理 不加这个配置可能报404 -->
<mvc:default-servlet-handler/>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
    <!--前缀-->
    <property name="prefix" value="/page/"/>
    <!--后缀-->
    <property name="suffix" value=".jsp"/>
</bean>
  • 最后进行视图渲染,即EL表达式的数据填充。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    hello  hihihihhhihihihihihi
<br>

${name}
</body>
</html>

配置文件

  • web.xml配置
<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>

  <!-- 部署 DispatcherServlet -->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 加载配置文件 -->
    <init-param>
      <!--配置dispatcher.xml作为mvc的配置文件-->
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!-- 表示容器再启动时立即加载servlet -->
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!-- <url-pattern>/</url-pattern>  会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url-->
    <!-- <url-pattern>/*</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)-->
    <!-- 处理所有路径型URL -->
    <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">
    <!-- 启用spring mvc 注解 -->
    <mvc:annotation-driven/>

    <!-- 使用扫描机制扫描控制器类,指定要扫描的包路径,并扫描所有被@controller注解声明的类 -->
    <context:component-scan base-package="com.st.controller" />

    <!-- 对静态资源文件的访问,交给default servlet handler处理 不加这个配置.js .css .jpg等静态文件可能加载不出来 -->
    <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>
  • maven依赖,pom.xml配置
<?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>
    <!--  指定jdk版本  -->
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <!--spring 版本号-->
    <spring.version>5.1.6.RELEASE</spring.version>
  </properties>

  <!-- 项目依赖 -->
  <dependencies>

    <!--  spring核心包  -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- springMVC核心包 -->
    <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>
    <!--j2ee相关包 servlet、jsp、jstl-->
    <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的区别:
  1. 拦截器是基于java反射机制的,而过滤器是基于函数回调的。
  2. 过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
  3. 拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
  4. 拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
  5. 在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;

/*
拦截器Interceptor
 */
public class DefInterceptor implements HandlerInterceptor {
    /*
    在控制器controller处理请求之前被调用
    1 该方法的返回值是布尔值Boolean 类型的,当它返回为false 时,表示请求结束,
    后续的Interceptor 和Controller 都不会再执行;
    2 当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,
    如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller方法
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("*****preHandle*****");
        return true;//等价于filter过滤器的放行chain.doFilter();
    }

    /*
    在controller处理请求 结束之后,在dispatcherServlet进行视图数据渲染之前,调用该方法
    所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("*****postHandle*****");
    }
    /*
    在DispatcherServlet渲染了对应的视图之后执行,这个方法的主要作用是用于进行资源清理工作
     */
    @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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值