Spring MVC框架 学习笔记总结
Posted IT_Holmes
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring MVC框架 学习笔记总结相关的知识,希望对你有一定的参考价值。
文章目录
- 1. SpringMVC的 控制器controller配置
- 2. 什么是RestFul风格?
- 3. RestFul 风格(几乎所有网站都在使用)
- 4. SpringMVC的结果跳转方式
- 5. 后台接受请求参数
- 6. 数据回显(数据显示到前端)
- 7. SpringMVC 乱码问题解决
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 的HelloWorld