SpringMVC(基于 Spring 的 Web 层MVC 框架)入门+@RequestMapping

目录

一.基本介绍 

1.SpringMVC 特点&概述

2.梳理 Spring SpringMVC SpringBoot 的关系

二.SpringMVC-快速入门

1.需求说明/图解

2.SpringMVC 登录流程分析 

3.SpringMVC 登录-代码实现

3.1配置前端控制器

3.2网页页面 login.jsp

3.3写UserServlet.java

3.4配置applicationContext-mvc.xml(配置视图解析器)

3.5login_ok.jsp

3.6案例总结

3.7注意事项和细节说明

三.SpingMVC 执行流程

1.一图胜千言​编辑

四.@RequestMapping

1.基本使用

2.@RequestMapping 注解其它使用方式

 2.1@RequestMapping 可以修饰方法和类

2.2@RequestMapping 可以指定请求方式

2.3@RequestMapping 可指定 params 和 headers 支持简单表达式

2.4@RequestMapping 支持 Ant 风格资源地址

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

2.6 注意事项和使用细节

一.基本介绍 

1.SpringMVC 特点&概述

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

2. SpringMVC WEB 层框架【老韩解读 : SpringMVC 接管了 Web 层组件 , 比如控制器 ,
, 视图解析 , 返回给用户的数据格式 , 同时支持 MVC 的开发模式 / 开发架构】
3. SpringMVC 通过注解,让 POJO 成为控制器,不需要继承类或者实现接口
4. SpringMVC 采用低耦合的组件设计方式,具有更好扩展和灵活性 .
5. 支持 REST 格式的 URL 请求 .
6. SpringMVC 是基于 Spring , 也就是 SpringMVC 是在 Spring 基础上的。 SpringMVC 的核
心包 spring-webmvc-xx.jar spring-web-xx.jar

2.梳理 Spring SpringMVC SpringBoot 的关系

1. Spring MVC 只是 Spring 处理 WEB 层请求的一个模块 / 组件 , Spring MVC 的基石是 Servlet[Java WEB]
2. Spring Boot 是为了简化开发者的使用 , 推出的封神框架 ( 约定优于配置,简化了 Spring 的配置流程 ), SpringBoot 包含很多组件 / 框架, Spring 就是最核心的内容之一,也包含 Spring
MVC
3. 他们的关系大概是 : Spring Boot > Spring > Spring MVC

二.SpringMVC-快速入门

1.需求说明/图解

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

2.SpringMVC 登录流程分析 

3.SpringMVC 登录-代码实现

1. 创建 springmvc web 工程并配置 tomcat, 前面我们学习过
2. 导入 SpringMVC 开发需要的 jar

3.1配置前端控制器

<!--    配置前端控制器/中央控制器/分发控制器
1.用户的应用请求都会经过它的处理

-->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        
<!--        配置属性 : 指定DispatcherServlet去操作的spring配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext-mvc.xml</param-value>
        </init-param>
<!--        在web项目启动时,就自动加载DispatcherServlet对象-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
<!--        这里我们配置的url-pattern表示用户的请求都经过DispatcherServlet处理-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

3.2网页页面 login.jsp

<%--
  User:海绵hong
  Date: 2022/10/25
  Time: 18:55
  
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<h1>登录页面</h1>
<form action="login">
  u: <input name="name" type="text">
  p: <input name="pwd" type="password">
  <input type="submit"value="登录">
</form>

</body>
</html>

3.3写UserServlet.java

package com.hong;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author 海绵hong
 * @version 1.0
 * 说明
 * 1. 如果我们使用了SpringMVC, 在一个类上标识@Controller
 * 2. 表示将该类视为一个控制器,注入到容器
 * 3. 比原生servlet开发要简化很多
 */
@Controller
public class UserServlet {


    //编写方法,响应用户的请求

    /**
     * 解读
     * 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
     */
    @RequestMapping(value = "/login")
    public String login() {

        System.out.println("login ok.......");
        return "login_ok";
    }
}

3.4配置applicationContext-mvc.xml(配置视图解析器)

