SpringMVC介绍-01

1.离线文档

解压 spring-5.3.8-dist.zip文件。

位置:spring-framework-5.3.8/docs/reference/html/web.html#spring-web

2.SpringMVC基本介绍

2.1SpringMVC特点&概述

  1. SpringMVC 从易用性,效率上都比曾经流行的 Struts2 更好

  2. SpringMVC 是 WEB 层框架:SpringMVC接管了 web层组件,比如控制器,视图,视图解析,返回给用户的数据格式,同时支持 MVC 的开发模式/开发架构

  3. SpringMVC 通过注解,让 POJO 成为控制器,不需要继承类或者实现接口

  4. SpringMVC 采用低耦合的组件设计方式,具有更好的拓展和灵活性

  5. 支持 REST 格式的 URL 请求

  6. SpringMVC 是基于 Spring 的,它的核心包为 spring-webmvc-xxx.jar 和 spring-web-xxx.jar

2.2Spring SpringMVC SpringBoot的关系

  1. SpringMVC 只是 Spring 处理 WEB 层的一个模块/组件,SpringMVC 的基石是 Servlet
  2. SpringBoot 是为了简化开发者的使用而推出的一个框架(约定优于配置,简化了Spring的配置流程),它包含很多组件/框架,Spring 就是最核心的内容之一,也包含了 SpringMVC
  3. 三者之间的关系是:Spring Boot > Spring > SpringMVC

3.SpringMVC的快速入门

3.1需求说明

需求说明:使用SpringMVC,完成一个最基本的测试案例——登录案例

3.2SpringMVC登录流程分析

3.3代码实现

  1. 创建Java项目,添加 web支持并配置 tomcat

  2. 导入SpringMVC 开发需要的jar包

  3. src目录下创建spring的容器文件applicationContext-mvc.xml(名称随意)

  4. 在WEB-INF/web.xml文件中配置前端控制器(中央控制器)

    <!--配置前端控制器/中央控制器/分发控制器,负责处理所有的应用请求-->
    <servlet>
    <servlet-name>springDispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--配置属性 contextConfigLocation,指定 DispatcherServlet 去操作的 spring容器配置文件-->
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext-mvc.xml</param-value>
    </init-param>
    <!--在web项目启动时,就自动的加载 DispatcherServlet实例,1表示加载的顺序号-->
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>springDispatcherServlet</servlet-name>
    <!--1.配置的url-pattern为 /,表示用户的请求都经过 DispatcherServlet
    2.这样配置也支持 rest 风格的url请求-->
    <url-pattern>/</url-pattern>
    </servlet-mapping>
  5. web目录下创建login.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
    <title>登录</title>
    </head>
    <body>
    <h3>登录页面</h3>
    <%--
    action="login": 这样写实际上是相对路径,而相对路径是以当前的浏览器地址栏而言。
    因此实际上这里表示的 url 是 http://localhost:8080/web工程路径/login
    --%>
    <form action="login">
    u:<input name="username" type="text"/> <br/>
    p:<input name="password" type="password"/> <br/>
    <input type="submit" value="登录"/>
    </form>
    </body>
    </html>

    关于web工程路径,详见 Javaweb--day18-web工程路径

  6. 创建 src/com/li/web/UserServlet.java

    package com.li.web;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping; /**
    * @author 李
    * @version 1.0
    * 1.如果我们使用了SpringMVC,在一个类上标识 @Controller
    * 2.表示将该类视为一个控制器,注入到容器
    * 3.比原生的 servlet方便很多
    */
    @Controller
    public class UserServlet {
    /**
    * 编写login方法,响应用户请求
    * 1.login()方法用于响应用户的登录请求
    * 2.@RequestMapping(value = "/login")
    * 类似于我们原生的Servlet配置的url-pattern,不同的是这里是给方法配置url映射
    * 3.当用户在浏览器地址栏输入 http://localhost:8080/web工程路径/login
    * 就能够访问当到 login()方法
    * 4.return "login_ok"; 表示返回结果给视图解析器(InternalResourceViewResolver),
    * 视图解析器会根据配置,来决定提交到哪一个页面,如:
    * <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    * <property name="prefix" value="/WEB-INF/pages/"/>
    * <property name="suffix" value=".jsp"/>
    * </bean>
    * 根据上面的配置,return "login_ok"; 就是转发到 /WEB-INF/pages/login_ok.jsp
    *
    * @return
    */
    @RequestMapping(value = "/login")
    public String login() {
    System.out.println("login ok...");
    return "login_ok";
    }
    }
  7. 创建web/WEB-INF/pages/login_ok.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
    <title>登录成功</title>
    </head>
    <body>
    <h1>恭喜,登录成功!</h1>
    </body>
    </html>
  8. 配置容器文件applicationContext-mvc.xml

    <!--指定扫描的包-->
    <context:component-scan base-package="com.li.web"/> <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--配置属性 suffix(后缀) 和 prefix(前缀)-->
    <property name="prefix" value="/WEB-INF/pages/"/>
    <property name="suffix" value=".jsp"/>
    </bean>
  9. 整体的文件位置如下:

  10. 启动tomcat,访问 http://localhost:8080/springmvc/login.jsp,访问成功:

  11. 点击登录,成功访问到login_ok.jsp

