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

news2024/9/30 21:28:00

目录

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

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

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

相关文章

通用大模型研究重点之五:model services

Trtion https://github.com/openai/triton https://www.nvidia.cn/gpu-cloud/ngc-nvidia-triton/ https://github.com/openai/openai-cookbook https://github.com/openai/openai-python Triton 是一个由 NVIDIA 开发的开源推理服务平台&#xff0c;旨在简化和优化生产环境中的…

windows11 iis10中.net4.5不能用解决方法

问题iis设置4.0后运行程序提示web.config配置错误 解决方法&#xff1a; 管理员身份运行命令提示符分别运行如下命令&#xff1a; dism /online /enable-feature /featurename:IIS-ISAPIFilter dism /online /enable-feature /featurename:IIS-ISAPIExtensions dism /onli…

模拟量和开关量傻傻分不清?戳这文

在电子工程中&#xff0c;模拟量和开关量是最基本的信号类型&#xff0c;但它们在表示和处理方式上有着显著的不同。对于初入行的电子工程师来说&#xff0c;很容易混淆这两者。本文将用简洁明了的方式解释这两种信号类型&#xff0c;让你轻松掌握它们的区别。 1、模拟量 模拟…

js作业微博发言

微博 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible" content&q…

三款热门婴儿洗衣机深度测评,希亦、觉飞、RUUFFY谁更好用?

近几年科技高速发展&#xff0c;我们的生活也因此变得更加便捷、健康高效。尤其是在家庭生活中&#xff0c;各种新兴家电的出现让我们的生活变得更加健康卫生。婴儿洗衣机也为现代家庭提供了极大的便捷。由于婴儿刚出生免疫力比较弱&#xff0c;所以建议婴儿的衣物尽量和大人的…

在C#中,PDFsharp库使用(三):PDF提取

PDF提取 一、PDF提取功能&#xff0c;看图 二、PDF提取界面 三、PDF提取代码 //pdf提取---选择文件Button private void button9_Click(object sender, EventArgs e) {string oneFilePath GetOneFilepath();if (!string.IsNullOrEmpty(oneFilePath)){textBox3.Text oneFilePa…

Java多线程交替打印

多线程交互 在Java中&#xff0c;可以使用synchronized关键字或者java.util.concurrent包中的工具来实现多线程交替打印。以下是一个使用synchronized关键字的示例&#xff1a; public class AlternatePrinting {private static final Object lock new Object();private sta…

设计模式之创建型模式---工厂模式

文章目录 工厂模式概述简单工厂简单工厂的代码实现简单工厂的使用简单工厂应用场景 工厂方法工厂方法模式的代码实现工厂方法的使用工厂方法应用场景 抽象工厂抽象工厂模式代码实现抽象工厂的使用方法抽象工厂模式的应用场景 总结 工厂模式概述 工厂模式从名字就能看出&#x…

【Java笔记】如何创建自己的注解+注解怎么用于反射+SpringBoot常见注解

文章目录 0. 为什么SpringBoot要整这么多注解&#xff1f;1. 一些基础知识1.1 什么是注解1.2 Java内置注解1.2.1 作用在代码上的注解1.2.2 作用在注解的注解&#xff08;元注解&#xff09;1.2.3 Java 7之后的新注解 1.3 注解的作用1.4 如何实现一个自己的注解&#xff1f;1.4.…

向量的求导

参考&#xff1a; 向量的求导 向量内积求导

如何提交已暂存的更改到本地仓库?

文章目录 如何提交已暂存的更改到本地Git仓库&#xff1f;步骤1&#xff1a;确认并暂存更改步骤2&#xff1a;提交暂存的更改到本地仓库 如何提交已暂存的更改到本地Git仓库&#xff1f; 在Git版本控制系统中&#xff0c;当你对项目文件进行修改后&#xff0c;首先需要将这些更…

Diffusion Model原理剖析

目录 前言1. DDPM演算法初览2. 图像生成模型共同目标3. VAE: Lower bound of l o g P ( x ) logP(x) logP(x)4. Diffusion Model背后的数学原理5. 为什么需要Sample?6. Diffusion Model的应用7. Diffusion Model成功的关键总结参考 前言 接着上篇文章 图像生成模型浅析&#…

四川古力未来科技抖音小店:科技新宠,购物新选择

在数字化浪潮席卷全球的今天&#xff0c;电商行业日新月异&#xff0c;新兴平台层出不穷。四川古力未来科技抖音小店&#xff0c;作为其中的佼佼者&#xff0c;凭借其独特的魅力和创新的服务模式&#xff0c;正逐渐成为消费者眼中的购物新宠。 一、四川古力未来科技抖音小店的独…

深度卷积神经网络的整体运行流程(以alexnet为例)

0.基础概念&#xff08;复习一下&#xff09; 1.小批量随机梯度下降 目的&#xff1a; 希望找到最佳的参数&#xff0c;使损失函数最小。 使损失函数对w求导&#xff08;b就是x等于1的w&#xff09;&#xff0c;一个小批次的/eta&#xff08;学习率&#xff09;*小批次的平均…

2024团体设计天梯赛之L1-101 别再来这么多猫娘了

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

上市公司数字化转型速度测-含代码及原始数据(2000-2022年)

数据来源&#xff1a;Wind数据库、企业年报时间跨度&#xff1a;2000-2022年 其中吴非、赵宸宇版本的数据是从2000到2022年&#xff1b;袁淳版本和李瑛玫版本的数据均是从2001-2022年。数据范围&#xff1a;上市公司数据指标&#xff1a;计算了三份测算数字化转型速度的数据。其…

Java中的构造器

即使在类中什么都不写也会自动的生成一个构造器 注意 使用new关键字是在调用构造器 如果定义了有参构造 那么就不会默认的走Person person new Person();如果没有自己手动的定义无参构造就不能使用 在idea中 用按键Altinsert可以快速生成有参、无参构造&#xff08;某些品牌的…

yolov8-obb旋转目标检测详细流程

一、数据标注 由于旋转目标标注与传统的目标检测标注有一定的区别&#xff0c;故使用roLabelImg或者labelimg2进行标注&#xff0c;以下标注软件选用的是roLabelImg。 roLabelImg下载地址&#xff1a;https://github.com/cgvict/roLabelImg 直接在原有的labelimg环境中使用roL…

宝塔面板国际版aaPanel 精简版安装

宝塔面板国际版aaPanel 精简版安装 很多人都知道宝塔面板&#xff0c;但不知道宝塔面板还有英文版&#xff0c;宝塔面板英文版不是单纯的宝塔面板的翻译&#xff0c;而是根据老外的使用习惯及国外的网络环境做了一定的优化&#xff0c; 比如&#xff1a;去掉了手机号验证、去…

关于淘宝API接口请求数据的靠谱方式,主要包括以下几个方面:

关于淘宝API接口请求数据的靠谱方式&#xff0c;主要包括以下几个方面&#xff1a; 了解API接口和请求方式&#xff1a; API接口采用通用的HTTP协议&#xff0c;支持GET、POST等多种请求方式。GET方法主要用于向指定资源发出请求并返回实体主体内容&#xff0c;如查询、菜单列…