<!--    配置自动扫描包-->
<context:component-scan base-package="com.hong.web"/>
    <!--配置视图解析器[默认视图解析器]-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--配置属性suffix 和 prefix-->
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
        <!--调整优先级-->
        <property name="order" value="10"/>
    </bean>

3.5login_ok.jsp

<%--
  User:海绵hong
  Date: 2022/10/25
  Time: 19:11
  
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>成功</title>
</head>
<body>
<h1>恭喜你!登录成功!!</h1>
</body>
</html>

3.6案例总结

首先我们去配置中央处理器DispatcherServlet,所有的应用请求都要经过它的处理,并且要在其中配置指定DispatcherServlet去操作的spring配置文件,然后写一个jsp网页代码。接下来便是重中之重了,创建一个Java类,同时写上注解让spring读取。在这个类中调用@RequestMapping(value = "/login")注解,@RequestMapping(value = "/login") 类似我们以前在原生的Servlet 配置 url-pattern, 就是给方法配置一个url映射。即当用户在浏览器输入 http://localhost:8080/web工程路径/login 就能够访问到login()。再就是扫描这个类,并配置视图解析器

     *     <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。

3.7注意事项和细节说明

1. 重点学习如何搭建一个 springmvc 项目,初步理解 springmvc 工作流程
2. 这里的 UserServlet 需要注解成 @Controller ,我们称为一个 Handler 处理器
3. UserServlet 指定 url 时,还可以这样

4. 关 于 SpringMVC DispatcherServlet 的 配 置 文 件 , 如 果 不 在 web.xml 指 定
applicationContext-mvc.xml, 默认在 /WEB-INF/springDispatcherServlet-servlet.xml 找这
个配置文件【简单看下 DispatcherServlet 的源码】。 ( 推荐使用 , 我们做下修改 , 并完成测
试)

 1) 修改 web.xml, 注销 init-param 配置节点

2) 剪 切 原 applicationContext-mvc.xml /WEB-INF 目 录 下 , 文 件 名 为 : 你 配 置 的
DispatcherSerlvet -servlet.xml

三.SpingMVC 执行流程

1.一图胜千言

浏览器发出请求到前端控制器,在由前端控制器调用处理器映射器,处理器映射器根据浏览器发出的请求去分析,返回处理器执行链(对象:拦截器和目标Handler[@Controller]),接下来调用处理器适配器去调用真正的目标Handler(也就是Controller),接下来就是去调用service,再由service调用Dao,Dao去操作数据库,然后再将数据(ModelAndView)返回去,,继续将ModelAndView返回给前端控制器。而前端控制器会去调用视图解析器去解析ModelAndView,会返回一个视图(View以对象的形式)给前端控制器。再由前端服务器会进行视图的渲染,即将Model中的数据填充到View,最后再将这个结果返回给浏览器。

四.@RequestMapping

1.基本使用

@RequestMapping 注解可以指定控制器 / 处理器的某个方法的请求的 url, 基本用法前面我
们讲过了 , RequestMapping : 请求映射

2.@RequestMapping 注解其它使用方式

 2.1@RequestMapping 可以修饰方法和类

1. 说明 : @RequestMapping 注解可以修饰方法,还可以修饰类 当同时修饰类和方法时,
请求的 url 就是组合 / 类请求值 / 方法请求值
@RequestMapping(value = "/user")
@Controller
public class UserHandler {
    /**
     * 解读
     * 1. method=RequestMethod.POST: 表示请求 buy 目标方法必须是 post
     * 2. RequestMethod 四个选项 POST, GET, PUT, DELETE
     * 3. SpringMVC 控制器默认支持 GET 和 POST 两种方式
     * @return
     */
    @RequestMapping(value = "/buy",method = RequestMethod.GET)
    public String buy() {
        System.out.println("购买商品");
        return "success";
    }
}

这个Java类文件是关键,其他的就不写了,在这个类中可以看出来一个jsp文件调用user/buy方法,放回的时候会直接跳转到success.jsp页面中(之前配的springDispatcherServlet-servlet.xml文件)

