SpringMVC学习

news2024/11/15 19:40:38

SpringMVC

  • Spring MVC概述:
    • **什么是Spring MVC ?**
    • **什么是MVC?**
  • 第一个SpringMVC程序
    • 具体步骤:
    • 具体实现:
    • 第一个SpringMVC小程序的完善

Spring MVC概述:

什么是Spring MVC ?

他是基于MVC开发模式的框架,用来优化控制器,他是Spring家族的一员,它也具备IOCAOP。他是基于spring的一个框架,实际上就是spring的一个模块,专门做web开发web开发底层就是servlet框架就是在servlet基础上面加入一些功能,让你做web开发更加方便)的,可以简单的理解为一个servlet的升级

我们要做的是什么?

我们需要使用@Controller创建控制器对象**(创建的是一个普通类对象,不是servlet,spring mvc赋予了控制器对象一些额外的功能)**,把对象放入到springmvc容器中,把创建的对象作为控制器使用,这个控制器对象能接收用户请求,显示处理结果,可以把它当做是一个servlet(但他绝对不是servlet

web开发流程:

index.jsp---------->DispaterServlet(Servlet)--------转发,分配给----Controller对象(就是用@Controller注解创建的对象)

web开发底层是servlet,SpringMVC中有一个对象是servlet,这个对象就是**DispaterServlet**** :负责接收用户的所有请求,用户把请求给了DispaterServlet,之后DispaterServlet把请求转发给我们的Controller对象,最后是Controller对象处理请求

什么是MVC?

他是一种开发模式,是模型视图控制器的简称,所有的web应用都是基于MVC开发的

**M:**模型层,包含实体类、业务逻辑层、数据访问层

**V:**视图层,用来呈现数据的,例如:html,javascript,vue等

**C:**控制器,用来接收客户端的请求,并返回响应到客户端的组件,Servlet就是组件

在这里插入图片描述

Spring MVC优点:

  1. 轻量级的,基于MVC的框架
  2. 易于上手,容易理解,功能强大
  3. 它具备IOC和AOP
  4. 完全基于注解开发

在这里插入图片描述

SpringMVC的执行流程

在这里插入图片描述

上图的执行流程说明:

  1. 向服务器发送HTTP请求,请求被前端控制器 DispatcherServlet 捕获。

  2. DispatcherServlet 根据中的配置对请求的URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用 HandlerMapping 获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。

  3. DispatcherServlet 根据获得的Handler,选择一个合适的 HandlerAdapter。

  4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:

HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息。

数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。

数据格式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等。

数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。

  1. Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象。

  2. 根据返回的ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet。

  3. ViewResolver 结合Model和View,来渲染视图。

  4. 视图负责将渲染结果返回给客户端

详细解析:一个好汉三个帮,这个好汉是指DispaterServlet

DispatcherServlet(中央调度器):**SpringMVC框架的核心处理器。由DispatcherServlet调用第一个帮手:HandlerMapper(地址映射器),然后再调用第二个帮手:**HandlerAdpter(处理器适配器)**在这里面创建当前的处理器对象,由所创建出来的处理器对象来调用业务逻辑层,再去调用数据访问层,然后将结果一层层的返回至DispatcherServlet中,DispatcherServlet再调用第三个帮手:**ViewResolver(他是用来返回客户端请求对的地址拼接)**Hander只需要返回上图中的main给DispaterSeverlet即可,ViewResolver会进行地址的拼接

第一个SpringMVC程序

项目案例功能:用户提交一个请求,服务端处理器在接收到这个请求后,给出一条欢迎信息,在响应页面中显示该信息。

具体步骤:

  1. 新建web maven工程

  2. 加入依赖:spring-webmvc依赖,简介的把spring的依赖都加入到了项目;jsp依赖、servlet依赖

  3. 重点:在web.xml文件中注册springmvc框架的核心对象DispaterServlet

    • 它叫做中央调度器,是一个servlet,他的父类是继承HttpServlet
    • 它负责接收客户端的请求,并根据请求的路径分派给对应的**action(控制器)**进行处理,处理结束后依然由核心处理器DispatcherServlet进行响应返回,将请求结果显示给用户
    • 它也叫做前端控制器(form controller)
  4. 删除index.jsp页面,重新建index.jsp页面,因为自动生成的页面缺失指令设置。

  5. 创建控制器类

    • 在类上面加入@Controller注解,创建对象,并放入到springmvc容器中
    • 在类的方法上面加入@RequestMapping注解(表示路径映射。该注解可以加在类上相当于包名,还可以加在方法上相当于action的名称,都是来指定映射路径的
  6. 创建一个作为结果的jsp,显示请求的处理结果

  7. 创建springmvc的配置文件(和spring的配置一样),在工程的类路径即resources目录下创建 SpringMVC 的配置文件 springmvc.xml。该文件名可以任意命名。推荐使用springmvc.xml.

    • 在这个文件里面要声明组件扫描器,指定@Controller注解所在的包名。< context:component-scan>:用来进行包扫描,这里用于指@Controller注解所在的包路径
    • 声明视图解析器,帮助处理视图。SpringMVC框架为了避免对于请求资源路径与扩展名上的冗余,在视图解析器InternalResouceViewResolver 中引入了请求的前辍与后辍。而action中只需给出要跳转页面的文件名即可,对于具体的文件路径与文件扩展名,视图解析器会自动完成拼接

注意:

注册springmvc的核心对象Dispatcherservlet需要在tomcat服务器启动后,创建Dispatcherservlet对象的实例。

为什么要创建Dispatcherservlet对象的实例呢?
因为Dispatcherservlet在他的创建过程中,会同时创建springmvc容器对象,读取springmvc的配置文件,把这个配置文件中的对象都创建好,当用户发起请求时就可以疸接使用对象了。

servlet的初始化会执行init ()方法。DispatcherServlet在init ()中{

创建容器,读取配置文件
webApplicationcontext ctx = new ClassPathxmApplicationcontext(“springmvc.xml”)

把容器对象放入ServletContext中:

getServletContext().setAttribute(key,ctx);

具体实现:

新建web

在这里插入图片描述

添加依赖

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.2.12.RELEASE</version>
</dependency>
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.1</version>
</dependency>

将自动生成的web.xml删了,重新新建

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
                      https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0"
        >
</web-app>

在web.xml中注册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.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>

新建一个index.jsp文件(因为自动创建出来的没有指定的编码方式以及一些指令)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首页发送请求</title>
</head>
<body>
    <h1>发送请求</h1>
    <!--当前路径是一个有斜杠的相对路径,参照路径就是当前的web服务器的根路径:http://localhost:8008/
   点击链接之后提交的URL绝对地址是:  http://localhost:8008/some.do
-->
    <h1><a href="/some.do">前面加斜杠:点击发送some.do请求</a></h1>

    <!-- 当前路径是前面没有斜杠的相对路径,参照的路径就是当前页面的路径:
参照的路径是http://localhost:8008/项目名/some.do-->
    <h1><a href="some.do">前面不加斜杠:点击发送some.do请求</a></h1>
</body>
</html>

编写控制器

package com.cxy.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MyController {
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","我的第一个SpringMVC程序");
        mv.addObject("fun","这个是一个函数方法");

        mv.setViewName("/show.jsp");
        return mv;
    }
}

编写视图(show.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Show页面展示数据</title>
</head>
<body>
    <h1>msg信息:${msg}</h1>
    <h2>fun information:${fun}</h2>

</body>
</html>

要注意需要在springmvc.xml文件中配置组件扫描器

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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
">

    <context:component-scan base-package="com.cxy.springmvc.controller"/>

</beans>

第一个SpringMVC小程序的完善

当前程序不完善之处:

  1. 当在浏览器的地址栏直接输入show.jsp的时候能够直接访问页面

    • 有些时候我们希望个别页面是用户无法直接在地址栏输入信息即可直接访问的,这个时候我们可以:将我们希望受到保护的文件放在WEB-INF目录下
  2. 当控制类中有多个请求路径时,设置视图的时候需要重复的编写代码

    • 在这里插入图片描述

    • 这些重复的代码,springmvc框架可以帮助我们实现简便开发

    • 在springmvc.xml文件中配置视图解析器:视图解析器可以使用逻辑名称(文件名)来指定视图。

    • 框架会使用视图解析器的 前缀+逻辑名称+后缀组成完整路径,这里就是字符串的连接操作

      • 详细代码:

        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/view/"></property>
            <property name="suffix" value=".jsp"/>
        </bean>
        

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

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

相关文章

数学建模英文论文的写作方法和步骤

目录 一、语言技巧 二、论文结构 1.标题写作 2.摘要写作时态​编辑 2.2摘要写作语态 2.3摘要写作人称 2.4摘要写作注意事项 3.问题重述 4. 符号说明​编辑 三线表 ​5.模型假设(以三到七个合理假设为宜 ) 6.模型分析及建立模型 7.模型求解 8.模型检验 9.模型优…

电视剧里的代码真能运行吗?

大家好&#xff0c;欢迎来到 Crossin的编程教室 &#xff01; 前几天&#xff0c;后台老有小伙伴留言“爱心代码”。这不是Crossin很早之前发过的内容嘛&#xff0c;怎么最近突然又被人翻出来了&#xff1f;后来才知道&#xff0c;原来是一部有关程序员的青春偶像剧《点燃我,温…

022_SSS_Novel View Synthesis with Diffusion Models

Novel View Synthesis with Diffusion Models 1. Introduction 本文利用diffusion模型&#xff0c;在给定参考图的条件下&#xff0c;生成指定pose的图像&#xff0c;作者称为3DiM。并且可以在给定一张特定视角的图的条件下&#xff0c;生成其他所有视角的图。 本文的主要贡…

Treap 原理详解和实战

一 点睛 Treap 指 Tree heap&#xff0c;又叫作树堆&#xff0c;同时满足二叉搜索树和堆两种性质。二叉搜索树满足中序有序性&#xff0c;输入序列不同&#xff0c;创建的二叉搜索树也不同&#xff0c;在最坏的情况下&#xff08;只有左子树或只有右子树&#xff09;会退化为…

CMCT-FA修饰阿霉素纳米脂质体/ADR-HAS-MS单抗Hab18偶联阿霉素人血清白蛋白微球的制备方法

瑞禧生物这里整理的内容是CMCT-FA修饰阿霉素纳米脂质体/ADR-HAS-MS单抗Hab18偶联阿霉素人血清白蛋白微球的相关制备方法&#xff0c;来学习&#xff01; MCT-FA修饰阿霉素纳米脂质体的研究&#xff1a; 利用1-乙基-3-(3-二甲基丙基)-碳二亚胺(EDC)介导 反应合成了叶酸偶联的羧甲…

LeetCode刷题---160. 相交链表(双指针-对撞指针)

文章目录一、编程题&#xff1a;160. 相交链表&#xff08;双指针-对撞指针&#xff09;1.题目描述2.示例1&#xff1a;3.示例2&#xff1a;4.示例3&#xff1a;5.提示&#xff1a;6.提示&#xff1a;二、解题思路1.思路2.复杂度分析&#xff1a;3.算法图解三、代码实现总结一、…

CSS——图标字体

为什么需要图标字体&#xff1f; 在网页中经常会有需要使用一些图标的地方&#xff0c;比如&#x1f6d2; &#xff0c; &#x1f464;&#xff0c;⏫等等&#xff0c;虽然我们可以通过图片来引入图标&#xff0c;但是图片本身比较大&#xff0c;页面刷新加载图片耗时不说&…

[附源码]java毕业设计小区疫情防控系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

知乎乱码、b站首页乱码、蓝奏云网盘打不开都是DNS惹的祸!修改设备的DNS

知乎乱码、b站首页乱码、蓝奏云网盘打不开等问题&#xff0c;常常是连接WiFi的时候会出现&#xff0c;一旦将手机切换为蜂窝、或者给电脑用蜂窝热点这个问题就能解决&#xff1a; 接下来教一下大家如何修改自己设备的DNS,从而 修复知乎乱码、b站首页乱码、蓝奏云网盘打不开 0.…

八环氧环己基乙基笼状聚倍半硅氧|八苯胺丙基poss

八环氧环己基乙基笼状聚倍半硅氧 外观&#xff1a;透明&#xff0c;淡黄色半固体状物 黏度&#xff1a;50000cps&#xff08;60℃&#xff09; 密度&#xff1a;1.25g/ml 分子量&#xff1a;1418 环氧当量&#xff1a;177 折射率&#xff1a;1.52 溶解性&#xff1a;溶于…

所见即所得的3D打印建模设计

3D打印机安装好后&#xff0c;需要的软件环境&#xff1a; 1. Cura 这类切片软件&#xff1b; 用于将STL等模型文件转换成3D打印的执行指令集&#xff0c;其实就是G-CODE的组合&#xff0c;有些还支持在线调试。 Simplify3D https://download.csdn.net/download/pocean2012…

深度剖析数据在内存中的存储

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C/C】 目录1.数据类型详细介绍1.1数据类型介绍1.2类型的基本归类2.整型在内存中的存储3.大小端字节序介绍及判断什么是大端小端&#x…

[附源码]Python计算机毕业设计茶叶产品质量安全可追溯系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

尚医通 (二十八) --------- 医院管理相关 (引入注册中心、远程调用)

目录一、医院管理医院管理效果展示二、注册中心与服务调用1. Nacos 概述2. 注册服务三、医院管理实现1. 医院列表2. service-cmn 模块提供接口3. 封装 Feign 服务调用4. 医院接口远程调用数据字典5. 添加数据字典显示接口6. 医院列表前端一、医院管理 目前我们把医院、科室和排…

函数栈帧的创建和销毁

“总有人间一两风&#xff0c; 填我十万八千梦” &#x1f351;作者&#xff1a;小赛毛 &#x1f495;文章初次日期&#xff1a;2022/11/21 目录 函数栈帧解决了什么问题&#xff1f; 什么是栈&#xff1f; 什么是寄存器&#xff1f; 函数栈帧的创建和销毁 预热知识准备&a…

Flink DataStream API 介绍

Flink DataStream API 介绍 StreamExecutionEnvironment #mermaid-svg-JKeWa22W2vWA4zBS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JKeWa22W2vWA4zBS .error-icon{fill:#552222;}#mermaid-svg-JKeWa22W2vWA4z…

使用element-ui实现树形穿梭框

<template><div class"transferTreeBox"><!-- 左侧待选内容 --><div class"SelectBox"><div class"boxTitle" click"clickAllSelect">全选 ></div><div class"boxCenter"><…

【Hack The Box】Linux练习-- Frolic

HTB 学习笔记 【Hack The Box】Linux练习-- Frolic &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年9月7日&#x1f334; &#x1f36d…

dumi 2,它来了它来了它来了

dumi 1.0 在 2020 年 3 月 2 日正式发布&#xff0c;到今天一共有 80 位 Contributor、提交 1100 Commit、为近 4000 个开源项目提供了组件库/站点的文档方案&#xff1b;dumi 作为一个 GitHub 数亿开源项目中的渺小一粒&#xff0c;能有这么多人共同参与、能为这么多项目提供价…

【JAVA程序设计】(C00097) 基于SSM的果树溯源可视化管理系统

基于SSM的果树溯源可视化管理系统项目简介项目获取开发环境项目技术运行截图项目简介 基于ssm框架的果树溯源可视化管理系统&#xff0c;本系统分为二种用户&#xff1a;管理员、农户 管理员角色包含以下功能&#xff1a; 登录、农户管理、商家管理、果树管理、地块管理、农资…