SpringMVC (三) RestFul和控制器

news2024/11/17 15:34:57

学习回顾:SpringMVC (一) 什么是SpringMVC

现在我们来看看里面的控制器和路径请求的具体内容吧!

一、控制器Controller

  • 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现。
  • 控制器负责解析用户的请求并将其转换为一个模型。
  • 在Spring MVC中一个控制器类可以包含多个方法
  • 在Spring MVC中,对于Controller的配置方式有很多种

二、实现Controller接口

Controller是一个接口,在org.springframework.web.servlet.mvc包下,接口中只有一个方法;

//实现该接口的类获得控制器功能
public interface Controller {
   //处理请求且返回一个模型与视图对象
   ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
}

测试
1.新建一个Moudle,springmvc-04-controller 。将刚才的03 拷贝一份, 我们进行操作!

  • 删掉HelloController
  • mvc的配置文件只留下 视图解析器!
    2.编写一个Controller类,ControllerTest1
//定义控制器
//注意点:不要导错包,实现Controller接口,重写方法;
public class ControllerTest1 implements Controller {

   public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
       //返回一个模型视图对象
       ModelAndView mv = new ModelAndView();
       mv.addObject("msg","Test1Controller");
       mv.setViewName("test");
       return mv;
  }
}

3.编写完毕后,去Spring配置文件中注册请求的bean;name对应请求路径,class对应处理请求的类

<bean name="/t1" class="com.tang.controller.ControllerTest1"/>

4.编写前端test.jsp,注意在WEB-INF/jsp目录下编写,对应我们的视图解析器

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>xiaotang</title>
</head>
<body>
${msg}
</body>
</html>

5.配置Tomcat运行测试,我这里没有项目发布名配置的就是一个 / ,所以请求不用加项目名,OK!
在这里插入图片描述
说明:

  • 实现接口Controller定义控制器是较老的办法
  • 缺点是:一个控制器中只有一个方法,如果要多个方法则需要定义多个Controller;定义的方式比较麻烦;

三、使用注解@Controller

  • @Controller注解类型用于声明Spring类的实例是一个控制器(在讲IOC时还提到了另外3个注解);
  • Spring可以使用扫描机制来找到应用程序中所有基于注解的控制器类,为了保证Spring能找到你的控制器,需要在配置文件中声明组件扫描。
<!-- 自动扫描指定的包,下面所有注解类交给IOC容器管理 -->
<context:component-scan base-package="com.tang.controller"/>
  • 增加一个ControllerTest2类,使用注解实现;
//@Controller注解的类会自动添加到Spring上下文中
@Controller
public class ControllerTest2{

   //映射访问路径
   @RequestMapping("/t2")
   public String index(Model model){
       //Spring MVC会自动实例化一个Model对象用于向视图中传值
       model.addAttribute("msg", "ControllerTest2");
       //返回视图位置
       return "test";
  }

}
  • 运行tomcat测试
    在这里插入图片描述
    可以发现,我们的两个请求都可以指向一个视图,但是页面结果的结果是不一样的,从这里可以看出视图是被复用的,而控制器与视图之间是弱偶合关系。

注解方式是平时使用的最多的方式!

四、RequestMapping

@RequestMapping

  • @RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
  • 为了测试结论更加准确,我们可以加上一个项目名测试 myweb
  • 只注解在方法上面
@Controller
public class TestController {
  @RequestMapping("/h1")
  public String test(){
      return "test";
 }
}

访问路径:http://localhost:8080 / 项目名 / h1

  • 同时注解类与方法
@Controller
@RequestMapping("/admin")
public class TestController {
  @RequestMapping("/h1")
  public String test(){
      return "test";
 }
}

访问路径:http://localhost:8080 / 项目名/ admin /h1 , 需要先指定类的路径再指定方法的路径;

五、RestFul 风格

概念

  • Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
    功能
  • 资源:互联网所有的事物都可以被抽象为资源
  • 资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。
  • 分别对应 添加、 删除、修改、查询。

