SpringMVC基础篇:第一个MVC程序和细节分析

news2024/11/15 11:26:51

文章整理自孙哥说SpringMVC,相关课程联系孙哥学习谢谢。

  • 第一章:编码开发
    • 一:思路分析
    • 二:SpringMVC程序编码
    • 三:控制器提供多个服务方法
    • 四:注意事项
  • 第二章:细节分析
    • 一:控制器创建次数
    • 二:@RequestMapping注解
    • 1:路径分隔符/可省略
    • 2:一个控制器方法上指定多个注解
    • 3:类上的@RequestMapping
  • 第三章:请求方式
    • 一:回顾请求方式
    • 二:Post和Get请求的区别
    • 1:两种请求提交数据的区别
    • 2:两种请求发起方式的区别
    • 三:@RequestMapping限定用户请求方式
    • 1:默认支持所有请求方式
    • 2:限定固定请求方式
    • 3:同时限定多种请求方式
    • 4:发起不支持的请求方式
    • 三:@RequestMapping限定其他请求方式
    • 1:Http协议提供了其他请求方式
    • 2:@RequestMapping也支持其他请求方式
    • 3:浏览器对于其他请求方式的支持
    • 4:其他请求方式的响应形式

第一章:编码开发

一:思路分析

作为SpringMVC来讲他的核心就是控制器。控制器在之前我们了解过Servlet,我们现在通过Servlet的开发推导出SringMVC的开发。

我们编写一个类,这个类需要extends HttpServlet继承之后,我们重写其中的service方法,方法的参数时request和response。然后我们在其中进行接收请求参数、业务处理、页面跳转等操作。这就是我们需要编码的细节。
在这里插入图片描述
代码写完之后,我们需要在web.xml当中配置一个servlet标签:
servlet-name:当中起一个名字,唯一就行。
servlet-class:带包带类,实际上就是类的限定名称。
与之对应的我们还需要配置一个servlet-mapping标签,作用就是对外暴露我们这个Servlet对应的URL。
servlet-name:跟上边保持一致
url-pattern:一个URL

http://localhost:8989/basic/firstServlet
这是一个请求的完成的URL,我们在地址栏当中输入这个路径之后,基于ip+端口+应用名。后边的/firstServlet找到对应的url-pattern,进而找到对应的servlet-name进而找到对应的servlet-class。这就是我们servlet开发的开发方式。

对于SpringMVC来讲,他所提供的控制器就是为了替换原生Servlet的,他们在开发过程中主题思想是保持一致的。SpringMVC的控制器一定会简化现有的MVC的开发的。
SpringMVC的控制器在开发过程当中,是不需要继承父类或者实现接口这样的要求,只需要在类上边添加一个@Controller注解(上述图右)注解可以起到接口这样约定性的作用,继承父类或者实现接口这样的方式被注解取代掉了。这就是二者在开发类上边的区别关系。
在Servlet当中我们只能写Service方法,但是在SpringMVC当中对应的名字,他的方法名字是可以随便写的。对于SpringMVC的方法的返回值不再是void了,而是Spring就是跳转路径。

作为SpringMVC来中的Controller来将他如何指定他的URL呢,只需要在方法上加一个注解@RequestMapping即可。这个注解当中的路径就是他对应的URI用户在通过地址栏访问的时候就是在方法上写的地址的内容。
这个和Basic是一致的。举例来讲:Http:localhost:8989/spring-mvc1/firstController即可。

基本开发流程:
1:开发一个类在类上加Controller注解
2:提供一个控制器方法。参数是:HttpServletRequest,HttpServletResponse,返回值是String的,同事加入@RequestMapping注解定义请求路径。
3:在控制方法中,完成核心开发功能,把对应的JSP页面的路径作为返回值返回。

二:SpringMVC程序编码

在我们的IDEA当中我把相关的内容关掉。
后端代码:

