个人博客网:https://wushaopei.github.io/    (你想要这里多有)

一、SpringMVC的概述

1、概述

Spring MVC框架是一个开源的Java平台,为开发强大的基于JavaWeb应用程序提供全面的基础架构支持,并且使用起来非常简单容易。

Spring web MVC框架提供了MVC(模型 - 视图 - 控制器)架构,用于开发灵活和松散耦合的Web应用程序的组件。 MVC模式使应用程序的不同组件(输入逻辑,业务逻辑和UI逻辑)合理有效的分离,同时又有效的将各组件组合一起完成功能。

  • 模型(Model)封装了应用程序数据,通常它们将由POJO类组成。
  • 视图(View)负责渲染模型数据,一般来说它负责生成客户端浏览器可以解释HTML输出。
  • 控制器(Controller)负责处理用户请求并构建适当的模型,并将其传递给视图进行渲染。

2、SpringMVC的核心DispatcherServlet程序

二、SpringMVC 示例及配置

1、SpringMVC——Hello world示例的步骤

【1】创建一个动态web工程

【2】导入需要的jar包

【3】SpringMVC的 Hello 程序目录结构:

【4】web.xml中的配置:

  1. <!-- The front controller of this Spring Web application, responsible for handling all application requests -->
  2. <servlet>
  3. <servlet-name>springDispatcherServlet</servlet-name>
  4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  5. <!--
  6. 初始化参数,配置Spring的配置文件
  7. -->
  8. <init-param>
  9. <param-name>contextConfigLocation</param-name>
  10. <param-value>classpath:applicationContext.xml</param-value>
  11. </init-param>
  12. <!-- load-on-startup标签是在web工程启动之后就会创建Servlet程序 -->
  13. <load-on-startup>1</load-on-startup>
  14. </servlet>
  15. <!-- Map all requests to the DispatcherServlet for handling -->
  16. <servlet-mapping>
  17. <servlet-name>springDispatcherServlet</servlet-name>
  18. <!-- 支持全部的请求,包含 restful请求 -->
  19. <url-pattern>/</url-pattern>
  20. </servlet-mapping>

【5】HelloController代码:

  1. @Controller
  2. public class HelloController {
  3. /**
  4. * @RequestMapping 配置一个请求地址跟方法对应<br/>
  5. * /hello是请求地址。表示http://ip:port/工程名/hello<br/>
  6. */
  7. @RequestMapping("/hello")
  8. public String hello() {
  9. System.out.println("这是SpringMVC的 hello 程序!");
  10. // 跳转的地址
  11. return "/target.jsp";
  12. }
  13. }

【6】页面 jsp 内容:

index.jsp 内容:

  1. <a href="${ pageContext.request.contextPath }/hello">hello程序</a>

target.jsp 内容:

  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  4. <title>Insert title here</title>
  5. </head>
  6. <body>
  7. hello 请求跳转过来啦……
  8. </body>
  9. </html>

【7】applicationContext.xml配置文件内容:

  1. <!-- 配置包扫描 -->
  2. <context:component-scan base-package="com.atguigu"></context:component-scan>

【8】业务逻辑流程分析:

2、SpringMVC的配置文件的另一种存放方式

三、视图解析器

视图解析器配置:

  1. <!-- InternalResourceViewResolver 视图解析器 -->
  2. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  3. <!-- 配置前缀地址 -->
  4. <property name="prefix" value="/pages/user/"/>
  5. <!-- 配置后缀地址 -->
  6. <property name="suffix" value=".jsp"/>
  7. </bean>

四、@RequestMapping注解详解

1、value属性

value属性是给方法配置一个请求地址

  1. /**
  2. * @RequestMapping 是给资源配置(Controller中的方法或Controller)一个访问地址。 <br/>
  3. *
  4. * value属性表示请求的地址<br/>
  5. * value="/abc" 就表示请求地址是:http://ip:port/工程名/abc<br/>
  6. * path属性同value作用一样,一般用value居多
  7. */
  8. @RequestMapping(path="/abc")
  9. public String abc() {
  10. System.out.println("这是abc方法被调用了");
  11. return "target2";
  12. }

2、params属性

