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. AK/SK加密认证

    AK/SK认证的实现 AK/SK概述 1.什么是AKSK ak/sk是一种身份认证方式,常用于系统间接口调用时的身份验证,其中ak为Access Key ID,sk为Secret Access Key ...

  2. mindxdl--common--head_handler.go

    // Copyright (c) 2021. Huawei Technologies Co., Ltd. All rights reserved.// Package common the commo ...

  3. php变量规范命名用了记得消除,保证唯一性

    PHP中的命名规则 类的命名  在为类(class )命名前首先要知道它是什么.如果通过类名的提供的线索,还是想不起这个类是什么的话,那么就说明设计存在问题. 超过三个词组成的混合名是容易造成系统各个 ...

  4. centos7内核升级记录

    1. 挂载centos7.9最终版镜像,执行升级执行:yum update 2. 重启服务器系统:init 6 3. 查看当前内核版本:uname -r 4. 查看历史内核,并卸载没用的:rpm -q ...

  5. Gorm源码学习-数据库连接

    1 前言 gorm源码地址: Gorm , 本文基于commit:cef3de694d9615c574e82dfa0b50fc7ea2816f3e 官方入门指南: Dosc 2 连接数据库代码示例 目 ...

  6. vim快捷键及命令大全

    定位光标: G 将光标定位到文本末尾行首 gg 将光标定位到文本启始位置 0 (这个是零)定位到光标所在行行首 $ 定位到光标所在行行尾 数字G 跳转到第n行 移动光标: h 向左移动 l 向右移动 ...

  7. Python异步协程(asyncio详解)

    续上篇讲解yield from博客,上篇链接:https://www.cnblogs.com/Red-Sun/p/16889182.html PS:本博客是个人笔记分享,不需要扫码加群或必须关注什么的 ...

  8. Spring Boot+Mybatis:实现数据库登录注册与两种properties配置参数读取

    〇.参考资料 1.hutool介绍 https://blog.csdn.net/abst122/article/details/124091375 2.Spring Boot+Mybatis实现登录注 ...

  9. 【每日一题】2021年12月14日-82. 删除排序链表中的重复元素 II

    存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字. 返回同样按升序排列的结果链表. 来源:力扣(LeetCo ...

  10. sql周报

    数据库分类 1.关系型数据库 Mysql Qracle MariaDB PostgreSQL mysql:开源免费 使用最广 性价比最高 Oracle:收费 但安全性高 PostgreSQL:开源免费 ...