首页 > 其他分享 >SpringMVC-03-RestFul和Controller

SpringMVC-03-RestFul和Controller

时间:2024-07-08 17:20:16浏览次数:21  
标签:03 http RequestMapping SpringMVC springframework Controller import org

1、Controller

  • MVC架构中的控制层,在SpringMVC中,由 Handler 组成
  • 负责提供访问应用程序的行为:处理用户的请求并调用 Model层 将其转换为一个模型数据跳向 View层
  • 在Spring MVC中,对于Controller的配置方式有很多种,通常可以通过接口定义注解定义两种方法实现

新建一个子项目,SpringMVC-04-Controller,搭建好项目

image-20240704205239220

  • spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
">
    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    
</beans>
  • web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>
  • test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>test</title>
</head>
<body>
${msg}
</body>
</html>

1.1、实现Controller接口

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

// 实现该接口的类获得Controller功能
public interface Controller {
   // 处理请求且返回一个 ModelAndView 对象
   ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}

新建 ControllerTest 类,实现 Controller 接口

package com.moondream.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ControllerTest implements Controller {
    
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", "ControllerTest");
        mv.setViewName("/test");

        return mv;
    }
}

将 ControllerTest 注册到 SpringIOC 中,id对应请求路径,class对应处理请求的类

<bean id="/t1" class="com.moondream.controller.ControllerTest"/>

启动Tomcat,测试访问路径:http://localhost:8080/spring04/t1

image-20240704211952685

测试成功!

注意:

  • 实现接口Controller定义 Handler 是较老的办法;
  • 缺点:一个类中只有一个请求处理方法,如果要多个Handler则需要定义多个类;定义的方式比较麻烦。

1.2、使用注解@Controller和@RequestMapping

@Controller

  • 用于声明被标注的类属于 Controller层
  • 模板注解,被标注的类会被 component-scan 扫描到

@RequestMapping

  • 用于声明被标注的方法属于 HandlerMethod(注解方式中的Handler)
  • 当它被标注在一个类上时,相当于类下的 HandlerMethod 的前置要求
  • 只有在 被@Controller标注的类 中才会生效

新建 ControllerTest2 类 和 ControllerTest3 类,标上注解

package com.moondream.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ControllerTest2 {

    @RequestMapping("/t2")
    public String test(Model model) {

        model.addAttribute("msg", "ControllerTest2");
        return "test";
    }

}
package com.moondream.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/t3")
public class ControllerTest3 {

    @RequestMapping("/test")
    public String test(Model model) {

        model.addAttribute("msg", "ControllerTest3");
        return "test";
    }

}

将 ControllerTest2、ControllerTest3 注册到 SpringIOC中,这里可以使用两种方式

  • 组件扫描
<context:component-scan base-package="com.moondream.controller"/>

或者

  • 手动注册
<bean class="com.moondream.controller.ControllerTest2"/>
<bean class="com.moondream.controller.ControllerTest3"/>

启动Tomcat,测试访问路径:

http://localhost:8080/spring04/t2

image-20240704221731100

http://localhost:8080/spring04/t3/test

image-20240704223842809

测试成功!

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

2、RestFul

2.1、什么是REST ?(一种软件架构风格)

缩写:REST (不是"rest"这个单词)
外文名:Representational State Transfer,简称REST。
中文名:表现层状态转移。
提出时间:2000年。
属性:一种软件架构风格。(以Web为平台的,web服务的架构风格,前后端接口时候用到。)

REST之所以晦涩难懂,是因为前面主语(Resource )被去掉了。
全称是: Resource Representational State Transfer。
通俗来讲就是:资源在网络中以某种表现形式进行状态转移。

分解开来讲解:
Resource:资源,即数据(这是网络的核心);
Representational:某种表现形式,比如用JSON,XML,JPEG等;
State Transfer:状态变化。通过HTTP的动词(get查询、post新增、put修改、delete删除)实现。

一句话描述REST实质:
只使用名词URL来定位资源,用HTTP协议里的动词(GET、POST、PUT、DELETE)来实现资源的增删改查操作。

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

