【Java框架】SpringMVC(一)——基本的环境搭建及基本结构体系

目录

  • MVC模式
    • 视图(View)
    • 控制器(Controller)
    • 模型(Model)
    • JSP Model1
    • JSP Model2
    • MVC的优点
    • MVC的缺点
  • Spring MVC架构
    • 介绍
    • 特点
  • SpringMVC环境搭建(在前面Spring整合Mybatis的基础上)
    • 1.创建控制器Controller
    • 2.创建springmvc配置文件,并添加Controller的Bean
    • 3.web.xml中配置springmvc.xml的加载(配置前端控制器)
    • 4.webapp下创建index.jsp
    • 5.配置Tomcat并启动,然后访问接口
    • 6.配置视图解析器
    • 7.优化Controller:注解驱动控制器
      • <context:component-scan />
      • <mvc:annotation-driven />
      • 代码示例
      • 思考:如果另外一个IndexController中也有一个hello接口,会怎样
  • 总结:SpringMVC的工作流程
    • Spring MVC体系结构
      • DispatcherServlet(前端控制器)
      • Handler(处理器):对应MVC中C(Controller层)
      • ModelAndView
      • 核心组件
        • HandlerMapping(处理器映射)
        • HandlerAdapter(适配器)
        • ViewResolver(视图解析器)
    • 面试题:简述SpringMVC工作流程?
      • 组件说明

MVC模式

  • MVC模式是指Model-View-Controller(模型-视图-控制器)模式,是开发Web应用程序时常用的一种代码分层模式。
  • MVC模式是软件工程中的一种架构模式,会强制性地把系统的输入、处理和输出分开,使系统从功能上形成Model-View-Controller三个基本部分。

视图(View)

对应组件:JSP或者HTML文件:负责格式化数据并把它们呈现给用户,包括数据展示、数据验证、界面设计等。

控制器(Controller)

对应组件:Servlet:负责接收并转发请求,对请求进行处理后指派视图并将响应结果发送给客户端。

模型(Model)

对应组件:JavaBean:模型对象拥有最多的处理任务,是应用程序的主体部分,它负责业务逻辑的处理和实现对数据的操作。

在这里插入图片描述

JSP Model1

在这里插入图片描述

JSP Model2

  • Servlet:接受前端请求并调用JavaBean
  • JavaBean:处理业务并操作数据库
  • JSP:将处理结果响应到浏览器呈现给用户
    在这里插入图片描述

MVC的优点

  1. MVC三个模块相互独立,松耦合架构
  2. 多视图共享一个模型,大大提高代码的可重用性
  3. 控制器提高了应用程序的灵活性和可配置性
  4. 有利于软件工程化管理

MVC的缺点

  1. 增加了系统结构和实现的复杂性,不适合小型规模的项目
  2. 视图层与模型之间需要控制器做中间的连接控制,所以效率较低

Spring MVC架构

介绍

  • Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。
  • Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等等。

特点

  • 用Controller替换JSP Model2模型中的Servlet
  • Controller收到请求后,完成业务处理并用Model模型对象存储处理结果
  • Controller调用相应的视图解析器View对处理结果进行视图渲染,最终客户端得到响应信息

SpringMVC环境搭建(在前面Spring整合Mybatis的基础上)

1.创建控制器Controller

public class HelloController extends AbstractController {@Overrideprotected ModelAndView handleRequestInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {System.out.println("HelloSpringMVC...");ModelAndView m = new ModelAndView("index.jsp");return m;}
}

2.创建springmvc配置文件,并添加Controller的Bean

springmvc-servlet.xml

<?xml version="1.0" encoding="UTF8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><bean name="/hello" class="cn.smbms.controller.HelloController"/>
</beans>

3.web.xml中配置springmvc.xml的加载(配置前端控制器)

  <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>

4.webapp下创建index.jsp

因为HelloController中的ModelAndView中返回的视图是index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>首页</title>
</head>
<body><h1>HelloSpringMVC!!!</h1><h1>你好,SpringMVC</h1>
</body>
</html>

5.配置Tomcat并启动,然后访问接口

localhost:8080/smbms/hello
在这里插入图片描述
在这里插入图片描述