params是要求此请求的参数匹配

  • params="username" 表示 请求地址必须带有username参数
  • params="username=abc" 表示 请求参数中必须要有username,而且值还必须是abc
  • params="username!=abc" 表示 1、请求参数中不能有username参数。2、有username参数,但值不能等于abc
  • params="!username" 表示 请求地址不能带有username参数
  • params= {"username!=abc","!password"} params可以有多个值,每个值之间是&&关系

以上条件表示要求:

( 请求地址中不能有username参数 || username参数值不能等于 abc && 不能有password参数 )

  1. /**
  2. * @RequestMapping 是给资源配置(Controller中的方法或Controller)一个访问地址。 <br/>
  3. *
  4. * value属性表示请求的地址<br/>
  5. * value="/abc" 就表示请求地址是:http://ip:port/工程名/abc<br/>
  6. * path属性同value作用一样,一般用value居多<br/>
  7. *
  8. * params属性表示当前请求必须要有指定参数的匹配<br/>
  9. * params="password",表示请求中必须包含有password这个参数<br/>
  10. * params="password=wzg168",表示请求中必须要的password参数。而且值还要等于wzg168(也就是给定值)<br/>
  11. * params="password!=wzg168",表示两种情况,1:是可以没有password这个参数。2.如果有这个参数。值不能等于wzg168(也就是给定值)<br/>
  12. * params="!password",表示请求中不能有此参数<br/>
  13. * params= {"!password","username"}表示请求中,不能有password参数,必须有username参数
  14. */
  15. @RequestMapping(path="/abc",params= {"!password","username"})
  16. public String abc() {
  17. System.out.println("这是abc方法被调用了");
  18. return "target2";
  19. }

3、headers属性

是匹配请求头规则

  1. /**
  2. * headers属性可以规则此请求中的请求头信息<br/>
  3. * headers="User-Agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
  4. * 表示当前请求必须是谷歌浏览器
  5. * @return
  6. */
  7. @RequestMapping(value="/aaa",headers="User-Agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36")
  8. public String aaa() {
  9. System.out.println("这是aaa方法被调用了");
  10. return "target2";
  11. }

4、method属性

GET:表示GET请求

POST:表示POST请求

PUT:表示PUT请求

DELETE:表示DELETE请求

  • method 规定当前请求必须是什么请求才能访问此方法
  • method=RequestMethod.GET 表示必须是GET请求
  • method=RequestMethod.POST表示必须是POST请求

GET请求演示:

  1. @RequestMapping(value="/bbb",method=RequestMethod.GET)
  2. public String bbb() {
  3. System.out.println("这是bbb方法被调用了");
  4. return "target2";
  5. }

POST请求演示:

  1. /**
  2. * GET:表示GET请求 <br/>
  3. * POST:表示POST请求<br/>
  4. * PUT:表示PUT请求<br/>
  5. * DELETE:表示DELETE请求<br/>
  6. *
  7. * method 规定当前请求必须是什么请求才能访问此方法<br/>
  8. * method=RequestMethod.GET 表示必须是GET请求<br/>
  9. * method=RequestMethod.POST表示必须是POST请求<br/>
  10. */
  11. @RequestMapping(value="/bbb",method=RequestMethod.POST)
  12. public String bbb() {
  13. System.out.println("这是bbb方法被调用了");
  14. return "target2";
  15. }

GET 请求和 POST 请求 的区别与调用方式

5、@RequestMapping标注在Controller类上

6、通配符在@RequestMapping中的使用

【绝对匹配】

创建path.jsp文件

由地址栏输入连接方法的地址,然后进入方法,直接进行执行跳转到 path 路径下!

该 path 路径 声明精确!

跳转到 path页面

  1. @Controller
  2. public class PathController {
  3. /**
  4. * 精确匹配<br/>
  5. * value="/fun" 表示http://ip:port/工程名/fun<br/>
  6. */
  7. @RequestMapping(value="/fun")
  8. public String fun() {
  9. System.out.println("精确匹配");
  10. return "path";
  11. }
  12. }

【2】 ?问号 匹配资源路径

? 问号表示一个任意字符

  1. /**
  2. * ? 问号表示一个任意字符<br/>
  3. * http://ip:port/工程名/fun 或 http://ip:port/工程名/fua
  4. */
  5. @RequestMapping(value="/fu?")
  6. public String fun1() {
  7. System.out.println("这是fun1方法被调用了 /fu? ");
  8. return "path";
  9. }

【3】 * 星号 匹配资源路径