REST风格操作资源 :参数设计进URL路径,增强语义,实现统一接口,URL表示资源位置,请求方式表示行为,实现不同的效果!如下:请求地址一样,但是功能可以不同!

总结:
看Url就知道要什么
看http method就知道干什么
看http status code就知道结果如何

2.2、什么是RESTFUL ?

从上面的定义中,我们可以发现REST其实是一种组织Web服务的架构风格,
并不是实现Web服务的一种技术(注意:不是一种技术!!!也不是一种标准!!!),
其目标是为了创建具有良好扩展性的网络化分布式系统。

反过来,作为一种风格,其具备了一系列架构级特点。这些特点有:

  1. 统一接口(Uniform Interface):强调使用统一的接口来处理资源,通过 HTTP 方法对资源进行操作(GET 用于获取资源、POST 用于创建资源、PUT 用于更新资源、DELETE 用于删除资源),使得客户端和服务器之间的通信更加简单和统一。
  2. 无状态性(Stateless):服务端不会保存有关客户的任何状态,也就是说,客户端自身负责用户状态的维持,并在每次发送请求时都需要提供足够的信息。这样可以提高系统的可伸缩性和性能,同时降低了服务器端的维护成本。
  3. 可缓存(Cacheable):支持缓存机制,客户端可以缓存服务器返回的资源,以尽量减少服务端和客户端之间的信息传输,在一定条件下可以直接使用缓存减轻服务器的压力,降低网络延迟。
  4. 层次化系统(Layered System):支持客户端和服务器之间的解耦,允许通过添加代理服务器或者缓存改进性能、安全性等方面,客户端并不会固定地与一个服务器打交道。
  5. 自描述消息(Self-descriptive Messages):要求使用标准化的媒体类型(MIME类型)来传递消息,例如 JSON、XML,使得消息能够自解释,减少了通信的复杂性。

如果一个系统满足了上面所列出的五条特点,那么该系统就被称为是RESTfUL的。

2.3、REST风格好处

前后端分离

前端拿到数据只负责展示和渲染,不对数据做任何处理。
后端处理数据并以JSON格式传输出去,定义这样一套统一的接口,在web,ios,android三端都可以用相同的接口,达成复用(因为不需要写三次代码,一次代码可以公用给三端;另外,修改代码只要修改一次,三端都同步访问新代码,不需要修改三次代码。)

img

2.4、REST风格缺点

无状态约束,正是它的一个缺点。
其需要在每次请求中包含所有必要信息,来维持客户端状态,扩大了数据传输量,增大了网络传输压力。

2.5、案例测试

在项目下新建一个Java类 RestFulController

package com.moondream.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/t4")
public class RestFulController {

    @RequestMapping(value = "/{p1}/{p2}",method = RequestMethod.GET)
    public String add(@PathVariable Integer p1, @PathVariable Integer p2, Model model) {

        int res = p1 + p2;
        model.addAttribute("msg", "相加结果为:" + res);
        return "test";
    }

    @RequestMapping(value = "/{p1}/{p2}",method = RequestMethod.POST)
    public String subtract(@PathVariable Integer p1, @PathVariable Integer p2, Model model) {

        int res = p1 - p2;
        model.addAttribute("msg", "相减结果为:" + res);
        return "test";
    }
    
}

代码解释:

  • @PathVariable :顾名思义,路径变量,只能标注在方法参数上。其实就是改变了Spring框架对方法参数进行数据绑定的方式
    普通方法参数进行数据绑定:request.getParameter("参数名")
    @PathVariable方法参数进行数据绑定:格式化请求路径得来。格式化模板:/{参数名1}/{参数名2}……
    使用@PathVariable注解,将参数写入路径当中,更符合Rest风格

修改 test.jsp

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

<form action="http://localhost:8080/spring04/t4/1/2" method="post">
    <input type="submit"/>
</form>

</body>
</html>

代码解释:

  新增一个表单,以post方式发起请求,与get请求做区别,指向同一个URL。

启动Tomcat,访问测试路径:http://localhost:8080/spring04/t4/1/2

Rest案例测试

