SpringMVC原理分析 | Controller配置、RestFul风格

在这里插入图片描述

💗wei_shuo的个人主页

💫wei_shuo的学习社区

🌐Hello World !


Controller配置

控制器Controller

  • 控制器复杂提供访问应用程序的行为,通常通过接口定义注释定义的两种方法实现
  • 控制器负责解析用户的请求并将其转换为一个模型
  • SpringMVC中一个控制器可以包含多个方法

实现Controller接口

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

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

接口方法实现Controller

  • 配置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"><!--配置DispatcherServlet--><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc-servlet.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>
  • 配置springmvc-servlet.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"xmlns:mvc="http://www.springframework.org/schema/mvc"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 http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--自动扫描包,让指定包下的注释生效,由IOC容器统一管理--><context:component-scan base-package="com.wei.controller"/><!--过滤静态资源--><mvc:default-servlet-handler/><!--配置annotation-driven使:处理器映射器 和 处理器适配器 自动完成实例的注入--><mvc:annotation-driven/><!--视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"><!--前缀--><property name="prefix" value="/WEB-INF/jsp/"/><!--后缀--><property name="suffix" value=".jsp"/></bean>
</beans>
  • 编写Controller类(ControllerTest1)
package com.wei.controller;import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;//实现了Controller类说明这就是控制器
public class ControllerTest1 implements Controller {@Overridepublic ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {//创建模型和视图对象ModelAndView modelAndView = new ModelAndView();封装数据,向模型添加属性msg与值,可以在jsp页面取出、渲染modelAndView.addObject("msg","ControllerTest1");//视图跳转modelAndView.setViewName("test");//返回视图模型对象return modelAndView;}
}
  • test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
${msg}
</body>
</html>

缺点:一个控制器只要一个方法,如果多个方法需要多个Controller,使用这种方法比较麻烦

注解方法实现Controller

@Controller注解的类会自动添加到Spring上下文中,被这个注解的类,返回String,并且有具体页面跳转,就会被视图解析器解析

@Controller控制器(注入服务)

@Component(把普通pojo实例化到spring容器中,相当于配置文件中的 )

@Service服务(注入dao)

@Respository(现dao访问)

  • Spring可以使用扫描机制找到应用程序中所有基于注解的控制器类,为保证Spring能找到控制器,需要在配置文件中声明组件扫描
<!--自动扫描包,让指定包下的注释生效,由IOC容器统一管理-->
<context:component-scan base-package="com.wei.controller"/>
  • 增加一个ControllerTest类,使用注解实现
package com.wei.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;//@Controller注解的类会自动添加到Spring上下文中,被这个注解的类,返回String,并且有具体页面跳转,就会被视图解析器解析
@Controller
public class ControllerTest2 {@RequestMapping("/t2")public String test1(Model model){model.addAttribute("msg","ControllerTest2");return "test";	// /WEB-INF/jsp/test.jsp}
}

RequestMapping配置