* 星号 可以匹配任意个字符

  1. /**
  2. * * 星号表示任意个字符<br/>
  3. * http://ip:port/工程名/fun 或 http://ip:port/工程名/fuabc
  4. */
  5. @RequestMapping(value="/fu*")
  6. public String fun2() {
  7. System.out.println("这是fun2方法被调用了 /fu* ");
  8. return "path";
  9. }

注:当一个路径同时匹配多个规则的时候,调用方法的优先顺序是:

绝对匹配--->>>>?问号匹配---->>>>*星号匹配

【4】 ? 匹配一个字符目录

  1. /**
  2. * value="/?/fun" 这里的问题号匹配一个字符的目录<br/>
  3. */
  4. @RequestMapping(value="/?/fun")
  5. public String fun3() {
  6. System.out.println("这是fun3方法被调用了 /?/fun ");
  7. return "path";
  8. }

【5】* 星号 匹配一层目录(多个字符)

  1. // value="/*/fun"这里的星号,表示匹配一层任意多个字符的目录
  2. @RequestMapping(value="/*/fun")
  3. public String fun4() {
  4. System.out.println("这是fun4方法被调用了 /*/fun ");
  5. return "path";
  6. }

【6】* *  星星号 匹配多层目录

  1. // value="/**/fun" 这里的星星 可以匹配多层任意的目录
  2. @RequestMapping(value="/**/fun")
  3. public String fun5() {
  4. System.out.println("这是fun5方法被调用了 /**/fun ");
  5. return "path";
  6. }

五、Controller中如何接收请求参数

1、原生API参数类型

【1】HttpServletRequest类

  1. @RequestMapping(value="/param1")
  2. public String param1(HttpServletRequest request) {
  3. System.out.println("reqeust对象 ===>>>" + request.getHeader("User-Agent"));
  4. System.out.println("param1方法被调用了");
  5. return "param";
  6. }

从请求头获取请求参数:

打印结果:

【2】HttpSession类

  1. @RequestMapping(value="/param2")
  2. public String param2(HttpSession session) {
  3. System.out.println("HttpSession对象 ===>>>" + session);
  4. System.out.println("我想念晶晶姑娘啦!");
  5. return "param";
  6. }

获取当前请求会话

打印结果:

【3】HttpServletResponse类

  1. @RequestMapping(value="/param3")
  2. public String param3(HttpServletResponse response) {
  3. System.out.println("HttpServletResponse对象 ===>>>" + response);
  4. System.out.println("param3方法被调用了");
  5. return "param";
  6. }

  1. @RequestMapping(value = "/param4")
  2. public String param4(HttpServletRequest request, HttpServletResponse response,
  3. HttpSession session) {
  4. System.out.println("reqeust对象 ===>>>" + request.getHeader("User-Agent"));
  5. System.out.println("HttpSession对象 ===>>>" + session);
  6. System.out.println("HttpServletResponse对象 ===>>>" + response);
  7. System.out.println("param4方法被调用了");
  8. return "param";
  9. }

2、普通类型入参

在请求的方法上,写上类型和参数名,那么 SpringMVC模型就会自动的将参数值注入到方法的参数中。

  1. @RequestMapping("/param5")
  2. public String param5(String username,String password) {
  3. System.out.println( "请求参数username的值:" + username );
  4. System.out.println( "请求参数password的值:" + password );
  5. return "param";
  6. }

测试的地址是:

http://localhost:8080/springmvc_hello/param5?username=wzg186&password=123456

3、普通类型数组的参数

把请求的参数名做为方法的参数名用来接收请求参数值即可。数组也一样。

  1. @RequestMapping("/param6")
  2. public String param6(String[] hobby) {
  3. if (hobby != null && hobby.length > 0) {
  4. for (String h : hobby) {
  5. System.out.println("兴趣爱好:" + h);
  6. }
  7. }
  8. return "param";
  9. }

测试地址:

http://localhost:8080/springmvc_hello/param6?hobby=cpp&hobby=java&hobby=javaScript