如图,http://localhost:8080/spring04/t4/1/2 URL为特定资源位置,Get和Post两种请求方法为 访问行为,分别代表 相加 和 相减。
使用Get请求访问资源,得到相加结果为3,使用Post请求访问资源,得到相减结果为-1。
这种将 ”行为“ 从URL中抽离出来,用Http动词代替,URL只表示纯粹的资源位置的web设计,符合Rest风格,是RestFul的。

3、补充

对于@RequestMapping,有一些组合注解:

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

这些注解相当于指定了method属性的@RequestMapping,是特定method@RequestMapping的快捷方式,详细的可以去看看源码,很简单,这里不细说了。


每个程序员都要知道的:小黄鸭调试法

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

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

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

小黄鸭调试法,每个程序员都要知道的 – 程序师

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

这其实就是典型的 费曼学习法,借助向别人输出知识,来印证自身所学和总结经验。
写博客其实也是一样的哦!


参考文章
https://blog.csdn.net/SeniorShen/article/details/111591122
https://www.zhihu.com/question/28557115

标签:03,http,RequestMapping,SpringMVC,springframework,Controller,import,org
From: https://www.cnblogs.com/blog-moondream/p/18290391

相关文章

  • P10359 [PA2024] Kolorowy las
    MyBlogsP10359[PA2024]Kolorowylas/tuu。写了三天。首先考虑树的形态不变怎么做,直接的想法是树分治这种东西可以做到一只或者两只\(\log\)。但是点分这种东西不太好扩展到动态树的问题。但是因为这是单点查询,所以可以不用真正的树上染色,只需要回答每个询问即可。考虑对于......
  • 从零开始学Java(超详细韩顺平老师笔记梳理)03——各类运算符、标识符关键字、进制转换、
    文章目录前言一、运算符(算术、关系、逻辑、赋值、三元)1.算术运算符2.关系运算符(比较运算符)3.逻辑运算符4.赋值运算符5.三元运算符TernaryOperator二、运算符优先级三、标识符规范与关键字1.标识符命名规则和规范2.关键字3.保留字四、键盘输入五、进制介绍转换,......
  • springboot事故车辆与违章车辆跟踪系统-计算机毕业设计源码03863
    摘  要科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设事......
  • 人生低谷来撸C#--003
    1、新手暂且这里只是记录成长新手好多都是小白,这里也分享不了什么精彩的内容,只是鼓励和记录自己的成长。2、关于C#封装封装被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中"。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。抽象和封装是面向......
  • 03、集群部署
    版本:Rocky8系统,K8S版本1.26.2测试环境最低硬件要求:①:CPU:2c②:内存:4G③:硬盘:50G服务器准备节点主机名IP地址mastertestlinux01192.168.222.101node1testlinux02192.168.222.102node2testlinux03192.168.222.103准备工作01、关闭selinux和firewalld......
  • 03-码出高效:Java开发手册.pdf
    03-码出高效:Java开发手册.pdf03-码出高效:Java开发手册.pdfMySQL技术内幕InnoDB存储引擎第2版.pdf​​‍​​‍‍......
  • python随笔day03
    python面试基础问题lambda表达式基本语法:变量=lambda[参数列表]:表达式(函数代码+返回值)#调用变量()例子如下:#加法求和函数a=lambdaa,b:a+bprint(a(1,2))#3#args元组类型b=lambda*args:argsprint(b('a','b','c','d',10))#('a','b&......
  • 03-码出高效:Java开发手册.pdf
    03-码出高效:Java开发手册.pdf03-码出高效:Java开发手册.pdfMySQL技术内幕InnoDB存储引擎第2版.pdf​​‍​​‍‍......
  • 03-码出高效:Java开发手册.pdf
    03-码出高效:Java开发手册.pdf03-码出高效:Java开发手册.pdf​​​​‍​​‍‍......
  • 【驱动篇】龙芯LS2K0300之ADC驱动
    实验目的由于LS2K0300久久派开发板4.19内核还没有现成可用的ADC驱动,但是龙芯官方的5.10内核已经提供了ADC驱动,想要在4.19内核使用ADC就要参考5.10内核移植驱动,本次实验主要是关于ADC驱动的移植和使用驱动移植主要的驱动代码主要有3个:loongson-2k300-adc.c、loongson-2k30......