SpringMvc学习笔记总结

一.SpringMVC

MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分

M:Model,模型层,指工程中的JavaBean,作用是处理数据

JavaBean分为两类:

  • 一类称为实体类Bean:专门存储业务数据的,如 Student、User 等
  • 一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访问

V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据

C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器

1.具体流程

在这里插入图片描述

2. 快速入门

1.引用依赖:spring-mvc、thymeleaf-spring5、javax.servlet-api

2.添加Web.xml配置文件关于SpringMvc的配置,位于WEB-INF下

  <servlet>
      <servlet-name>springmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>

  <servlet-mapping>
      <servlet-name>springmvc</servlet-name>
      <!--
			设置springMVC的核心控制器所能处理的请求的请求路径 /所匹配的请求可以是/login或.html或.js或.css方式的请求路径 
			但是/不能匹配.jsp请求路径的请求 
	  -->
      <url-pattern>/</url-pattern>
  </servlet-mapping>

    <!--配置springMVC的编码过滤器--> 
    <filter> 
        <filter-name>CharacterEncodingFilter</filter-name> 
        <filter- class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
        <init-param> 
            <param-name>encoding</param-name> 
            <param-value>UTF-8</param-value> 
        </init-param> 
        <init-param> 
            <param-name>forceResponseEncoding</param-name> 
            <param-value>true</param-value>
        </init-param> 
    </filter> 
    <filter-mapping> 
            <filter-name>CharacterEncodingFilter</filter-name> 
            <url-pattern>/*</url-pattern> 
    </filter-mapping>
    <!--
		因为浏览器只能发送get和post请求,HiddenHttpMethodFilter能将POST请求转换为DELETE或PUT请求
		条件:当前请求方式为:POST
			 必须携带请求参数_method	
	--> 
    <filter> 
        <filter-name>HiddenHttpMethodFilter</filter-name> 
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 
    </filter>
    <filter-mapping> 
        <filter-name>HiddenHttpMethodFilter</filter-name> 
        <url-pattern>/*</url-pattern> 
    </filter-mapping>

3.创建请求控制器

@Controller
@RequestMapping("/mvc")
public class mvcController {
    @RequestMapping("/hello")
    public String hello(){        
        return "hello";
    }
}

4.在WEB-INF文件夹下创建名为jsp的文件夹,用来存放jsp视图。创建一个hello.jsp,在body中添加“Hello World”。

5.创建SpringMvc的配置文件

<?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"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    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-4.1.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">                    
    <context:component-scan base-package="test.SpringMVC"/>

    <!-- 处理静态资源 -->
    <mvc:default-servlet-handler />

    <!-- 开启Mvc注解驱动 -->
    <mvc:annotation-driven />
    
    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
            id="internalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/WEB-INF/jsp/" />
        <!-- 后缀 -->
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

6.启动服务器,键入http://localhost:8080/项目名/mvc/hello成功跳转到hello.jsp页面。

二. @RequestMapping注解:将请求和控制器关联起来

标识一个类时:设置请求的初始信息

标识一个方法时:设置请求的具体信息

这个注解里面还有很多属性:

  • value:设置多个请求映射的地址
  • method:设置能通过的请求方式(springmvc提供了扩展注解:@GetMapping、@PostMapping、@PutMapping、@DeleteMapping)
  • params:设置能通过的请求必须携带的请求参数
  • headers:设置能通过的请求必须携带的请求头参数

三.请求过来了那当然就是如何获取参数了?

  1. 通过ServletAPI获取:将HttpServletRequest作为控制器的形参,会封装放弃那请求的请求参数

  2. 通过控制器方法获取:当控制器的形参名和请求参数名相同时,DispatcherServlet会将请求参数自动赋值给形参

  3. @RequestParam:将请求参数与控制器形参创建映射关系,标注在形参前面,获取请求参数名与形参名相同的,有三个属性(value:指定形参赋值的参数名、required:设置请求参数是否必须、defaultValue:默认值为参数名)

  4. @RequestHeader:将请求头信息与控制器形参创建映射关系,用法与@RequestParam

  5. @CookieValue:将Cookie数据与控制器形参创建映射关系,用法与@RequestParam

  6. 通过POJO获取:控制器形参设置一个实体类类型,当请求参数中的参数与该实体类中的属性一一对应,则会给其赋值

四.域对象的数据共享

  1. 使用ServletAPI向request域对象共享数据:控制器设置形参”HttpServletRequest request“,调用方法request.setAttribute(“AB”, “data”);
  2. 使用ModelAndView向request域对象共享数据:创建一个新的ModelAndView()对象,调用方法:mod.addObject(“AB”, “data”); 设置视图,实现页面跳转 :mod.setViewName(“success”); 返回ModelAndView()对象:return mav;
  3. 使用Model向request域对象共享数据:控制器设置形参”Model model“,调用方法model.addAttribute(“AB”, “data”);
  4. 使用map向request域对象共享数据::控制器设置形参”Map<String, Object> map“,调用方法map.put(“AB”, “data”);
  5. 使用ModelMap向request域对象共享数据:控制器设置形参”ModelMap modelMap“,调用方法modelMap.addAttribute(“AB”, “data”);
  6. 向session域共享数据:控制器设置形参”HttpSession session”,调用方法session.setAttribute(“AB”, “data”);
  7. 向application域共享数据:控制器设置形参”HttpSession session”,创建session.getServletContext(); 对象,调用方法application.setAttribute(“AB”, “data”);

五.SpringMvc视图的渲染

  • ThymeleafView:当控制器所请求的视图没有前缀的时候,会默认被配置文件中的视图解析器根据前缀和后缀拼接解析,然后转发

  • 转发视图:当控制器的请求的视图含有前缀“forword:”时,不会经过视图解析器,而是将前缀去掉,转发到剩下的路径

  • 重定向视图:当控制器的请求的视图含有前缀“redirect:”时,不会经过视图解析器,而是将前缀去掉,重定向到剩下的路径

    (当控制器方法中只需要实现页面跳转,则可以设置view controller标签)

<!--
path:设置处理的请求地址 
view-name:设置请求地址所对应的视图名称 
--> 
<mvc:view-controller path="/router" view-name="success"></mvc:view-controller>
<!--开启注解驱动-->
<mvc:annotation-driven />

六.请求体的转换

  1. @RequestBody:标注在控制器形参位置,请求体会赋值给形参
  2. RequestEntity:是一种封装请求报文的类型,标注在形参位置,请求报文会赋值给形参,可以通过getHeaders()获取请求头信息,getBody()获取请求体信息等
  3. @ResponseBody:标注在控制器方法,将该方法的返回体直接响应在浏览器上
  4. ResponseEntity:用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文
  5. @RestController:标识在控制器的类上,就相当于为类添加了@Controller注解,并且为其中的每个方法添加了

七.拦截器和异常处理器

在配置文件中配置拦截器

<bean class="com.yaoqqi.interceptor.FirstInterceptor"></bean> 
<ref bean="firstInterceptor"></ref> 
<!-- 以上两种配置方式都是对DispatcherServlet所处理的所有的请求进行拦截 --> 
<mvc:interceptor> 
    <mvc:mapping path="/**"/> 
    <mvc:exclude-mapping path="/testRequestEntity"/> 
    <ref bean="firstInterceptor"></ref> 
</mvc:interceptor> 
<!--
    以上配置方式可以通过ref或bean标签设置拦截器,通过mvc:mapping设置需要拦截的请求,通过 
    mvc:exclude-mapping设置需要排除的请求,即不需要拦截的请求 
-->

拦截器有三个抽象方法:

  • preHandle:控制器方法执行之前执行preHandle(),返回值boolean类型表示是否令其通过,返回true为通过并调用控制器方法;返回false表示拦截,即不调用控制器方法
  • postHandle:控制器方法执行之后执行postHandle()
  • afterComplation:处理完视图和模型数据,渲染视图完毕之后执行afterComplation()

八. 异常处理器

@ControllerAdvice 
//@ControllerAdvice将当前类标识为异常处理的组件 
public class ExceptionController { 
    //@ExceptionHandler用于设置所标识方法处理的异常 
    @ExceptionHandler(ArithmeticException.class) 
    //ex表示当前请求处理中出现的异常对象 
    public String handleArithmeticException(Exception ex, Model model){ 
        model.addAttribute("ex", ex); 
        return "error"; 
    } 
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幺柒.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值