4、普通类型使用@RequestParam入参

  1. /**
  2. * 我们的方法参数名是username,而客户端无法(或不方便)传username的参数名。而只能传user参数,给username赋值。怎么办?<br/>
  3. * @RequestParam(name="user") 把请求的参数user的值。注入到方法参数的username。<br/>
  4. * @RequestParam注解name属性指定的值,要求客户端必须传递。否则就报错。<br/>
  5. * required属性设置请求的参数user是否必须传递。默认是true,表示必须。<br/>
  6. * defaultValue属性是默认值。也就是如果客户端没有传递user参数,则使用defaultValue来设置username的值<br/>
  7. */
  8. @RequestMapping("/param7")
  9. public String param7(@RequestParam(name="user",required=false,defaultValue="我是默认值,帅帅哒!!") String username) {
  10. System.out.println("username的值:" + username);
  11. return "param";
  12. }


  1. 我们的方法参数名是username,而客户端无法(或不方便)传username的参数名。而只能传user参数,给username赋值。怎么办?<br/>
  2. @RequestParam(name="user") 把请求的参数user的值。注入到方法参数的username。<br/>
  3. @RequestParam注解name属性指定的值,要求客户端必须传递。否则就报错。

如果这个时候,我希望客户端哪怕没有传递user的参数的时候。也可以调用方法怎么办?

解决一:

修改@RequestParam注解的required=false的属性。表示这个参数不是必须传递。

设置 defaultValue属性是默认值。也就是如果客户端没有传递user参数,则使用defaultValue来设置username的值<br/>

5、@RequestHeader获取请求头入参

@RequestHeader 可以把请求头的值注入到,方法参数中。

  1. @RequestMapping("/param8")
  2. public String param8(@RequestHeader("User-Agent") String userAgent,
  3. @RequestHeader("Accept") String accept) {
  4. System.out.println("请求头User-Agent的值是:" + userAgent);
  5. System.out.println("请求头Accept的值:" + accept);
  6. return "param";
  7. }

6、@CookieValue获取Cookie值入参

@CookieValue是可以取得客户端发送过来的某个指定了名称的Cookie的值,注入到方法参数。

  1. @RequestMapping("/param9")
  2. public String param9(@CookieValue(name = "JSESSIONID") String jSessionId,
  3. @CookieValue(name = "abcde", defaultValue = "这是晶晶姑娘") String abcde) {
  4. System.out.println("获取了【JSESSIONID】Cookie的值是:" + jSessionId);
  5. System.out.println("获取了【abcde】Cookie的值是:" + abcde);
  6. return "param";
  7. }

7、一个Pojo对象类型的参数

