Spring MVC框架 学习笔记总结

Posted IT_Holmes

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MVC框架 学习笔记总结相关的知识,希望对你有一定的参考价值。

文章目录

1. SpringMVC的 控制器controller配置

1.1 什么是控制器Controller?


这里的控制器我们就可以一个控制器就是一个servlet。

控制器的作用就是负责解析用户的请求并将其转换为一个模型,返回给视图解析器。

控制器通常是接口定义或注解定义两种方法实现。

1.2 控制器接口实现(麻烦,不推荐)


第一步:实现Controller接口类。

ControllerTest01实现了Controller接口,那么ControllerTest01就是一个控制器:

package com.itholmes.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ControllerTest01 implements Controller 

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception 
        ModelAndView mv = new ModelAndView();
        //往mv中添加对象。
        mv.addObject("msg","controller_interface");
        //设置view的名字,就对应了WEB-INF/jsp/test.jsp页面。
        mv.setViewName("test");
        return mv;
    

第二步:去Spring配置文件中注册请求的bean,name对应请求路径,class对应处理请求的类。

<?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.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd"
        >

    <context:component-scan base-package="com.itholmes.controller"/>
    <mvc:default-servlet-handler/>
    <mvc:annotation-driven/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--注意:/WEB-INF/jsp/ 后面必须要有 / 不然报404的!!-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--对于接口实现,上面除了视图解析器,其他三个都不需要显示的来配置出来。-->
    <bean name="/t" class="com.itholmes.controller.ControllerTest01"/>

</beans>

第三步:配置tomcat运行测试。


接口实现的缺点:

  • 实现接口Controller定义控制器是较老的办法。
  • 一个严重的缺点就是一个控制器中只有一个方法,如果要多个方法则需要定义多个Controller,定义起来非常麻烦。

1.3 控制器注解@Controller实现(推荐使用!)


下面的四个注解,作用几乎是共同的,用来被扫描(Spring的扫描机制),只不过对应不同的架构层而已:


@Controller注解类型:用于声明Spring类的实例是一个控制器。


创建一个使用ControllerTest02使用注解来实现的控制器:

package com.itholmes.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

/*
    被@Controller注解的类代表这个类会被spring接管。
    如果,该类方法的返回值是String,并且由具体页面可以跳转,那么就会被视图解析器解析。
 */
@Controller
public class ControllerTest02 

    @RequestMapping("/t1")
    //这里也可以用ModelAndView对象来传,只不过Model是专门用来传数据的,一般都是用Model来操作。
    public String test1(Model model)
        model.addAttribute("msg","ControllerTest02");
        return "test";//return返回的内容就会被视图解析器来拼接解析。
    

    @RequestMapping("/t2")
    //这里也可以用ModelAndView对象来传,只不过Model是专门用来传数据的,一般都是用Model来操作。
    public String test2(Model model)
        model.addAttribute("msg","ControllerTest02");
        return "test";//return返回的内容就会被视图解析器来拼接解析。
    

    @RequestMapping("/t3")
    //这里也可以用ModelAndView对象来传,只不过Model是专门用来传数据的,一般都是用Model来操作。
    public String test3(Model model)
        model.addAttribute("msg","ControllerTest02");
        return "test";//return返回的内容就会被视图解析器来拼接解析。
    
	
	//这样我们无论访问t1,t2,t3最终访问都是test.jsp,这就和接口实现的控制器的缺点形成对比,如果是接口实现的控制器,就得写三个实现controller接口的控制器。


springmvc-servlet.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"
       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.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd"
        >

    <context:component-scan base-package="com.itholmes.controller"/>
    <mvc:default-servlet-handler/>
    <mvc:annotation-driven/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--注意:/WEB-INF/jsp/ 后面必须要有 / 不然报404的!!-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

完成上面,就可以发布tomcat进行测试了。

1.4 @RequestMapping详解


@RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为路径。

package com.itholmes.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("ControllerTest03")
public class ControllerTest03 

    @RequestMapping("t1")
    public String test01(Model model)
        model.addAttribute("msg","test01");
        return "test";
    

    @RequestMapping("t2")
    public String test02(Model model)
        model.addAttribute("msg","test02");
        return "test";
    


就跟上面代码一样访问的路径就变成了下图方式:

2. 什么是RestFul风格?




RestFul就是通过不同的请求方式来实现不同的效果:

3. RestFul 风格(几乎所有网站都在使用)

3.1 一般通过? 和 & 再url拼接参数


写一个控制器类,RestFulController类:

package com.itholmes.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class RestFulController 

    @RequestMapping("/add")
    public String test1(int a, int b, Model model)
        int res = a+b;
        model.addAttribute("msg","结果为:"+res);
        return "test";
    



然后我们访问/add路径,发现报错,因为没有传参数。