  • @RequestMapping注解用于映射url到控制器或一个特定的处理程序方法,可用于类或方法上
  • 用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径
  • 访问路径为:http://localhost:8080/项目名/c3/t1
package com.wei.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping("/c3")
public class ControllerTest3 {@RequestMapping({"/t1"})//或者  @RequestMapping({"/c3/t1"})public String test1(Model model){model.addAttribute("msg","ControllerTest3");return "test";}
}

RestFul

概念

RestFul是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RestFul适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源

RestFul就是资源定位及资源操作的风格,不是标准也不是协议,只是一种风格,基于RestFul风格设计的软件可以更高效、有层次、易于实现缓存机制

传统方式

package com.wei.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;//@Controller注解的类会自动添加到Spring上下文中,被这个注解的类,返回String,并且有具体页面跳转,就会被视图解析器解析
@Controller
public class RestFulController {@RequestMapping("/add")public String test1(int a, int b, Model model) {int result = a + b;model.addAttribute("msg", "结果为:" + result);return "test";}
}

在这里插入图片描述

RestFul方式

@PathVariable:让方法参数的值对应绑定到一个URL模板变量上

package com.wei.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;//@Controller注解的类会自动添加到Spring上下文中,被这个注解的类,返回String,并且有具体页面跳转,就会被视图解析器解析
@Controller
public class RestFulController {@RequestMapping("/add/{a}/{b}")public String test1(@PathVariable int a,@PathVariable int b, Model model) {int result = a + b;model.addAttribute("msg", "结果为:" + result);return "test";}
}

在这里插入图片描述

方式一:

@GetMapping(“/add/{a}/{b}”)
@PostMapping(“/add/{a}/{b}”)
@PutMapping(“/add/{a}/{b}”)
@DeleteMapping(“/add/{a}/{b}”)
@PatchMapping(“/add/{a}/{b}”)

package com.wei.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;//@Controller注解的类会自动添加到Spring上下文中,被这个注解的类,返回String,并且有具体页面跳转,就会被视图解析器解析
@Controller
public class RestFulController {//    @GetMapping("/add/{a}/{b}")
//    @PostMapping("/add/{a}/{b}")
//    @PutMapping("/add/{a}/{b}")
//    @DeleteMapping("/add/{a}/{b}")
//    @PatchMapping("/add/{a}/{b}")@GetMapping("/add/{a}/{b}")public String test1(@PathVariable int a,@PathVariable int b, Model model) {int result = a + b;model.addAttribute("msg", "test1结果为:" + result);return "test";}@PostMapping("/add/{a}/{b}")public String test2(@PathVariable int a,@PathVariable int b, Model model) {int result = a + b;model.addAttribute("msg", "test2结果为:" + result);return "test";}
}

方式二:

package com.wei.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;//@Controller注解的类会自动添加到Spring上下文中,被这个注解的类,返回String,并且有具体页面跳转,就会被视图解析器解析
@Controller
public class RestFulController {@RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.GET)public String test1(@PathVariable int a,@PathVariable int b, Model model) {int result = a + b;model.addAttribute("msg", "test1结果为:" + result);return "test";}@RequestMapping(value = "/add/{a}/{b}",method = RequestMethod.POST)public String test2(@PathVariable int a,@PathVariable int b, Model model) {int result = a + b;model.addAttribute("msg", "test2结果为:" + result);return "test";}
}

🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——点赞👍收藏⭐️评论📝


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot整合定时任务技术Quartz

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ RequestMapping注解 &#x1f680;Quartz应用场…

在教育领域中使用ChatGPT有哪些优点?

人工智能在教育领域的应用正在迅速增加。OpenAI于2022年11月开发的聊天机器人ChatGPT在全球范围内广受欢迎。 由于其受欢迎程度以及生成类似人类问题的回答的能力&#xff0c;ChatGPT正在成为许多学习者和教育工作者值得信赖的伴侣。然而&#xff0c;与任何新兴技术一样&#x…

2019年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题——纯享题目版

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&#xff0c;题目常常看&a…

原码的表示

原码表示 定点整数源码与定点小数源码 源码表示例题 正数与负数转换直接将高位变为1即可 原码的性质 原码的优缺点 乘除法直接符号位异或&#xff0c;数值相乘除即可加法与减法需要先判断两个数值的大小然后确定符号位

2.SpringBoot运维实用篇

SpringBoot运维实用篇 ​ ​ 下面就从运维实用篇开始讲&#xff0c;在运维实用篇中&#xff0c;我给学习者的定位是玩转配置&#xff0c;为开发实用篇中做各种技术的整合做好准备工作。 主要分为以下内容&#xff1a; SpringBoot程序的打包与运行配置高级多环境开发日志 ​…

【需求实现】Tensorflow2的曲线拟合(二):进度条简化

文章目录 导读普通的输出方式上下求索TensorBoard是个不错的切入点与Callback参数对应的Callback方法官方的内置Callback官方进度条简单的猜测与简单的验证拼图凑齐了&#xff01; 导读 在训练模型的过程中往往会有日志一堆一堆的困扰。我并不想知道&#xff0c;因为最后我会在…

【域名详解】网络杂谈(13)之深入简出了解什么是域名

涉及知识点 什么是域名&#xff0c;域名的概念&#xff0c;域名的结构&#xff0c;域名地址的寻址过程&#xff0c;深入了解域名的寻址机制。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可去其主页关注下哈&#xff0c;不胜感激 文章目录 涉及知识点…

基于Tars高并发IM系统的设计与实现-基础篇1

基于Tars高并发IM系统的设计与实现–基础篇1 作者简介 兰怀玉 毕业于中央民族大学计算机专业 先后供职国内外多家公司软件研发设计岗位&#xff0c;有丰富的软件研发经验。 从事IM领域设计研发十余年&#xff0c;先后领衔多个IM通讯系统设计与研发发&#xff0c;拥有丰富的IM…

linux下RabbitMQ的使用

文章目录 linux下RabbitMQ的使用首先docker启动网页打开网址&#xff1a;用户名和密码登录创建exchanges:创建Queues增加Queues的Bind linux下RabbitMQ的使用 首先docker启动 su rootsudo docker run -d --hostname rabbitsvr --name rabbit -p 5672:5672 -p 15672:15672 -p …

ChatGPT实战:项目管理

人工智能有可能彻底改变许多行业&#xff0c;包括项目管理&#xff0c;及时了解最新技术以及它如何影响你的工作至关重要&#xff0c;因为学习好项目管理&#xff0c;不管你能不能做项目经理&#xff0c;在生活、工作的方面方面都会享受到懂得项目管理后带来的收益。 下面我们借…

c# Invoke使用

在多线程编程中&#xff0c;我们经常要在工作线程中去更新界面显示&#xff0c;而在多线程中直接调用界面控件的方法是错误的做法&#xff0c;Invoke 和 BeginInvoke 就是为了解决这个问题而出现的&#xff0c;使你在多线程中安全的更新界面显示。 正确的做法是将工作线程中涉…

发送邮箱验证码【spring boot】

⭐前言⭐ ※※※大家好&#xff01;我是同学〖森〗&#xff0c;一名计算机爱好者&#xff0c;今天让我们进入学习模式。若有错误&#xff0c;请多多指教。更多有趣的代码请移步Gitee &#x1f44d; 点赞 ⭐ 收藏 &#x1f4dd;留言 都是我创作的最大的动力&#xff01; 1. 思维…