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. python枚举类型 Enum

    在python中枚举是一种类(Enum) 枚举类中不能存在相同的标签名 枚举是可迭代的 例: from enum import Enum class Vip(Enum): MONDAY = 0 TUE ...

  2. SpringBoot启动流程源码分析

    前言 SpringBoot项目的启动流程是很多面试官面试中高级Java程序员喜欢问的问题.这个问题的答案涉及到了SpringBoot工程中的源码,也许我们之前看过别的大牛写过的有关SpringBoot ...

  3. 2022-11-13 Acwing每日一题

    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我会认真改正的.同时也希望 ...

  4. 2022-11-01 Acwing每日一题

    第k个数 给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数. 输入格式 第一行包含两个整数 n 和 k. 第二行包含 n 个整数(所有整数均在 1 ...

  5. Go语言核心36讲41

    你好,我是郝林,今天我们继续分享bytes包与字节串操作的相关内容. 在上一篇文章中,我们分享了bytes.Buffer中已读计数的大致功用,并围绕着这个问题做了解析,下面我们来进行相关的知识扩展. ...

  6. 北极星Polaris+Gateway动态网关配置!

    springcloudtencetn 父工程: pom <?xml version="1.0" encoding="UTF-8"?> <pro ...

  7. c++详细学习——继承

    通常讲父类(parrent)-子类(child).基类(base)-派生类(derived)和超类(super)-子类(sub) 1 最基础的写法 以下例子为最基本的写法,默认构造 1 enum Ge ...

  8. nginx配置文件单独创建和管理

    在nginx主配置文件nginx.conf的http模块下引入配置文件夹(注意路径的正确性) 1.nginx主配置文件备份后编辑(nginx配置存放位置:/usr/local/nginx/conf/) ...

  9. Idea中Git的常用操作及可能存在的问题

    一.使用 1.从git上下载项目 (1)默认branch下载(pull) (2)指定branch下载 (3)克隆远程仓库到本地(git clone) git clone https://github. ...

  10. 【Shell脚本案例】案例3:批量创建100个用户并设置密码

    一.背景 新入职员工创建用户 二.常规操作 useradd zhangsan ls /home/ password zhangsan 三.考虑问题 1.实现自动输入密码,将其存到文件中 passwor ...