@Controller
public class FirstController {
    public FirstController() {
        System.out.println("FirstController.FirstController");
    }
    @RequestMapping("/first")
    //方位这个控制器方法的路径是first
    public String first(HttpServletRequest request, HttpServletResponse response){
        System.out.println("FirstController.first");
        //跳转到根下边的这个jsp
        return "/result.jsp";
    }
}

JSP代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Result</title>
</head>
<body>
   <h1>this is result jsp</h1>
</body>
</html>

浏览器访问地址:

http://localhost:8989/basic/first

注意:必须要进行@Controller注解的扫描。

三:控制器提供多个服务方法

作为控制器来讲,Servlet当中是不允许一个控制器提供多个服务方法的。在Servlet当中一个控制器只能提供一个方法。这是因为在Servlet当中必须实现接口规定的service(HttpServletRequest,HttpServletResponse)方法,一个类中只能实现一次,所以一个类当中只能有一个服务方法。在Servlet想要提供服务就之能写Servlet接口提供的规定。所以,我们基于Servlet只能基于以下的代码结构:

在这里插入图片描述
作为SpringMVC的控制器一个类当红中可以提供多个对外服务的方法的。究其原因是因为SpringMVC控制器当中的服务方法对于方法名是没有任何要求的:

@Controller
public class FirstController {
    public FirstController() {
        System.out.println("FirstController.FirstController");
    }
    @RequestMapping("/first")
    public String first(HttpServletRequest request, HttpServletResponse response){
        System.out.println("FirstController.first");
        return "/result.jsp";
    }

    // http://localhost:8989/basic/suns/second
    @RequestMapping(value="suns/second")
    public String second(HttpServletRequest request,HttpServletResponse response){
        System.out.println("FirstController.second");
        return "/result.jsp";
    }
}

我们写Value等于这种形式没啥区别,如果注解当中只写一个属性,且属性为value,则value可省略。

四:注意事项

SpringMVC开发过程中习惯上把控制器称之为Controller,SpringMVC内部也把开发的控制器也叫做Handler因为后续我们查看源码的过程当中经常看到Handler…等等各种各样的说法。

第二章:细节分析

一:控制器创建次数

作为Servlet来讲,他对应的控制器被创建的次数是几次呢?一中Servlet只会被Tomcat创建一次。请求过来之后,Tomcat只会创建一次这个对象。所以我们常说:Servlet是单实例的(注意这个不是单例设计模式)

SpringMVC的控制器被Spring创建的次数是尊询Spring的规则,可以只创建一次,也可以创建多次。默认可以创建一次,也可以去创建多次。如果想创建多次,我们可以加一个@Scope注解来设定。如果是@Scope是prototype的话,那么一次请求就会对应创建一个Controller对象。

默认SpringMVC的Controller只会被创建一次,存在线程安全的问题。如果这里边有成员变量,并且这里边成员变量是线程不安全的话,就会有问题。

二:@RequestMapping注解

该注解核心作用就是为控制器方法提供外部访问的URI路径。服务器就可以将用户URL当中的URL同注解当中的路径进行匹配来让客户访问对应的服务。这个工作是由RequestMappingHandlerMapping来处理的,对方法上添加这个注解的服务进行一一扫描,来进行服务注册。

1:路径分隔符/可省略

SpringMVC当中“/first”当中的/是可以省略的。如果是多级路径,第一个/是可以省略的。

2:一个控制器方法上指定多个注解

@Controller
//@Scope("singleton")
//@Scope("prototype")
public class FirstController {

    public FirstController() {
        System.out.println("FirstController.FirstController");
    }

    //@RequestMapping("/first")
    //@RequestMapping("first")
    @RequestMapping(value = {"/first","/third"})
    public String first(HttpServletRequest request, HttpServletResponse response){
        System.out.println("FirstController.first");
        return "/result.jsp";
    }

    // http://localhost:8989/basic/suns/second
    @RequestMapping(value="suns/second")
    public String second(HttpServletRequest request,HttpServletResponse response){
        System.out.println("FirstController.second");
        return "/result.jsp";
    }
}