3.4注意事项和细节说明

  1. 这里的UserServlet 需要注解成一个@Controller,我们称之为一个Handler处理器

  2. 在UserServlet 指定 url 时,value 可以省略(注意是省略“value”字符,不是省略值)

  3. 关于SpringMVC 的 DispatcherServlet 的配置文件,如果不在web.xml中指定spring配置文件,则默认在/WEB-INF/目录下找名为 springDispatcherServlet-servlet.xml 的spring配置文件。

    因此,我们将之前的spring容器文件移动到/web-INF/目录下,并注释掉web.xml配置的<init-param>,然后将容器文件重命名为 springDispatcherServlet-servlet.xml,重启tomcat,依然可以成功运行。

4.SpringMVC执行流程

5.@RequestMapping

5.1基本使用

@RequestMapping注解可以指定 控制器(处理器) 的某个方法的请求url

5.2@RequestMapping其他使用方式

5.2.1修饰方法和类

@RequestMapping注解可以修饰方法,还可以修饰类。

当同时修饰类和方法时,请求的url就是组合形式:/类请求值/方法请求值

例子

(1)UserHandler.java:

package com.li.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; /**
* @author 李
* @version 1.0
*/
@RequestMapping(value = "/user")
@Controller //UserHandler就是一个处理器/控制器,注入到spring容器
public class UserHandler {
/**
* 1.method = RequestMethod.POST 表示请求buy方法必须是post请求
* 2.RequestMethod 四个常用的选项 :GET, POST, PUT, DELETE
* 3.如果没有配置 RequestMethod,SpringMVC控制器默认支持 get和 post两种方式
* 4.buy()方法对应的完整请求url = http://ip:port/web工程路径/user/buy
* @return
*/
@RequestMapping(value = "/buy", method = RequestMethod.POST)
public String buy() {
System.out.println("购买商品");
return "success";
}
}

(2)request.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>购买商品</title>
</head>
<body>
<h1>购买商品</h1>
<%--
buy()方法对应的完整请求 url = http://ip:port/web工程路径/user/buy
--%>
<form action="user/buy" method="post">
购买人:<input type="text" name="username"/><br/>
购买量:<input type="text" name="nums"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>

(3)success.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>操作成功</title>
</head>
<body>
<h1>恭喜,操作成功!</h1>
</body>
</html>

在浏览器中访问 http://localhost:8080/springmvc/request.jsp,点击提交按钮,结果如下:

5.2.2指定请求方式

  1. @RequestMapping 可以指定请求的方式(post/get/put/delete...),请求方式要和指定方式一致,否则报错:

  2. SpringMVC 控制器默认支持get 和 post两种请求方式,即如果没有指定 method,可以接收 get 和 post请求

5.2.3指定params和headers,支持简单表达式

  1. param1:表示请求必须包含名为 param1 的请求参数
  2. !param1:表示请求不能包含名为 param1 的请求参数
  3. param1 != value1:表示请求包含名为 param1 的请求参数,但其值不能为 value1
  4. {"param1 = value1", "param2"}:请求必须包含名为 param1 和 param2 的两个请求参数,且 param1的值必须为 value1

应用实例

(1)修改UserHandler.java,增加方法

//...
@RequestMapping(value = "/user")
@Controller
public class UserHandler {
//... /**
* 1.params = "bookId" 表示请求该方式时,必须给一个名为 bookId的参数
* 2.search(String bookId){} 表示请求目标方法时,
* 携带的 bookId参数的值会被填充到目标方法的同名形参中
* @param bookId
* @return
*/
@RequestMapping(value = "/find", params = "bookId", method = RequestMethod.GET)
public String search(String bookId) {
System.out.println("查询书籍 bookId=" + bookId);
return "success";
}
}

(2)request.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>购买商品</title>
</head>
<body>
<h1>演示params的使用</h1>
<a href="user/find?bookId=100">查询书籍</a>
</body>
</html>

(3) success.jsp 不变。