我们可以通过传统方式来传参数:

3.2 RestFul风格代码实现


接下来我们通过RestFul风格来实现:

  • @PathVariable注解:让方法参数的值对应绑定到一个URI模板变量上。
  • 这样前端先将url传过来,例如:/add/10/20 , 然后@PathVariable注解回按照后台定义的格式/add/参数1/参数2来给参数1和参数2赋值。
package com.itholmes.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class RestFulController 

    @RequestMapping("/add/a/b")
    public String test1(@PathVariable int a,@PathVariable int b, Model model)
        int res = a+b;
        model.addAttribute("msg","result:"+res);
        return "test";
    


这样RestFul风格就体现出来了。

我们在通过传统方式传参就会报404了。


注意事项:当我们发送的参数类型和后台类型不对应时,就会报400的错误。

3.3 RequestMapping源码中的RequestMethod的作用


用RequestMethod的method,我们可以指定要用什么类型方法来接收。

而这个RequestMethod源码里就是一个枚举类。

因此我们可以设定只接收什么类型,就像下面代码我只接受delete类型:

package com.itholmes.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class RestFulController 
	//RequestMapping的原来来对应的赋值。
	//下面就仅仅对应了delete,也就只接受delete类型的方法。
    @RequestMapping(value="/add/a/b",method = RequestMethod.DELETE)
    public String test1(@PathVariable int a,@PathVariable int b, Model model)
        int res = a+b;
        model.addAttribute("msg","result:"+res);
        return "test";
    



自然如果我们改成GET类型就能接受了:

3.4 @GetMapping注解等类型注解


对于类型设置的注解,我们可以直接使用@GetMapping注解:

  • @GetMapping("/add/a/b")就等价于@RequestMapping(value="/add/a/b",method = RequestMethod.GET)
  • 同理也有其他的@PostMapping,@PutMapping,@DeleteMapping等等注解。
package com.itholmes.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class RestFulController 

    //@RequestMapping(value="/add/a/b",method = RequestMethod.GET)
    //这里的@GetMapping("/add/a/b")就等价于上面这段代码。
    @GetMapping("/add/a/b")
    public String test1(@PathVariable int a,@PathVariable int b, Model model)
        int res = a+b;
        model.addAttribute("msg","result:"+res);
        return "test";
    



我们可以在相同的url下面,接受不同的请求:

package com.itholmes.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

@Controller
public class RestFulController 

    //我们就可以通过@GetMapping或@PostMapping来分类型来接受了。
    @GetMapping("/add/a/b")
    public String test1(@PathVariable int a,@PathVariable int b, Model model)
        int res = a+b;
        model.addAttribute("msg","result_get:"+res);
        return "test";
    

    @PostMapping("/add/a/b")
    public String test2(@PathVariable int a,@PathVariable int b, Model model)
        int res = a+b;
        model.addAttribute("msg","result_post:"+res);
        return "test";
    


写一个jsp来测试post方法的接受:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
	<!--因为是按照url来接受参数,为了方便测试,我直接用url来传参数。-->
    <form action="/add/10/20" method="post">
        <input type="submit" value="submit">
    </form>
</body>
</html>


通过上面的操作就可以体现出RestFul风格可以通过不同的请求方式来实现不同的效果!

3.5 Ambiguous(模棱两可)


记住这个单词Ambiguous英文意思是模棱两可的意思。

如果报错有这个Ambiguous单词,第一时间想到,就是我们后台写的代码处理相同类型有两个方法能处理。

例如:前台传送get请求,而后台有两个@GetMapping或@RequestMapping(value="/add/a/b",method = RequestMethod.GET)来接受,这样代码就不知道选择哪一个了。

3.6 RestFul风格优点


优点:

  • 简洁(写法简单)
  • 高效(支持缓存)
  • 安全(让使用者无法知道参数啥的)

4. SpringMVC的结果跳转方式

4.1 ModelAndView的作用


ModelAndView对象的作用:

4.2 原生Servlet的请求转发或重定向


在我们的原生的Servlet中,是通过request接受参数,response来返回参数或者请求转发重定向的。


原生servlet的请求转发或重定向如下:

4.3 Spring MVC的请求转发和重定向


SpringMVC的底层原理也是用的Servlet,因此也可以来使用request和response,接收返回参数,请求转发或重定向。

4.3.1 无需视图解析器的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.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd"
        >

    <context:component-scan base-package="com.itholmes.controller"/>
 

以上是关于Spring MVC框架 学习笔记总结的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC框架 学习笔记总结

Spring MVC框架 学习笔记总结

Spring MVC框架 学习笔记总结

Spring MVC学习笔记---Spring MVC 的HelloWorld

Spring MVC学习笔记---Spring MVC 的HelloWorld

分布式服务框架学习笔记1 应用架构演进