3:类上的@RequestMapping

可以在类上加注解,这就让URL上多加一个层级而已。
http://localhost:8989/basid/user/addUser
http://localhost:8989/basid/user/deteleUser

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/addUser")
    public String addUser() {
        System.out.println("UserController.addUser");
        return "/result.jsp";
    }
    @RequestMapping("/deleteUser")
    public String deleteUser() {
        System.out.println("UserController.deleteUser");
        return "/result.jsp";
    }
}

类上@RequestMapping设计意图:
为什么SpringMVC设计的过程当中让我们在类上加这样的一个注解呢?
为了统一服务,我们在使用的过程中,会把一组相关的操作放到同一个控制器当中。用户Controller负责用户的事,账户Controller负责账户的事。采用了这样的设计之后,用户的URL就会很规范,在访问的路径上也能体现出模块化。

第三章:请求方式

一:回顾请求方式

所谓的请求方式就是JavaWeb当中讲的get和post请求等等。

二:Post和Get请求的区别

1:两种请求提交数据的区别

1:Get请求通过请求行地址栏提交数据,数据明文提交(QueryString),不安全提交的数据量小不能超过2048个字节(2MB),这是上线,具体多少还得看
2:Post请求:通过请求体提交数据,密文提交,这里不是说会加密,而是说一般用户不可见,相对安全,理论上是没有大小限制的。

1:GET请求:通过请求行(地址栏)提交数据(QueryString),明文数据提交,不安全,提交的数据量小(不能超过2048字节),当然我们所说的2048字节是上限值,最终多少还得看浏览器的实现。

http://localhost:8989/basic/user/queryuser?name=sunshuai&password=123456

上述就是使用Get请求提交的一个形式,我们会在URL后边打一个问号,问号后边的都是QueryString这个也都是我们提交的明文数据。
2:POST请求:通过请求体提交数据,密文提交(不是加密,指的是一般用户不可见),相对安全,这个是走请求体提交数据,提交数据量大(理论上没有限制)
原来我们解决中文字符集乱码的问题的时候GET和Post解决方式是不一致的,因为提交数据的位置不一样。

2:两种请求发起方式的区别

在这里插入图片描述

三:@RequestMapping限定用户请求方式

1:默认支持所有请求方式

默认情况下:@RequestMapping注解,接受所有请求方式的访问 (Post,Get,…)

2:限定固定请求方式

通过@RequestMapping注解可以限定,某个控制器方法只接受特定的请求方式
@RequestMapping(method={RequestMethod.POST})
public String xxx(HttpServletRequest,HttpServletResponse)
@RequestMapping(method={RequestMethod.GET))
public String xxx(HttpServletRequest,HttpServletResponse)

3:同时限定多种请求方式

@RequestMapping注解可以同时限定多种请求方式的访问
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST))
public String xxx(HttpServletRequest,HttpServletResponse)

4:发起不支持的请求方式

当用户发起了@RequestMapping不支持的请求操作
SpringMVC在服务器端抛出一个405错误 Method Not Allowed

三:@RequestMapping限定其他请求方式

1:Http协议提供了其他请求方式

除常规的POST,GET请求外Http协议还提供了其他的请求方式PUT、DELETE、OPTIONS

2:@RequestMapping也支持其他请求方式