2.2@RequestMapping 可以指定请求方式

1. 说明 : @RequestMapping 还可以指定请求的方式 (post/get/put/delete..), 请求的方式需
要和指定的一样,否则报错
2. SpringMVC 控制器默认支持 GET POST 两种方式 , 也就是你不指定 method , 可以接收
GET POST 请求
3. 应用实例

4. 当明确指定了 method , 则需要按指定方式请求 , 否则会报错 , 比如405

2.3@RequestMapping 可指定 params headers 支持简单表达式

1. param1: 表示请求必须包含名为 param1 的请求参数
2. !=param1: 表示请求不能包含名为 param1 的请求参数
3. param1 != value1: 表示请求包含名为 param1 的请求参数,但其值不能为 value1
4. {"param1=value1", "param2"}: 请求必须包含名为 param1 param2 的两个请求参数,
param1 参数的值必须为 value1
5. 应用实例
1) 修改 UserHandler.java , 增加方法
    /**
     * 解读
     * 1. params="bookId" 表示请求该目标方法时,必须给一个bookId参数, 值没有限定
     * 2. search(String bookId): 表示请求目标方法时, 携带的bookId=100, 就会将请求携带的 bookId对应的
     * 值 100, 赋给 String bookId
     * 3. params = "bookId=100" 表示必须给一个bookId参数, 而且值必须是100
     *
     * @return
     */
    @RequestMapping(value = "/find", params = "bookId=100", method = RequestMethod.GET)
    public String search(String bookId) {
        System.out.println("查询书籍 bookId= " + bookId);
        return "success";
    }
6. 小的细节说明和测试
1) 需要有 bookId 参数,并且值为 100, 否则报错
@RequestMapping(value = "/find", params = "bookId=100", method = RequestMethod.GET)
2) 需要有 bookId 参数,并且值不为 100, 否则报错
@RequestMapping(value = "/find", params = "bookId!=100", method = RequestMethod.GET)

2.4@RequestMapping 支持 Ant 风格资源地址

1. ? :匹配文件名中的一个字符
2. * :匹配文件名中的任意字符
3. **: 匹配0-多层路径
4. Ant 风格的 url 地址举例
/user/*/createUser: 匹配 /user/aaa/createUser /user/bbb/createUser URL
/user/**/createUser: 匹配 /user/createUser /user/aaa/bbb/createUser URL
/user/createUser??: 匹配 /user/createUseraa /user/createUserbb URL

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

1. @RequestMapping 还可以配合 @PathVariable 映射 URL 绑定的占位符。
2. 这样就不需要在 url 地址上带参数名了,更加的简洁明了
  //要求: 我们希望目标方法获取到 username 和 userid, value="/xx/{username}" - @PathVariable("username")..
    //前端页面: <a href="user/reg/kristina/300">占位符的演示</a>
    //(value = "/reg/{username}/{userid}"): 表示kristina->{username} 300=>{userid}
    @RequestMapping(value = "/reg/{username}/{userid}")
    public String register(@PathVariable("username") String name,
                           @PathVariable("userid") String id) {
        System.out.println("接收到参数--" + "username= " + name + "--" + "usreid= " + id);
        return "success";
    }

2.6 注意事项和使用细节

1. 映射的 URL, 不能重复
2. 各种请求的简写形式
说明
@RequestMapping (value = "/buy" ,method = RequestMethod . POST )
等 价
@PostMapping (value = "/buy")
简写方式一览 :
@GetMapping @PostMapping @PutMapping @DeleteMapping
3. 如果我们确定表单或者超链接会提交某个字段数据比如 (email), 要求提交的参数名和目
标方法的参数名保持一致 .
@GetMapping(value = "/hello3")
public String hello3(String email) {
System.out.println("hello3 " + email);
return "success";
}

hello3(String email): 如果我们的请求参数有 email=xx, 就会将传递的值,赋给String email,要求名称保持一致, 如果不一致,那么接收不到数据, 而是null

就是我们在浏览器输入地址的时候如果在之后会输入email,如果和参数名一样,那么就会将这个值传入到这个参数

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海绵hong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值