(4)redeployTomcat,在浏览器地址栏访问:http://localhost:8080/springmvc/request.jsp,点击查询书籍超链接,结果如下:


(5)修改UserHandler.java,指定参数的值=100。

(6)修改request.jsp,修改发送的值为200.

(7)redeployTomcat,重新范文request.jsp,点击超链接,这里可以看到出现异常,因为发送的值和方法指定的值不一样。

5.2.4支持Ant 风格资源地址

  1. ?:匹配文件名中的一个字符
  2. *:匹配文件名中的任意字符,长度任意
  3. **:匹配多层路径
  4. Ant 风格的 url 地址举例:
    • /user/*/createUser:匹配 /user/aaa/createUser、/user/bbb/createUser 等 URL
    • /user/**/createUser:匹配 /user/createUser、/user/aaa/bbb/createUser 等 URL
    • /user/createUser??: 匹配 /user/createUserab、/user/createUsercd 等 URL

应用实例

(1)修改UserHandler.java,增加方法:

//...
@RequestMapping(value = "/user")
@Controller
public class UserHandler {
//... /**
* 要求:可以匹配 /user/message/aa, /user/message/aa/bb/cc
* @RequestMapping(value = "/message/**")
* 表示可以匹配多层的路径
* @return
*/
@RequestMapping(value = "/message/**")
public String im(){
System.out.println("发送消息");
return "success";
}
}

(2)修改request.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>购买商品</title>
</head>
<body>
<h1>演示 Ant 风格的请求资源方式</h1>
<a href="user/message/aa">发送消息 1</a><br>
<a href="user/message/aa/bb/cc">发送消息 2</a><br>
</body>
</html>

(3) success.jsp 不变。

(4)redeployTomcat,在浏览器地址栏访问:http://localhost:8080/springmvc/request.jsp,分别点击两个超链接,都能成功访问方法,并跳转到success.jsp



5.2.5可配合@PathVariable映射URL绑定的占位符

  1. @RequestMapping 还可以配合 @PathVariable(路径变量) 映射 URL 绑定的占位符
  2. 这样就不需要在url地址栏上带参数名了,更加简洁明了

例子

request.jsp页面如下,其中 kristina 和 300 皆为参数值

<h1>占位符的演示</h1>
<a href="user/reg/kristina/300">占位符的演示</a>

(1)修改UserHandler.java,增加方法,注意@PathVariable("username") 不能少

//...
@RequestMapping(value = "/user")
@Controller
public class UserHandler {
/**
* 我们希望目标方法获取到username和 userid
* 前端页面为:<a href="user/reg/kristina/300">占位符的演示</a>
* 1. value = "/reg/{username}/{userid}"
* 表示 kristina=>{username} ,300=>{userid}
* 2.通过 @PathVariable 将变量赋给对应的形参
*/
@RequestMapping(value = "/reg/{username}/{userid}")
public String register(@PathVariable("username") String name,
@PathVariable("userid") int id) {
System.out.println("接收到的参数--username=" + name + "--userid=" + id);
return "success";
}
}

(2)success.jsp不变

(3)redeployTomcat,访问 http://localhost:8080/springmvc/request.jsp,点击超链接,成功访问到success.jsp,后台输出如下:

5.2.6注意事项和使用细节

  1. 映射的URL不能重复,否则报错:

    Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'userHandler' method
    com.li.web.UserHandler#buy()
    to {POST [/user/buy]}: There is already 'userHandler' bean method
  2. 各种请求的简写形式

    @RequestMapping(value="/buy",method=RequestMethod.POST) 等价于 @PostMapping(value="buy")

    以此类推,还有 @GetMapping@PostMapping@PutMapping@DeleteMapping

  3. 如果我们确定表单或者超链接会提交某个字段数据,比如email,要求提交的参数名和目标方法的参数名保持一致。

    例如:

    /**
    * hello3(String email){} 如果请求参数有email=xx,就会将传递的参数值赋给String email
    * 但是要求名称保持一致!如果不一致,那么接收不到数据,而是null
    * @param email
    * @return
    */
    @GetMapping(value = "/hello3")
    public String hello3(String email) {
    System.out.println("hello3= " + email);
    return "success";
    }

5.2.7练习

编写一个表单,以Post方式提交表单信息,后端编写ComputerHandler,可以接收到表单信息

computer.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hw-电脑信息</title>
</head>
<body>
<h1>电脑信息</h1>
<form action="computer/info" method="post">
品牌:<input type="text" name="brand"/><br/>
价格:<input type="text" name="price"/><br/>
数量:<input type="text" name="nums"/><br/>
<input type="submit" value="提交">
</form>
</body>
</html>

