SpringMVC-03-RestFul和Controller

打印 上一主题 下一主题

主题 877|帖子 877|积分 2631

1、Controller


  • MVC架构中的控制层,在SpringMVC中,由 Handler 构成
  • 负责提供访问应用步伐的行为:处置惩罚用户的哀求并调用 Model层 将其转换为一个模型数据跳向 View层
  • 在Spring MVC中,对于Controller的配置方式有很多种,通常可以通过接口界说或注解界说两种方法实现
新建一个子项目,SpringMVC-04-Controller,搭建好项目


  • spring-mvc.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.        xmlns:context="http://www.springframework.org/schema/context"
  5.        xsi:schemaLocation="
  6.        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  7.        http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
  8. ">
  9.    
  10.     <bean >
  11.         <property name="prefix" value="/WEB-INF/jsp/"/>
  12.         <property name="suffix" value=".jsp"/>
  13.     </bean>
  14.    
  15. </beans>
复制代码

  • web.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  5.          version="4.0">
  6.     <servlet>
  7.         <servlet-name>DispatcherServlet</servlet-name>
  8.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  9.         <init-param>
  10.             <param-name>contextConfigLocation</param-name>
  11.             <param-value>classpath:spring-mvc.xml</param-value>
  12.         </init-param>
  13.         <load-on-startup>1</load-on-startup>
  14.     </servlet>
  15.     <servlet-mapping>
  16.         <servlet-name>DispatcherServlet</servlet-name>
  17.         <url-pattern>/</url-pattern>
  18.     </servlet-mapping>
  19. </web-app>
复制代码

  • test.jsp
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4.     <title>test</title>
  5. </head>
  6. <body>
  7. ${msg}
  8. </body>
  9. </html>
复制代码
1.1、实现Controller接口

在org.springframework.web.servlet.mvc包下,有一个名为Controller的接口,接口中只有一个方法;
  1. // 实现该接口的类获得Controller功能
  2. public interface Controller {
  3.    // 处理请求且返回一个 ModelAndView 对象
  4.    ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
  5. }
复制代码
新建 ControllerTest 类,实现 Controller 接口
  1. package com.moondream.controller;
  2. import org.springframework.web.servlet.ModelAndView;
  3. import org.springframework.web.servlet.mvc.Controller;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. public class ControllerTest implements Controller {
  7.    
  8.     @Override
  9.     public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
  10.         ModelAndView mv = new ModelAndView();
  11.         mv.addObject("msg", "ControllerTest");
  12.         mv.setViewName("/test");
  13.         return mv;
  14.     }
  15. }
