【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 {
    @Override
    protected 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/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://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逻辑视图名即可
在这里插入图片描述

    @Override
    protected 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:视图解析器(由框架提供),主要进行视图解析,根据逻辑视图名解析出真正的视图。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GPT 在目标设定中的应用:实现梦想的技术方法

在技术快速进步的时代&#xff0c;我们设定和实现目标的方式正在不断发展。 该领域最重要的创新之一是引入生成式预训练 Transformer (GPT)。 本文将探讨 GPT 技术如何彻底改变目标设定的艺术&#xff0c;提供实用的见解和案例研究来展示其影响。 GPT 和目标设定简介 ​ 了解 …

kali——勒索病毒metasploit

我先来叙述一下大致流程&#xff1a; 1、使用mfs对 445端口进行攻击获得一系列权限 2、更新mfs版本 3、使用search 17_010对命令进行查看 4、use auxiliary/scanner/smb/smb_ms17_010使用该模块设置靶机set rhosts 靶机ip和设置本机监听端口 set lhost 0-65535 5、options…

中医药性笔记

目录 当归黄芪党参白术甘草茯苓半夏陈皮升麻柴胡 当归 补血。 当归&#xff0c;腾讯医典 黄芪 土金之药。 补中气的同时补肺气。益卫固表、利水消肿、 腾讯医典黄芪 党参 土金之药。健脾益肺&#xff0c;生津养血。 党参补气之力弱于人参、用于脾肺气虚的轻症。 党…

全量与增量的配置模式

在系统管理和数据处理领域&#xff0c;全量与增量配置是两种常见的方法&#xff0c;用于实现数据同步、更新部署或资源管理等任务。它们分别适用于不同的场景&#xff0c;依据任务的特性和需求选择合适的配置模式&#xff0c;有助于优化资源利用、提高效率并确保数据或系统的准…

node-sass安装失败解决

老项目安装node-sass4.14.1一直失败 "node-sass": "^4.14.1",报错环境变量Path 中没有 python2.7 gyp verb check python checking for Python executable "python2.7" in the PATH安装python2.7,然后设置npm config set python C:\Python27 …

计算机缺少msvcp120.dll如何解决,7种详细的修复方法分享

msvcr120.dll文件是微软Visual C运行时库的一部分&#xff0c;版本号为12.0。这个DLL文件包含了许多用于支持在Windows上运行的应用程序的重要函数和组件。它是确保某些程序能够正确执行的关键组成部分&#xff0c;特别是那些使用C编写或依赖于某些Microsoft库的程序。 当用户…

【智能算法】回溯搜索算法(BSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2013年&#xff0c;P Civicioglu等人受到当前种群与历史种群之间的差分向量的引导启发&#xff0c;提出了回溯搜索算法&#xff08;Backtracking Search Algorithm, BSA&#xff09;。 2.算法原理…

MySQL及SQL语句

SQL语句 数据库相关概念数据查询语言&#xff08;DQL&#xff09;基本查询数据类型条件查询多表查询子查询 数据操作语言&#xff08;DML&#xff09;数据定义语言&#xff08;DDL&#xff09;数据控制语言&#xff08;DCL&#xff09;MySQL数据库约束视图练习题 数据库相关概念…

【总结】CycleGAN+YOLOv8+DeepSORT

本文章仅对本人前期工作进行总结&#xff0c;文章内容供读者参考&#xff0c;代码不对外公开 文章目录 1、CycleGAN1.1 数据集配置1.2 环境配置1.3 参数配置1.4 可视化训练过程1.5 训练结果1.5 结果测试 2、YOLOv82.1 数据集配置2.2 网络结构配置2.3 训练细节2.4 测试 3、Deep…

应用部署tomcat的三种方式

由于一直在用springboot框架&#xff0c;集成了tomcat&#xff0c;快忘记如何单独部署tomcat了&#xff0c;以下&#xff0c;记录一下&#xff1a; 部署tomcat有三种方式&#xff1a; 一、方式一&#xff1a;将war包丢进webapps 这是最简单粗暴的方式&#xff1a;将web工程打…

C++“流”风格日志系统实战-课程简介

一个能快速提升C复杂代码设计的学习项目&#xff0c;一个能迅速让C面试官会心一笑的简历项目&#xff0c;一个能在实际项目中使用的项目……学习什么是流&#xff1f;如何利用抽象层面的流编写适用面更广的代码&#xff1f; 每天在用的cout和cin 它们是什么类型&#xff1f;最后…

RadarScenes数据集详细说明

0 引言 RadarScenes数据集包含安装在一辆测量车辆上的四个汽车雷达传感器的数据。该数据集记录于2016年至2018年在德国乌尔姆。该数据集官方网址为RadarScenes - RadarScenes&#xff0c;详细的信息可以从该网址获取。 机器学习领域的一些出版物使用了该数据集。雷达场景论文…

【C++】类和对象④(类的默认成员函数:取地址及const取地址重载 | 再谈构造函数:初始化列表,隐式类型转换,缺省值)

&#x1f525;个人主页&#xff1a;Forcible Bug Maker &#x1f525;专栏&#xff1a;C 目录 前言 取地址及const取地址操作符重载 再谈构造函数 初始化列表 隐式类型转换 explicit关键字 成员变量缺省值 结语 前言 本篇主要内容&#xff1a;类的六个默认成员函数中…

RK3568 学习笔记 : u-boot 千兆网络功能验证

前言 开发板型号&#xff1a; 【正点原子】 的 RK3568 开发板 使用 虚拟机 ubuntu 20.04 编译 RK3568 Linux SDK&#xff0c;生成镜像&#xff0c;烧写后&#xff0c;Linux 系统正常启动 开启后可以使用 CTRLC 进入 u-boot 本篇验证一下 u-boot 下网络功能 【正点原子】 rk…

TMS运输管理系统:开启高效物流之门的钥匙

TMS运输管理系统是一种集货运计划、路径规划、运输执行和跟踪管理于一体的综合管理系统。它利用现代信息技术和互联网资源&#xff0c;帮助企业高效管理供应链&#xff0c;提高物流效率和降低物流成本。本文将从系统优势、功能模块和应用案例等多个方面详细介绍TMS运输管理系统…

PHP校验15位和18位身份证号

第十八位数字的计算方法为&#xff1a; 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分 别为&#xff1a;7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 2.将这17位数字和系数相乘的结果相加。 3.用加出来和除以11&#xff0c;看余数是多少&#xff1f; 4…

ESP32-Thonny 拍摄图片到SD卡

前言&#xff1a; 代码运行在Thonny 添加main.py到单片机中&#xff1a; 可以先运行一下试试&#xff1a;会输出以下信息&#xff1a; 没有问题的话&#xff08;SD卡挂载成功&#xff0c;摄像头初始化成功&#xff09;运行一次主程序后&#xff0c;闪光灯会闪烁一下。 代码&…

React首次加载渲染2次的问题

在开发React项目的时候&#xff0c;发现useEffect会调用2次的情况&#xff0c;依赖数组明明没有变化&#xff0c;怎么会调用2次&#xff1f;百思不得其解&#xff0c;依赖没变化的话&#xff0c;那肯定是整个组件重渲染了。 最最简单的代码如下&#xff1a; const container …

Python | Leetcode Python题解之第41题缺失的第一个正数

题目&#xff1a; 题解&#xff1a; class Solution:def firstMissingPositive(self, nums: List[int]) -> int:n len(nums)for i in range(n):while 1 < nums[i] < n and nums[nums[i] - 1] ! nums[i]:nums[nums[i] - 1], nums[i] nums[i], nums[nums[i] - 1]for …