JavaBean对象

  1. public class Person {
  2. private Integer id;
  3. private String name;
  4. private Integer age;
  5. private String phone;

有一个表单(表单项的name的属性值一定要跟javaBean的属性名一致

  1. <form action="${ pageContext.request.contextPath }/param10">
  2. id:<input name="id" /><br/>
  3. name:<input name="name" /><br/>
  4. age:<input name="age" /><br/>
  5. phone:<input name="phone" /><br/>
  6. <input type="submit" />
  7. </form>

Controller中的代码:

  1. @RequestMapping("/param10")
  2. public String param10(Person person) {
  3. System.out.println("用户的信息:" + person);
  4. return "param";
  5. }

8、对象中套对象(级联属性)

GET请求中文乱码,找到Servers工程下Tomcat的配置文件server.xml配置文件,找到Connector标签,添加属性URIEncoding

javaBean对象

  1. public class Book {
  2. private String name;
  3. private BigDecimal price;
  4. public class Person {
  5. private Integer id;
  6. private String name;
  7. private Integer age;
  8. private String phone;
  9. private Book book;

表单设置:

  1. <h1>添加用户</h1>
  2. <form action="${ pageContext.request.contextPath }/param10">
  3. id:<input name="id" /><br/>
  4. name:<input name="name" /><br/>
  5. age:<input name="age" /><br/>
  6. phone:<input name="phone" /><br/>
  7. 书名:<input name="book.name" /><br/>
  8. 价格:<input name="book.price" /><br/>
  9. <input type="submit" />
  10. </form>

SpringMVC(一)概述、解析器与注解的更多相关文章

  1. spring mvc:内部资源视图解析器2(注解实现)@Controller/@RequestMapping

    spring mvc:内部资源视图解析器2(注解实现)  @Controller/@RequestMapping 访问地址: http://localhost:8080/guga2/hello/goo ...

  2. SpringMVC——说说视图解析器

    学习SpringMVC——说说视图解析器   各位前排的,后排的,都不要走,咱趁热打铁,就这一股劲我们今天来说说spring mvc的视图解析器(不要抢,都有位子~~~) 相信大家在昨天那篇如何获取请 ...

  3. SpringMVC 多视图解析器配置以及问题

    在SpringMVC模式当中可以通过如下配置来支持多视图解析 <!-- jsp jstl --> <bean id="JSPViewResolver" class ...

  4. 学习SpringMVC——说说视图解析器

    各位前排的,后排的,都不要走,咱趁热打铁,就这一股劲我们今天来说说spring mvc的视图解析器(不要抢,都有位子~~~) 相信大家在昨天那篇如何获取请求参数篇中都已经领略到了spring mvc注 ...

  5. springMVC自定义方法属性解析器

    使用场景例子: 用户登陆系统一般会往Session里放置一个VO对象,然后在controller里会来获取用户的userId等信息. 之前的写法是:@SessionAttributes配合@Model ...

  6. SpringMVC(AbstractController,拦截器,注解)

    1.Controller接口及其实现类 Controller是控制器/处理器接口,只有一个方法handleRequest,用于进行请求的功能处理(功能处理方法),处理完请求后返回ModelAndVie ...

  7. SpringMVC的视图解析器

    ViewResolver和View介绍 SpringMVC用于处理视图最重要的两个接口是ViewResolver和View.ViewResolver的主要作用是把一个逻辑上的视图名称解析为一个真正的视 ...

  8. springMVC初探视图解析器——InternalResourceViewResolver

    springmvc在处理器方法中通常返回的是逻辑视图,如何定位到真正的页面,就需要通过视图解析器. springmvc里提供了多个视图解析器,InternalResourceViewResolver就 ...

  9. SpringMVC 自定义参数解析器.

    一.简述 有没有想过像 @RequestParam.@RequestBody 这些注解的工作原理呢?为什么 form 表单.application/json 的参数能够直接封装进 Bean 对象中呢? ...

随机推荐

  1. Unity ugui拖动控件(地图模式与物件模式)

    拖动在游戏中使用频繁,例如将装备拖动到指定的快捷栏,或者大地图中拖动以查看局部信息等. Unity的EventSystems中可以直接继承几个接口来实现拖动功能,如下: namespace Unity ...

  2. 最简单的手机预览WEB移动端网页的方法

    网上看了很多关于该问题的解决办法,各种各样的都有,个人也测试了一些, 最后总结出一个最简单且实用的方法. 1.安装nodejs node官网下载对应版本的nodejs,安装好了之后,在node.js执 ...

  3. python学习(11)文件的读写操作

    1.读文件的7种操作模式 操作模式 具体含义 'r' 读取 (默认) 'w' 写入(会先截断之前的内容) 'x' 写入,如果文件已经存在会产生异常 'a' 追加,将内容写入到已有文件的末尾 'b' 二 ...

  4. static RMQ

    RMQ问题:对于长度为N的序列,询问区间[L,R]中的最值 RMQ(Range Minimum/Maximum Query),即区间最值查询. 常见解法: 1.朴素搜索 2.线段树 3.DP 4.神奇 ...

  5. 10JAVA基础-常用类02

    Arrays 工具类,构造方法私有 //将数组转变为字符串 String str = Arrays.toString(int[] value); //对于原数组进行排序,升序 Arrays.sort( ...

  6. SpringBoot整合Redis实现简单的set、get

    一.导入pom.xml文件相关的依赖并配置 <dependency> <groupId>org.springframework.boot</groupId> < ...

  7. Django之urls.py路由配置(URLConf)

    urls.py路由配置(URLConf) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 基本格式: Django1.x版本 ...

  8. Vue刷新页面的三种方式

    我们在写项目的时候,经常会遇到,用户执行完某个动作,改变了某些状态,需要重新刷新页面,以此来重新渲染页面 1.原始方法: location.reload(); 2.vue自带的路由跳转: this.$ ...

  9. JavaScript(对象的创建模式)

    JavaScript和其他语言略有不同,在JavaScript中,引用数据类型都是对象(包括函数).不过,在JavaScript中并没有“类”的概念,这决定了在JavaScript中不能直接来定义“类 ...

  10. web项目——javax.servlet.ServletException: Circular view path [registerForm]

    报错: 控制台输出: 三月 21, 2019 10:12:32 上午 org.springframework.web.servlet.PageNotFound noHandlerFound 警告: N ...