复制代码
将 ControllerTest 注册到 SpringIOC 中,id对应哀求路径,class对应处置惩罚哀求的类
  1. [/code]启动Tomcat,测试访问路径:[url=http://localhost:8080/spring04/t1]http://localhost:8080/spring04/t1[/url]
  2. [align=center][img]https://img2023.cnblogs.com/blog/3455982/202407/3455982-20240704211952735-1738442768.png[/img][/align]
  3. 测试成功!
  4. [b]留意:[/b]
  5. [list]
  6. [*]实现接口Controller界说 Handler 是较老的办法;
  7. [*]缺点:一个类中只有一个哀求处置惩罚方法,如果要多个Handler则需要界说多个类;界说的方式比力麻烦。
  8. [/list][size=4]1.2、使用注解@Controller和@RequestMapping[/size]
  9. [b]@Controller[/b]
  10. [list]
  11. [*]用于声明被标注的类属于 Controller层
  12. [*]模板注解,被标注的类会被 component-scan 扫描到
  13. [/list][b]@RequestMapping[/b]
  14. [list]
  15. [*]用于声明被标注的方法属于 HandlerMethod(注解方式中的Handler)
  16. [*]当它被标注在一个类上时,相当于类下的 HandlerMethod 的前置要求
  17. [*]只有在 被@Controller标注的类 中才会生效
  18. [/list]新建 ControllerTest2 类 和 ControllerTest3 类,标上注解
  19. [code]package com.moondream.controller;
  20. import org.springframework.stereotype.Controller;
  21. import org.springframework.ui.Model;
  22. import org.springframework.web.bind.annotation.RequestMapping;
  23. @Controller
  24. public class ControllerTest2 {
  25.     @RequestMapping("/t2")
  26.     public String test(Model model) {
  27.         model.addAttribute("msg", "ControllerTest2");
  28.         return "test";
  29.     }
  30. }
复制代码
  1. package com.moondream.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.ui.Model;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. @Controller
  6. @RequestMapping("/t3")
  7. public class ControllerTest3 {
  8.     @RequestMapping("/test")
  9.     public String test(Model model) {
  10.         model.addAttribute("msg", "ControllerTest3");
  11.         return "test";
  12.     }
  13. }
复制代码
将 ControllerTest2、ControllerTest3 注册到 SpringIOC中,这里可以使用两种方式

  • 组件扫描
  1. [/code]或者
  2. [list]
  3. [*]手动注册
  4. [/list][code]
复制代码
启动Tomcat,测试访问路径:
http://localhost:8080/spring04/t2

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

测试成功!
注解方式是平时使用的最多的方式!
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服务的一种技能(留意:不是一种技能!!!也不是一种标准!!!),
其目标是为了创建具有良好扩展性的网络化分布式体系。
反过来,作为一种风格,其具备了一系列架构级特点。这些特点有:

  • 同一接口(Uniform Interface):强调使用同一的接口来处置惩罚资源,通过 HTTP 方法对资源进行操作(GET 用于获取资源、POST 用于创建资源、PUT 用于更新资源、DELETE 用于删除资源),使得客户端和服务器之间的通讯更加简单和同一。
  • 无状态性(Stateless):服务端不会保存有关客户的任何状态,也就是说,客户端自身负责用户状态的维持,并在每次发送哀求时都需要提供充足的信息。这样可以提高体系的可伸缩性和性能,同时降低了服务器端的维护资本。
  • 可缓存(Cacheable):支持缓存机制,客户端可以缓存服务器返回的资源,以尽量淘汰服务端和客户端之间的信息传输,在肯定条件下可以直接使用缓存减轻服务器的压力,降低网络延迟。
  • 条理化体系(Layered System):支持客户端和服务器之间的解耦,允许通过添加代理服务器或者缓存改进性能、安全性等方面,客户端并不会固定地与一个服务器打交道。
  • 自描述消息(Self-descriptive Messages):要求使用标准化的媒体类型(MIME类型)来传递消息,例如 JSON、XML,使得消息可以或许自表明,淘汰了通讯的复杂性。
如果一个体系满足了上面所列出的五条特点,那么该体系就被称为是RESTfUL的。
2.3、REST风格好处

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

2.4、REST风格缺点

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

在项目下新建一个Java类 RestFulController
  1. package com.moondream.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.ui.Model;
  4. import org.springframework.web.bind.annotation.PathVariable;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestMethod;
  7. @Controller
  8. @RequestMapping("/t4")
  9. public class RestFulController {
  10.     @RequestMapping(value = "/{p1}/{p2}",method = RequestMethod.GET)
  11.     public String add(@PathVariable Integer p1, @PathVariable Integer p2, Model model) {
  12.         int res = p1 + p2;
  13.         model.addAttribute("msg", "相加结果为:" + res);
  14.         return "test";
  15.     }
  16.     @RequestMapping(value = "/{p1}/{p2}",method = RequestMethod.POST)
  17.     public String subtract(@PathVariable Integer p1, @PathVariable Integer p2, Model model) {
  18.         int res = p1 - p2;
  19.         model.addAttribute("msg", "相减结果为:" + res);
  20.         return "test";
  21.     }
  22.    
  23. }
复制代码
代码表明:

  • @PathVariable :顾名思义,路径变量,只能标注在方法参数上。其实就是改变了Spring框架对方法参数进行数据绑定的方式
    普通方法参数进行数据绑定:request.getParameter("参数名")
    @PathVariable方法参数进行数据绑定:格式化哀求路径得来。格式化模板:/{参数名1}/{参数名2}……
    使用@PathVariable注解,将参数写入路径当中,更符合Rest风格
修改 test.jsp
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <html>
  3. <head>
  4.     <title>test</title>
  5. </head>
  6. <body>
  7. ${msg}
  8. </body>
  9. </html>   
复制代码
代码表明:
  新增一个表单,以post方式发起哀求,与get哀求做区别,指向同一个URL。
启动Tomcat,访问测试路径:http://localhost:8080/spring04/t4/1/2

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

对于@RequestMapping,有一些组合注解:
  1. @GetMapping
  2. @PostMapping
  3. @PutMapping
  4. @DeleteMapping
  5. @PatchMapping
复制代码
这些注解相当于指定了method属性的@RequestMapping,是特定method@RequestMapping的快捷方式,详细的可以去看看源码,很简单,这里不细说了。
每个步伐员都要知道的:小黄鸭调试法
场景一:我们都有过向别人(乃至可能向完全不会编程的人)提问及表明编程题目标经历,但是很多时间就在我们表明的过程中本身却想到了题目标解决方案,然后对方却一脸茫然。
场景二:你的同行跑来问你一个题目,但是当他本身把题目说完,或说到一半的时间就想出答案走了,留下一脸茫然的你。
其实上面两种场景现象就是所谓的 小黄鸭调试法(Rubber Duck Debuging),又称橡皮鸭调试法,它是我们软件工程中最常使用调试方法之一。

此概念据说来自《步伐员修炼之道》书中的一个故事,传说步伐大师随身携带一只小黄鸭,在调试代码的时间会在桌上放上这只小黄鸭,然后详细地向鸭子表明每行代码,然后很快就将题目定位修复了。
这其实就是典范的 费曼学习法,借助向别人输出知识,来印证自身所学和总结履历。
写博客其实也是一样的哦!

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

水军大提督

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表