传统方式操作资源 :通过不同的参数来实现不同的效果!方法单一,post 和 get

  •  http://127.0.0.1/item/queryItem.action?id=1 查询,GET
    
  •  http://127.0.0.1/item/saveItem.action 新增,POST
    
  •  http://127.0.0.1/item/updateItem.action 更新,POST
    
  •  http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST
    

使用RESTful操作资源 :可以通过不同的请求方式来实现不同的效果!如下:请求地址一样,但是功能可以不同!

  • http://127.0.0.1/item/1 查询,GET
    
  • http://127.0.0.1/item 新增,POST
    
  • http://127.0.0.1/item 更新,PUT
    
  • http://127.0.0.1/item/1 删除,DELETE
    

学习测试
1.在新建一个类 RestFulController

@Controller
public class RestFulController {
}

2.在Spring MVC中可以使用 @PathVariable 注解,让方法参数的值对应绑定到一个URI模板变量上。

@Controller
public class RestFulController {

   //映射访问路径
   @RequestMapping("/commit/{p1}/{p2}")
   public String index(@PathVariable int p1, @PathVariable int p2, Model model){
       
       int result = p1+p2;
       //Spring MVC会自动实例化一个Model对象用于向视图中传值
       model.addAttribute("msg", "结果:"+result);
       //返回视图位置
       return "test";
       
  }
   
}

3.我们来测试请求查看下
在这里插入图片描述

4.思考:使用路径变量的好处?

  • 使路径变得更加简洁;
  • 获得参数更加方便,框架会自动进行类型转换。
  • 通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法,如这里访问是的路径是/commit/1/a,则路径与方法不匹配,而不会是参数转换失败。
    在这里插入图片描述

我们来修改下对应的参数类型,再次测试

//映射访问路径
@RequestMapping("/commit/{p1}/{p2}")
public String index(@PathVariable int p1, @PathVariable String p2, Model model){

   String result = p1+p2;
   //Spring MVC会自动实例化一个Model对象用于向视图中传值
   model.addAttribute("msg", "结果:"+result);
   //返回视图位置
   return "test";

}

在这里插入图片描述

使用method属性指定请求类型

用于约束请求的类型,可以收窄请求范围。指定请求谓词的类型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等

我们来测试一下:

  • 增加一个方法
//映射访问路径,必须是POST请求
@RequestMapping(value = "/hello",method = {RequestMethod.POST})
public String index2(Model model){
  model.addAttribute("msg", "hello!");
  return "test";
}
  • 我们使用浏览器地址栏进行访问默认是Get请求,会报错405:
    在这里插入图片描述
  • 如果将POST修改为GET则正常了;
//映射访问路径,必须是Get请求
@RequestMapping(value = "/hello",method = {RequestMethod.GET})
public String index2(Model model){
  model.addAttribute("msg", "hello!");
  return "test";
}

在这里插入图片描述

小结:

Spring MVC 的 @RequestMapping 注解能够处理 HTTP 请求的方法, 比如 GET, PUT, POST, DELETE 以及 PATCH。

所有的地址栏请求默认都会是 HTTP GET 类型的。

方法级别的注解变体有如下几个:组合注解

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

@GetMapping 是一个组合注解,平时使用的会比较多!

它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一个快捷方式。

六、扩展:小黄鸭调试法

场景一:我们都有过向别人(甚至可能向完全不会编程的人)提问及解释编程问题的经历,但是很多时候就在我们解释的过程中自己却想到了问题的解决方案,然后对方却一脸茫然。

场景二:你的同行跑来问你一个问题,但是当他自己把问题说完,或说到一半的时候就想出答案走了,留下一脸茫然的你。

其实上面两种场景现象就是所谓的小黄鸭调试法(Rubber Duck Debuging),又称橡皮鸭调试法,它是我们软件工程中最常使用调试方法之一。

在这里插入图片描述