6.配置视图解析器

通常情况下,jsp会放在/WEB-INF/下,因此可以配置一个固定的前缀和后缀,这样Controller返回页面时,只需要return逻辑视图名即可
在这里插入图片描述

    @Overrideprotected ModelAndView handleRequestInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {System.out.println("HelloSpringMVC...");//ModelAndView m = new ModelAndView("index.jsp");ModelAndView m = new ModelAndView("index");return m;}
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean>

在这里插入图片描述

7.优化Controller:注解驱动控制器

使用继承AbstractController 时,一个类只能表示一个接口,不便于开发,使用注解驱动控制器,可以对每个方法设置接口,提高开发效率,节省编码

<context:component-scan />

  • @Controller:标注一个普通的JavaBean成为可以处理请求的控制器
  • @RequestMapping:通过请求URL进行映射

<mvc:annotation-driven />

一键式配置,通过注解的方式进行Spring MVC开发

  • RequestMappingHandlerMapping
  • RequestMappingHandlerAdapter

代码示例

    <context:component-scan base-package="cn.smbms.controller"/><mvc:annotation-driven/><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean>
@Controller
public class HelloController {@RequestMapping("/hello")public String hello(){return "index";}@RequestMapping("/welcome")public String welcome(){return "welcome";}...
}

思考:如果另外一个IndexController中也有一个hello接口,会怎样

@Controller
public class IndexController {@RequestMapping("/hello")public String hello(){return "hello";}
}
  • 会报错,因此在一个系统中,不能有两个完全重名的接口

    [ERROR] 2024-04-19 11:04:31,774 org.springframework.web.servlet.DispatcherServlet - Context initialization failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'indexController' method 
    public java.lang.String cn.smbms.controller.IndexController.hello()
    to { /hello}: There is already 'helloController' bean method
    
  • 开发过程中,不能避免的一个Controller中的接口名与其他各个Controller中的接口名重复

  • 因此可以在各自的Controller的类名上加上一个各自的统一前缀

  • 如下示例,此时访问IndexController中的hello接口时,访问路径就应该是/index/hello

@Controller
@RequestMapping("/index")
public class IndexController {@RequestMapping("/hello")public String hello(){return "hello";}
}

总结:SpringMVC的工作流程

在这里插入图片描述

Spring MVC体系结构

DispatcherServlet(前端控制器)

  • Spring MVC最核心的类
  • web.xml中配置

Handler(处理器):对应MVC中C(Controller层)

  • 类型:Object
  • 作用:实际处理请求
  • 标注了@RequestMapping的所有方法都可以看作是一个Handler

ModelAndView

  • 逻辑视图名
  • 模型对象
    核心组件

核心组件

HandlerMapping(处理器映射)
  • BeanNameUrlHandlerMapping(默认)
    • 将请求URL映射到同名的控制器Bean上
  • DefaultAnnotationHandlerMapping
    • 将请求映射到标注@RequestMapping注解的控制器和处理方法上
  • RequestMappingHandlerMapping
HandlerAdapter(适配器)
  • AnnotationMethodHandlerAdapter
  • RequestMappingHandlerAdapter
ViewResolver(视图解析器)
  • InternalResourceView

面试题:简述SpringMVC工作流程?

在这里插入图片描述

  1. 浏览器发送请求送至前端控制器DispatcherServlet。
  2. DispatcherServlet收到请求后调用HandlerMapping处理器映射器。
  3. 处理器映射器找到具体的Handler处理器返回给DispatcherServlet。
  4. DispatcherServlet调用HandlerAdaptor处理器适配器。
  5. HandlerAdaptor去调用具体的处理器(Controller)。
  6. Controller返回一个ModelAndView对象给HandlerAdaptor。
  7. HandlerAdaptor将接收到的ModelAndView对象返回给DispatcherServlet。
  8. DispatcherServlet将ModelAndView对象传给ViewResolver视图解析器进行解析。
  9. ViewResolver视图解析器将解析的结果View返回给DispatcherServlet。
  10. DispatcherServlet根据View进行渲染视图。
  11. DispatcherServlet响应浏览器的请求。

组件说明

  1. DispatcherServlet:前端控制器(由框架提供),作为流程控制的中心,控制其他组件执行,统一调度,能够接受请求、响应结果。
  2. HandlerMapping:处理器映射器(由框架提供),根据用户请求的url路径找到负责处理的Handler处理器。
  3. HandlerAdaptor:处理器适配器(由框架提供),根据特定规则去执行Handler。
  4. Handler:处理器(需要自己开发),作为后端控制器,对具体用户的业务请求进行请求,并将处理的结果封装在ModelAndView对象中,并返回给调用者。
  5. ViewResolver:视图解析器(由框架提供),主要进行视图解析,根据逻辑视图名解析出真正的视图。

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

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

相关文章

# 从浅入深 学习 SpringCloud 微服务架构(二)模拟微服务环境(1)

从浅入深 学习 SpringCloud 微服务架构&#xff08;二&#xff09;模拟微服务环境&#xff08;1&#xff09; 段子手168 1、打开 idea 创建父工程 创建 artifactId 名为 spring_cloud_demo 的 maven 工程。 --> idea --> File --> New --> Project --> Ma…

2024 CKA 最新 | 基础操作教程(十七)

题目内容 设置配置环境&#xff1a; [candidatenode-1] $ kubectl config use-context ek8s Task 将名为 node02 的 node 设置为不可用&#xff0c;并重新调度该 node 上所有运行的 pods。 考点相关内容分析 node 在 Kubernetes&#xff08;K8s&#xff09;中&#xff0c…

VASA-1:一键生成高质量视频,颠覆你的想象!

VASA-1&#xff1a;语音生成AI视频 前言 最近&#xff0c;微软公司公布了一项图生视频的 VASA-1 框架&#xff0c;该 AI 框架只需使用一张真人肖像照片和一段个人语音音频&#xff0c;就能够生成精确逼真的相对应文本的视频&#xff0c;而且可以使表情和面部动作表现的十分自然…

【数据结构】栈和队列(链表模拟队列)

学习本章节必须具备 单链表的前置知识&#xff0c; 建议提前学习&#xff1a;点击链接学习&#xff1a;单链表各种功能函数 细节 详解 本章节是学习用 单链表模拟队列 1. 单链表实现队列 思路如下 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数…

线程互斥及基于线程锁的抢票程序

我们实现一个简单的多线程抢票程序。 #include<iostream> #include<thread> #include<unistd.h> #include<functional> #include<vector> using namespace std; template<class T> using func_tfunction<void(T)>;//返回值为void,…

XUbuntu18.04 源码编译Qt4.5.3的过程

由于新公司很多旧的软件都是基于这个版本做的嵌入式开发。 所以想要自己搭一套基于Linux的非嵌入式开发环境&#xff0c;方便用来调试和编译代码。 这样就可以完成在linux下开发&#xff0c;然后直接嵌入式打包&#xff0c;涉及到界面的部分就不需要上机调试看问题了。 所以…

Axure引用ECharts图表 解决火狐浏览器出错

Axure原型添加Echarts图表&#xff0c;没耐心看文章的可以直接下载示例 Axure中使用ECharts图表示例 1. 打开Axure新建页面 2. 页面添加元件 元件类型随意&#xff0c;矩形、动态面板、热区、图片 甚至段落都可以3. 命名元件 随意命名&#xff0c;单个页面用到多个图表时名…

机器学习-11-基于多模态特征融合的图像文本检索

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中图像文本检索技术。此技术把自然语言处理和图像处理进行了融合。 参考 2024年&#xff08;第12届&#xff09;“泰迪杯”数据挖掘挑战赛 图像特征提取&#xff08;VGG和Resnet特征提取卷积过程详解&…

Facebook账号运营要用什么IP?

众所周知&#xff0c;Facebook封号大多数情况都是因为IP的原因。Facebook对于用户账号有严格的IP要求和限制&#xff0c;以维护平台的稳定性和安全性。在这种背景下&#xff0c;海外IP代理成为了一种有效的解决方案&#xff0c;帮助用户避免检测&#xff0c;更加快捷安全地进行…

学习笔记:Vue2中级篇

Vue2 学习笔记&#xff1a;Vue2基础篇_ljtxy.love的博客-CSDN博客学习笔记&#xff1a;Vue2中级篇_ljtxy.love的博客-CSDN博客学习笔记&#xff1a;Vue2高级篇_ljtxy.love的博客-CSDN博客 Vue3 学习笔记&#xff1a;Vue3_ljtxy.love的博客&#xff09;-CSDN博客 文章目录 5.…

SpringCloud系列(5)--SpringCloud微服务工程公共部分提取

前言&#xff1a;在上一章节中我们创建了两个个SpringCloud工程&#xff0c;但在两个工程中分别存在着一些重复的部分&#xff0c;例如重复的实体类&#xff08;如图所示&#xff09;&#xff0c;这样会造成系统的冗余&#xff0c;所以我们需要把公共的类提取到一个工程里&…

JavaScript变量及数据类型

目录 概述&#xff1a; 变量&#xff1a; 前言&#xff1a; 变量的命名&#xff1a; 定义变量&#xff1a; 为变量赋值&#xff1a; 变量提升&#xff1a; let和const关键字&#xff1a; JS数据类型&#xff1a; 前言&#xff1a; typeof操作符&#xff1a; JS基本…

RK3588 Android13 鼠标风格自定义动态切换

前言 电视产品,客户提供了三套鼠标图标过来,要求替换系统中原有丑陋风格且要支持动态切换, 并且在 TvSetting 中要有菜单,客户说啥就是啥呗,开整。 效果图 test framework 部分修改文件清单 png 为鼠标风格资源图片,这里就不提供了,可自由找一个替换一下就行 framew…

渐进时间复杂度O(n)

基本操作数 算法的运行速度受计算机性能的影响&#xff0c;所以通常考虑算法效率的不是算法运行的实际用时&#xff0c;而是算法运行所需要进行的基本操作的数量。 像加减乘除、访问变量、给变量赋值等都可以看作基本操作。对基本操作的计数或是估测可以作为评判算法用时的指标…

Python turtle海龟绘制美国队长盾牌

使用Python中的turtle模块绘制美队盾牌 具体思路如下&#xff1a; 导入海龟库第1个圆&#xff1a;半径 200&#xff0c;红色填充第2个圆&#xff1a;半径 150&#xff0c;白色填充第3个圆&#xff1a;半径 100&#xff0c;红色填充第4个圆&#xff1a;半径 50&#xff0c;蓝色…

CSS基础常用属性之字体属性(如果想知道CSS的字体属性知识点,那么只看这一篇就足够了!)

前言&#xff1a;在我们学习CSS的时候&#xff0c;主要学习选择器和常用的属性&#xff0c;而这篇文章讲解的就是最基础的属性之一——文字属性。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 废话不多说&#xff0c;让我们直…

【C++】C++11 包装器

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 function包装器 fu…

RHCE:网络服务综合项目

基础配置&#xff1a; 1.配置主机名&#xff0c;静态IP地址 2.开启防火墙并配置 3.部分开启SElinux并配置 4.服务器之间使用同ntp.aliyun.com进行时间同步 5.服务器之间实现SSH免密登录 业务需求&#xff1a; 1.Server-NFS-DNS主机配置NFS服务器&#xff0c;将博客网…

【Lattice FPGA 开发】Modelsim与Diamond联合仿真

本文讲解Modelsim与Diamond进行联合仿真步骤&#xff0c;以及对遇到问题的解决与说明。 文章目录 软件版本0. Diamond设置文件为仿真文件特别注意 1. Diamond设置仿真软件为Modelsim2. Modelsim编译Lattice的库文件2.1 新建文件夹存放库文件2.2 Modelsim中建立新的仿真库2.2.1…

千锤百炼之算法Scanner和System.out引起超时解决办法

题外话 觉得这个内容还是很关键的,过来写一下吧 本次内容有点抽象大家试着听一下 正题 做过算法题的人都知道,无论是在力扣还是牛客或者别的网站刷题,很多情况下都会遇到输入输出的情况,当我们用Scanner和System.out.print()就有可能产生超时问题 如下图 接下来会有一段代…