ComputerHandler:

package com.li.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; /**
* @author 李
* @version 1.0
*/
@RequestMapping("/computer")
@Controller
public class ComputerHandler {
//注意接收的参数名要和info方法的形参名一致
@PostMapping("/info")
public String info(String brand, String price, String nums) {
System.out.println("brand=" + brand +
" price=" + price + " nums=" + nums);
return "success";
}
}

redeployTomcat,访问:http://localhost:8080/springmvc/computer.jsp,输入信息,点击提交表单。

后台输出:

5.3Postman接口测试工具

day01-SpringMVC基本介绍-01的更多相关文章

  1. SpringMVC Controller介绍

    SpringMVC Controller 介绍 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理 ...

  2. SpringMVC Controller介绍(转)

    SpringMVC Controller 介绍 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理 ...

  3. vue项目搭建介绍01

    目录 vue项目搭建介绍01 vue 项目框架环境搭建: 创建项目: vue 项目创建流程: vue项目搭建介绍01 vue 项目框架环境搭建: vue 项目框架: vue django(类似)(vu ...

  4. 082 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 01 构造方法-无参构造方法

    082 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 01 构造方法-无参构造方法 本文知识点:构造方法-无参构造方法 说明:因为时间紧张, ...

  5. SpringMVC札集(01)——SpringMVC入门完整详细示例(上)

    自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...

  6. [转]SpringMVC Controller介绍及常用注解

    一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Mo ...

  7. SpringMVC Controller 介绍

    一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Mo ...

  8. SpringMVC 框架介绍以及环境搭建

    目录 前端设计模式介绍 分析前端设计模式 Spring MVC简单介绍 Spring和Spring MVC的关系 配置Spring MVC的环境并简单测试 前端设计模式介绍 前端设计模式其实和前端没啥 ...

  9. SpringMVC Controller介绍及常见注解

    一.简介 在SpringMVC中,控制器Controller负责处理由DispatcherServlet分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model,然后再把该Model返 ...

  10. 【转】SpringMVC Controller 介绍

    转自:原文url 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...

随机推荐

  1. IO多路复用的理解/演变过程

    目录 阻塞IO 非阻塞 IO select epoll 总结一下. 阻塞IO 服务端为了处理客户端的连接和请求的数据,写了如下代码. listenfd = socket(); // 打开一个网络通信端 ...

  2. Dubbo-时间轮设计

    前言 Dubbo源码阅读分享系列文章,欢迎大家关注点赞 SPI实现部分 Dubbo-SPI机制 Dubbo-Adaptive实现原理 Dubbo-Activate实现原理 Dubbo SPI-Wrap ...

  3. windows查看端口和杀掉端口

    //执行下面命令 netstat --help 获取netstat的所有命令参数 //例如查看8080端口占用 netstat -ano | findstr 8080 //查看该端口是什么 taskl ...

  4. Go语言核心36讲44

    今天,我们来讲另一个与I/O操作强相关的代码包bufio.bufio是"buffered I/O"的缩写.顾名思义,这个代码包中的程序实体实现的I/O操作都内置了缓冲区. bufi ...

  5. Ian Lance Taylor

    https://img.mukewang.com/5a9dfda50001933e23006728.png 在GCC的世界中,没有人比Ian更火.在GCC maillist中,Ian的身影呈现在前端中 ...

  6. JUC学习笔记——并发工具线程池

    JUC学习笔记--并发工具线程池 在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的并发工具线程池 我们会分为以下几部分进行介绍: 线程池介绍 自定义线程池 模式之Worker Thr ...

  7. C++ using 编译指令与名称冲突

    using 编译指令:它由名称空间名和它前面的关键字 using namespace 组成,它使名称空间中的所有名称都可用,而不需要使用作用域解析运算符.在全局声明区域中使用 using 编译指令,将 ...

  8. UBOOT编译--- UBOOT编译过程目标依赖分析(八)

    1. 前言 UBOOT版本:uboot2018.03,开发板myimx8mmek240. 2. 概述 本文采用自顶向下的方法,从顶层目标开始到最原始的依赖. 3. u-boot编译 uboot的编译分 ...

  9. ubuntu 22.04安装多个gcc

    sudo apt install gcc-9 g++-9 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 - ...

  10. 《吐血整理》高级系列教程-吃透Fiddler抓包教程(35)-Fiddler如何抓取微信小程序的包-下篇

    1.简介 通过前边和宏哥的学习,我们了解到Android 7.0 之后增加了对第三方证书的限制,抓包工具(charles.fiddler等)提供的证书都无法通过校验,也就无法抓取HTTPS请求了,对测 ...