此概念据说来自《程序员修炼之道》书中的一个故事,传说程序大师随身携带一只小黄鸭,在调试代码的时候会在桌上放上这只小黄鸭,然后详细地向鸭子解释每行代码,然后很快就将问题定位修复了。

下面我们准备研究下参数接受和结果跳转!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/711576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在Centos7下安装Nginx

一、Nginx简介 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 &#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;公开版本1.19.6…

Self-attention Transformer

参考资料&#xff1a; 《机器学习》李宏毅 1 Self-attention 当模型输入为长度不定的向量序列时&#xff08;如一段文字、一段语音、图模型&#xff09;&#xff0c;要求模型输出为等长的向量序列&#xff08;序列标注&#xff09;时&#xff0c;可以使用 Self-attention S…

文件的概念 + 文件的相对/绝对路径 + 文件IO字符流 / 字节流的读写操作 (java)

文章目录 前言一、文件是什么1.文件的概念2.文件路径1.绝对路径2.相对路径 二、针对文件的IO1.File类2.对文件内容的读写操作1.针对文本文件—— 字符流输入流 Reader类输出流 Writer类 2.针对二进制文件—— 字节流输入流 InputStream类输出流 OutputStream类 总结 前言 本人…

《Reinforcement Learning: An Introduction》第7章笔记

Chapter 7 n-step Bootstrapping 本章的n-step TD方法是前两章的Monte Carlo 方法和one-step TD方法的推广。它使自举法在多个时间步内进行&#xff0c;解决了前两章中的更新时间步不灵活的问题。 7.1 n-step TD Prediction 在用策略 π \pi π下生成的采样回合序列来估计 v…

UE5 MetaHuman SDK插件的使用【一、编辑器创建音波与蓝图创建获取音波,音波与嘴唇的同步】

目录 打开插件 创建音频 编辑器这直接创建音频&#xff1a; 蓝图中创建和获取音频&#xff1a; 唇语&#xff1a; 声音与嘴唇同步&#xff1a; 方法一【效果不是很好】&#xff1a; 方法二【效果很好&#xff0c;但有一段时间延迟在处理】&#xff1a; 逻辑&#xff1…

Spring Boot 中的微服务架构:原理和使用

Spring Boot 中的微服务架构&#xff1a;原理和使用 什么是微服务架构&#xff1f; 微服务架构是一种软件架构模式&#xff0c;它将一个应用程序分解成一组小的、松散耦合的服务。每个服务都有独立的进程和数据存储&#xff0c;可以独立地开发、部署、测试和扩展。这种架构模…

最新AI创作系统ChatGPT网站源码+新增GPT联网功能+支持GPT4+支持ai绘画+实时语音识别输入

最新AI创作系统ChatGPT网站源码新增GPT联网功能支持GPT4支持ai绘画实时语音识别输入 一、AI创作系统二、系统介绍三、系统程序下载四、安装教程五、其他主要功能展示六、更新日志 一、AI创作系统 提问&#xff1a;程序已经支持GPT3.5、GPT4.0接口、支持新建会话&#xff0c;上…

常见面试题之ThreadLocal的理解

1. ThreadLocal概述 ThreadLocal是多线程中对于解决线程安全的一个操作类&#xff0c;它会为每个线程都分配一个独立的线程副本从而解决了变量并发访问冲突的问题。ThreadLocal同时实现了线程内的资源共享 案例&#xff1a;使用JDBC操作数据库时&#xff0c;会将每一个线程的…

常微分方程的解题思路

通解&#xff1a;独立常数的个数等于微分方程的阶数&#xff0c;独立常数的个数实际上就是 c 1 , c 2 , . . . , c n c_1,c_2,...,c_n c1​,c2​,...,cn​是数目 所以补 C C C也是关键的一步&#xff0c;而且未必是 C C C&#xff0c;也可以是 ln ⁡ C \ln C lnC之类的&…

HPM6750系列--第六篇 创建自己的工程