@RequestMapping注解,默认情况下也支持其他请求方式的访问,同时也可以根据需要进行限定@RequestMapping(method={RequestMethod.DELETE)
public String xxx(HttpServletRequest,HttpServletResponse)

3:浏览器对于其他请求方式的支持

除Post,Get这2种请求方式外,其他的请求方式浏览器支持的不好,可以使用专属工具或者库进行测试

4:其他请求方式的响应形式

其他的请求方式,大多数不支持响应视图技术 (JSP,Thymeleaf),只能返回简单字符串或者JSON数据。

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

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

相关文章

C++ 【set、map模拟实现】

目录 set概念 set基本使用 map概念 map的使用 map统计次数 operator[] operator[]底层如何实现&#xff1f; set和map迭代器封装 红黑树迭代器基本结构 operator operator-- operator[] 源代码链接 map、set底层都使用平衡搜索树(即红黑树)&#xff0c;容器中的元素…

HanLP 基于朴素贝叶斯 训练 文本分类

一、HanLP 朴素贝叶斯分类器 HanLP 针对文本分类算法已经帮我们实现 朴素贝叶斯法 &#xff0c;用户可以无需关心内部细节&#xff0c;HanLP 也提供了相关自定义训练接口&#xff0c;前提需要将数据集根据分类放到不同的目录中&#xff0c;例如&#xff1a; 官方给出了相关性能…

HanLP 基于SVM支持向量机 训练 文本分类

一、HanLP 基于SVM支持向量机分类器 上篇文章通过朴素贝叶斯文本分类器&#xff0c;训练测试了 搜狗文本分类语料库迷你版 &#xff0c;本篇继续测试SVM支持向量机分类器。 由于HanLP 官方给出的 SVM 分类器依赖了第三方库&#xff0c;没有集成在主项目中&#xff0c;需要拉取…

问题解决(1)——VS中scanf报错怎么解决

目录 方法一&#xff1a; 方法二&#xff1a; 方法三&#xff1a; 各位好&#xff0c;博主新建了个公众号《自学编程村》&#xff0c;拉到底部即可看到&#xff0c;有情趣可以关注看看哈哈&#xff0c;关注后还可以加博主wx呦~~~&#xff08;公众号拉到底部就能看到呦~~&am…

Redis【13】-修改数据库后,如何保证Redis与数据库的数据一致性

一、需求起因 在高并发的业务场景下&#xff0c;数据库大多数情况都是用户并发访问最薄弱的环节。所以&#xff0c;就需要使用redis做一个缓冲操作&#xff0c;让请求先访问到redis&#xff0c;而不是直接访问MySQL等数据库。 这个业务场景&#xff0c;主要是解决读数据从Redi…

ARM 代码重定位实战

前言 任务 在 SRAM 中将代码从 0xd0020010 重定位到 0xd0024000。任务解释&#xff1a;本来代码是运行在0xd0020010的&#xff0c;但是因为一些原因我们又希望代码实际是在0xd0024000位置运行 的。这时候就需要重定位了。注解&#xff1a;本练习对代码本身运行无实际意义&…

你都工作两年半了,还不会RabbitMQ?

What is rabbitMQ &#xff1f; RabbitMQ 是一个由 Erlang 语言开发的 AMQP(高级消息队列协议) 的开源实现。 RabbitMQ 是轻量级且易于部署的&#xff0c;能支持多种消息协议。 RabbitMQ 可以部署在分布式和联合配置中&#xff0c;以满足高规模、高可用性的需求。 具体特点包括…

ADI Blackfin DSP处理器-BF533的开发详解29:TOUCH_LINE(屏幕画线)(含源代码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 硬件设计原理图 功能介绍 代码实现了读取触摸屏坐标&#xff0c;并将触摸屏坐标换算为液晶屏的显示坐标&#xff0c;将像素点显示到触摸坐标的位…

学习Python中turtle模块的基本用法(4:绘制科赫曲线和谢尔宾斯基三角形)

科赫曲线和谢尔宾斯基三角形是常见的分形图形&#xff08;详细介绍见参考文献1&#xff09;&#xff0c;本文使用turtle库绘制这两类图形。 科赫曲线 科赫曲线的详细介绍见参考文献2&#xff0c;其中的绘图思路是“画正三角形&#xff0c;并把每一边三等分,取三等分后的一边中…

【LeetCode】Day194-超级丑数

题目 313. 超级丑数【中等】 题解 之前做过丑数&#xff0c;规定丑数是质因数只包含2,3,5的正整数&#xff0c;而这道题丑数升级为超级丑数&#xff0c;规定为包含的质因数是在primes数组中的正整数 丑数的题解用动态规划&#xff0c;那么超级丑数也可以利用相同的方法解答…

CSS -- CSS元素显示模式总结(块元素,行内元素,行内块元素)

文章目录CSS 的元素显示模式1 什么是元素显示模式2 块元素3 行内元素4 行内块元素5 元素的显示模式总结CSS 的元素显示模式 1 什么是元素显示模式 作用&#xff1a;网页的标签非常多&#xff0c;在不同地方会用到不同类型的标签&#xff0c;了解他们的特点可以更好的布局我们…

[附源码]JAVA毕业设计-学生宿舍故障报修管理信息系统-(系统+LW)

[附源码]JAVA毕业设计-学生宿舍故障报修管理信息系统-&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff…

开源即巅峰,《Java程序性能优化实战》GitHub三小时标星已超34k

蓦然回首自己做开发已经十年了&#xff0c;这十年中我获得了很多&#xff0c;技术能力、培训、出国、大公司的经历&#xff0c;还有很多很好的朋友。但再仔细一想&#xff0c;这十年中我至少浪费了五年时间&#xff0c;这五年可以足够让自己成长为一个优秀的程序员&#xff0c;…

项目设置分页条件查询接口

一、分页 1、HospPlusConfig中配置分页插件1 /** 2 * 分页插件 3 */ 4 Bean 5 public PaginationInterceptor paginationInterceptor() { 6 return new PaginationInterceptor(); 7 }2、分页Controller方法 HospitalSetController中添加分页方法1 ApiOperation(value "分…

Python学习基础笔记四十二——序列化模块

1、序列化的概念&#xff1a; 序列&#xff1a;就是字符串。 序列化&#xff1a;将原本的字典、列表等内容转换成一个字符串数据类型的过程就叫做序列化。 反序列化&#xff1a;从字符串到数据类型的过程。 2、序列化的目的&#xff1a; 1、以某种存储形式使自定义的数据持…

servlet+Mysql实现的校园论坛管理系统(功能包含登录,首页帖子查看、发帖、个人帖子删除编辑、帖子评论回复、用户管理等)

博客目录servletMysql实现的校园论坛管理系统实现功能截图系统功能使用技术代码完整源码servletMysql实现的校园论坛管理系统 本系统是一个简单的校园论坛系统&#xff0c;学生可以在线发帖并进行帖子评论回复&#xff0c;同同时管理员可以对用户进行管理。 (文末查看完整源码…

win11: cmake+glfw+imgui

下载源码&#xff1a;imgui github地址 将需要的文件拖拽入项目外部库的imgui文件夹 backends文件夹里选择与环境适配的文件&#xff0c;我这里用了glfw和opengl3 目录结构&#xff1a; CMakeLists.txt cmake_minimum_required(VERSION 3.24) project(proforlearn) set(CM…

基于java+springmvc+mybatis+jsp+mysql的实验室计算机故障报修系统

项目介绍 本系统采用java语言开发&#xff0c;后端采用ssm框架&#xff0c;前端采用jsp技术&#xff0c;数据库采用mysql进行数据存储。 前端页面&#xff1a; 功能&#xff1a;首页、设备信息、公告资讯、个人中心、后台管理、联系客服 管理员后台页面&#xff1a; 功能&…

电子学会2020年12月青少年软件编程(图形化)等级考试试卷(二级)答案解析

目录 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 二、判断题&#xff08;共10题&#xff0c;每题2分&#xff0c;共20分&#xff09; 三、编程题【该题由测评师线下评分】&#xff08;共2题&#xff0c;共30分&#xff09; 青少年软件…

业务流程监控:让多维度监控有了灵魂

需求 《可视化业务流程监控&#xff0c;是解决方案更是运维之道&#xff01;》一文让我们知道可以借助Grafana 两个插件&#xff1a;Diagram、FlowCharting&#xff0c;满足我们对于图形数据业务流程的可视化监控&#xff0c;但是在使用前需要我们做好以下两点工作&#xff1a…