一、目的 细心的朋友可能会发现官方提供了HPM-Sdk仓库&#xff0c;示例代码都是作为一个文件夹的形式放在此仓库下&#xff0c;我们之前都是直接拷贝里面的工程进行演示。 下面我们就具体来分析一下hello_world工程的文件组成&#xff0c;这样我们就可以创建自己的工程。 二、…

vscode里vue文件内<template>标签报错

发现只要把文件名使用驼峰命名法&#xff0c;把Login.vue改为LoginView.vue就不报错了加个大写的View就没有了。 官方参考文档&#xff1a;vue/multi-word-component-names | eslint-plugin-vue

说说@EnableConfigurationProperties那点事

两者的对比 ConfigurationProperties 使用ConfigurationProperties的时候&#xff0c;把配置类的属性与yml配置文件绑定起来的时候&#xff0c;还需要加上Component注解才能绑定并注入IOC容器中&#xff0c;若不加上Component&#xff0c;则会无效。 EnableConfigurationPro…

Mybatis 入门及实践

Mybatis 入门及实践 文章目录 Mybatis 入门及实践前言一. 简介二. 入手案例2.1 前置准备2.1.1 Maven依赖2.1.2 sql准备2.1.3 Log4j2 配置1. Maven引入2. log4j2.xml 2.2 代码流程构建步骤2.2.1 Mybatis前置知识2.2.2 步骤流程2.2.3 代码实现 三. XML映射器前置代码3.1 select3.…

【网络编程】网络编程套接字(一)

文章目录 网络编程预备知识认识端口号理解源端口号和目的端口号认识TCP协议和UDP协议网络字节序sockaddr结构1.socket 常见API2.sockaddr结构 网络编程预备知识 认识端口号 端口号(port)是传输层协议的内容. 端口号是一个2字节16位的整数; 端口号用来标识一个进程, 告诉操作系…

Linux :LNMP(源码包安装)

Linux 虚拟机 VMware&#xff1a;安装centos7_鲍海超-GNUBHCkalitarro的博客-CSDN博客 物理机 linux&#xff1a;真机安装centos linux&#xff08;突发事件&#xff1a;解决卡在安装界面&#xff09;{寻找镜像--u启制作--引导u盘--解决卡在安装界面--安装配置}_安装centos7卡…

Linux--文件/目录权限

看懂权限&#xff1a; 拥有者&#xff1a;文件属于谁 所属组&#xff1a;文件属于哪个组 other:不属于上面两种的任何一个&#xff0c;就是other 图示&#xff1a; 分析&#xff1a; ①第一列&#xff1a; d:目录 -:普通文件 p:管道文件 b:块设备 c:字符设备 l:链接…

数学建模概论

1、从现实对象到数学模型 我们常见的模型 玩具、照片......~实物模型水箱中的舰艇、风洞中的飞机......~物理模型地图、电路图、分子结构图......~符号模型 模型是为了一定目的&#xff0c;对客观事物的一部分进行简缩、抽象、提炼出来的原型的替代物&#xff0c;集中反映了原型…

【C++1】函数重载,类和对象,引用,string类,vector容器,类继承和多态,/socket

文章目录 1.函数重载&#xff1a;writetofile()&#xff0c;Ctrue和false&#xff0c;C0和非02.类和对象&#xff1a;vprintf2.1 构造函数&#xff1a;对成员变量初始化2.2 析构函数&#xff1a;一个类只有一个&#xff0c;不允许被重载 3.引用&#xff1a;C中&取地址&…

沁恒CH32V307VCT6最小系统板/开发板开源

沁恒CH32V307VCT6最小系统板&#xff0c;引出了所有IO口&#xff0c;一个Type-C连接到USB2.0全速OTG接口&#xff0c;一个Flash芯片 型号W25Q64 容量64Mbit 连接到SPI2接口&#xff0c;板上还有TL432电压基准1.25V(实测1.246V左右)可通过跳线连接到PC3的AD13&#xff0c;还有3.…

【c++】并行编程:cuda入门

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍cuda入门。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#x1f95e…