【SpringMVC】| SpringMVC 入门

news2024/11/25 10:57:19

目录

一:SpringMVC 入门

1. SpringMVC简介

2. SpringMVC的优点

3. SpringMVC的优化

4. SpringMVC执行的流程

5. 基于注解的SpringMVC程序

图书推荐

一:《Spring Boot进阶:原理、实战与面试题分析》

二:《深入理解Java虚拟机》


一:SpringMVC 入门

1. SpringMVC简介

(1)首先我们先回忆一下MVC的三层架构?
它是一种开发模式,它是模型、视图、控制器的简称;所有的web应用都是基于MVC开发。
M:模型层,包含实体类、业务逻辑层、数据访问层。
V:视图层,html、javaScript、vue等都是视图层,用来显现数据。
C:控制器,它是用来接收客户端的请求,并返回响应到客户端的组件,Servlet就是组件。

(2)什么是SpringMVC?
它是基于MVC开发模式的框架,用来优化控制器,它是Spring家族的一员;也具备IOC和AOP。

(3)SSM框架的优化方向?

MyBatis是用来优化数据访问层(持久层框架)

SpringMVC是用来优化控制机器,例如:Servlet。

Spring是用来整合其它框架的

2. SpringMVC的优点

(1)基于MVC架构

基于 MVC 架构,功能分工明确;解耦合。

(2)容易理解,上手快,使用简单

可以开发一个注解的 SpringMVC 项目,SpringMVC 也是轻量级的,jar 很小;不依赖的特定的接口和类。

(3)具备IOC和AOP

方便整合Strtus、MyBatis、Hiberate等其他框架。

(4)强化注解的使用(全注解开发)

在Controller, Service, Dao 都可以使用注解,方便灵活。使用@Controller创建处理器对象、@Service创建业务对象,@Autowired 或者@Resource 在控制器类中注入 Service,在Service 类中注入 Dao。

3. SpringMVC的优化

(1)用户发出请求首先是要交给Tomcat服务器,然后检查web.xml配置;如果在里面配置了SpringMVC就把控制权交给这个框架

(2)SpringMVC调用控制器Controller,会对客户端提交的数据进行优化、携带数据进行优化、返回跳转进行优化。

(3)然后控制器调用业务逻辑层,业务逻辑层调用数据访问层;然后数据访问层连接数据库,最终返回数据。

4. SpringMVC执行的流程

(1)客户端向服务器发送HTTP请求,请求被前置控制器DispatcherServlet(SpringMVC框架的核心处理器) 捕获

(2)DispatcherServlet(前置控制器)【好汉】根据<servlet-name>中的配置对请求的URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用 HandlerMapping(地址映射器)【第一个小帮手】 获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。

(3)DispatcherServlet 根据获得的Handler选择一个合适的 HandlerAdapter(适配器)【第二个小帮手】,然后去调用业务逻辑层、数据访问层,最终一个ModelAndView对象

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

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

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

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

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

Handler执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象。

(5)根据返回的ModelAndView选择一个适合的 ViewResolver(视图解析器,必须是已经注册到Spring容器中的ViewResolver)【第三个小帮手】,主要是用来返回客户端请求地址拼接,分为前缀部分和后缀部分,最终返回给DispatcherServlet

(6)ViewResolver 结合Model和View,来渲染视图;视图负责将渲染结果返回给客户端。

5. 基于注解的SpringMVC程序

第一步:新建项目,选择webapp模板

第二步:修改目录,添加缺失的test,java、resources(两套),并修改目录属性

第三步:修改pom.xml文件,添加SpringMVC的依赖,添加Servlet的依赖

对于最后指定资源文件的解析:

maven默认会把src/main/resources下的所有配置文件以及src/main/java下的所有java文件打包或发布到target\classes下面;我们可能会在src/main/java下面也放置一些配置文件如:xxx.xml配置、xxx.properties配置;如果不做一些额外配置,那我们打包后的项目可能找不到这些必须的资源文件!

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

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.bjpowernode</groupId>
  <artifactId>SpringMVC-001</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>SpringMVC-001 Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <!--添加SpringMVC依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
    <!--添加Servlet依赖-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <!--指定资源文件-->
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
          <include>**/*.properties</include>
        </includes>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>**/*.xml</include>
          <include>**/*.properties</include>
        </includes>
      </resource>
    </resources>
  </build>
</project>

第四步:添加springmvc.xml配置文件指定包扫描,添加视图解析器

使用InternalResourceViewResolver(内部资源视图解析器),指定资源的前缀和后缀!

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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 https://www.springframework.org/schema/context/spring-context.xsd">
    <!--配置包扫描-->
    <context:component-scan base-package="com.bjpowernode.controller"/>
    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/admin/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

视图解析器配置的作用就是跳转页面,跳转到/admin/xxx.jsp页面,这里就假设跳转到main.jsp文件,就需要先创建一个admin目录,然后在目录中在创建一个mian.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>main.........</h1>
</body>
</html>

第五步:删除web.xml文件(版本低),新建web.xml;并在web.xml文件中注册springMVC框架

注:我们知道所有的web请求都是基于servlet的,但是SpringMVC的处理器本身却是一个普通的方法;所以需要核心处理器DispatcherServlet,DispatcherServlet要在web.xml文件中注册才可以使用!

①添加初始化配置:指定DispactherServlet要拦截什么样的请求?

②引入springmvc.xml配置:使用contextConfigLocation作为name,classpath:springmvc.xml作为value来引入springmvc.xml配置,告诉DispatchServlet处理!

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--注册SpringMVC框架-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--引入springmvc的核心配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--指定拦截什么样的请求
            例如:http://localhost:8080/demo.action
        -->
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
</web-app>

第六步:删除index.jsp页面(不合规范),并新建,发送请求给服务器

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--发送请求--%>
<a href="${pageContext.request.contextPath}/demo.action">访问服务器</a>
</body>
</html>

第七步:创建类似于Servlet功能的处理器action

分析:以前的Servlet的规范,protected void doPost

(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}必须是这种形式的
action中所有的功能实现都是由方法来完成的,action方法的规范:
①访问权限是public;
②方法的返回值任意;
③方法名称任意;
④方法可以没有参数,如果有可是任意类型;
⑤要使用@RequestMapping注解来声明一个访问的路径(名称);

注:如果不使用springMVC时,@Controller注解和@Service、@Component、@Repository注解没有什么差别的,但如果使用了springMVC,@Controller就被赋予了特殊的含义!spring会遍历上面扫描出来的所有bean,过滤出那些添加了注解@Controller的bean,将Controller中所有添加了注解@RequestMapping的方法解析出来封装成RequestMappingInfo存储到RequestMappingHandlerMapping中的mappingRegistry。后续请求到达时,会从mappingRegistry中查找能够处理该请求的方法。

package com.bjpowernode.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller // 交给spring容器去创建对象
public class DemoAction {
    /**
     * 1)访问权限是public
     * 2)方法的返回值任意
     * 3)方法名称任意
     * 4)方法可以没有参数,如果有可是任意类型
     * 5)要使用@RequestMapping注解来声明一个访问的路径(名称)
     */
    @RequestMapping("/demo")
    public String demo(){
        System.out.println("服务器被访问到了......");
        // 根据返回的main,就可以跳转到/admin/main.jsp页面上
        return "main";
    }
}

第八步:测试

首先访问的是index.jsp,当点击超链接时,会跳转到DemoAction(类似于Servlet的功能),然后返回一个“main”字符串

根据返回的字符串“mian”,核心处理器DispatcherServlet会根据注册的springmvc.xml文件里面的视图解析器:加上前缀和后缀,完成路径的拼接:/admin/main.jsp,最终完成页面的跳转

图书推荐

本期图书:《Spring Boot进阶:原理、实战与面试题分析》、《深入理解Java虚拟机》

参与方式:

本次送书暂定 1 本(二选一哦),超过1000浏览量加送一本! 
活动时间:截止到 2023-04-29 00:00:00。

抽奖方式:利用程序进行抽奖。

参与方式:关注博主(只限粉丝福利哦)、点赞、收藏,评论区随机抽取,最多三条评论!

一:《Spring Boot进阶:原理、实战与面试题分析》

推荐理由:Spring Boot已经成为Java程序员不得不学的技术。本书覆盖了Spring Boot的核心技术点,从基础概念开始逐步过渡到技术原理及需要重点关注的面试点,帮助读者在快速学会使用Spring Boot的同时,掌握Spring Boot技术原理和解决方案。

感兴趣的小伙伴可以通过下面链接进行了解:盘点2022年不可错过的经典好书:Java开发篇 

二:《深入理解Java虚拟机》

推荐理由:周志明老师写的《深入理解Java虚拟机》帮助国内数十万Java开发工程师和架构师加深了对JVM的认知,凭借一己之力拉高了 Java 开发者内功水平,把 JVM 带到了初级面试题环节。这本大厂面试通关宝典从Java技术体系、自动内存管理、虚拟机执行子系统、程序编译与代码优化、高效并发5个维度全面剖析虚拟机。以实战为导向,通过大量实际案例,分享解决各种Java技术难题的方案和技巧。几乎涵盖大厂面试全部知识点。值得所有Java技术人员一读再读。

感兴趣的小伙伴可以通过下面链接进行了解:  Java将迎来27岁生日!

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

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

相关文章

19.网络爬虫—照片管道

网络爬虫—照片管道 Scrapy基础Scrapy运行流程原理Scrapy的工作流程 scrapy照片管道实战演示设置图片路径配置爬虫解析数据运行爬虫查看文件 后记 前言&#xff1a; &#x1f3d8;️&#x1f3d8;️个人简介&#xff1a;以山河作礼。 &#x1f396;️&#x1f396;️:Python领域…

C++ Primer笔记——排列算法(next_permutation、prev_permutation、is_permutation)

目录 概述 ①next_permutation ②prev_permutation ③is_permutation 概述 页数&#xff1a;P778 &#xff08;A.2.7 排列算法&#xff09; 头文件&#xff1a;<algorithm> 函数名&#xff1a;next_permutation & prev_permutation & is_permutation C为…

信息安全复习七:报文鉴别与哈希函数

一、章节梗概 1.安全服务与安全需求 2.报文鉴别的安全需求 3.对报文加密来实现报文鉴别 4.报文鉴别码 5.哈希函数 6.生日攻击 二、安全服务与安全需求 2.1 引入 通信保密可以概况所有的安全需求吗? 不能&#xff0c;信息安全需求有很多种&#xff0c;通信保密只是一种安全…

2023移动云大会 | “六大”服务承诺 全力做优“心级服务”

4月25日&#xff0c;以“云擎未来 智信天下”为主题的2023移动云大会在苏州金鸡湖国际会议中心举办&#xff0c;众多政府领导、院士专家、知名企业客户与合作伙伴高层等数千名嘉宾齐聚一堂。 大会期间&#xff0c;移动云深入践行“为国建云”的使命&#xff0c;推出“六大”服…

vdo磁盘管理

在 storagesrv 上新加一块 10G 磁盘;  创建 vdo 磁盘,并开启 vdo 磁盘的重删和压缩;  名字为 vdodisk,大小为 150G,文件系统为 ext4;  并设置开机自动挂载。挂载到/vdodata。 1.lsblk 查看自己添加的硬盘名称 2.安装vdo软件包 yum -y install vdo…

卡尔曼滤波原理及代码

目录 一.简介 二.原理 1.先验估计原理 2.后验估计原理 3.总结 三.示例 一.简介 卡尔曼滤波&#xff08;Kalman filtering&#xff09;是一种利用线性系统状态方程&#xff0c;通过系统输入输出观测数据&#xff0c;对系统状态进行最优估计的算法&#xff0c;它可以在任意…

Vue-全局过滤器以及进阶操作

前言 上篇文件讲述了&#xff0c;Vue全局过滤器的基本使用&#xff1a;Vue过滤器的基本使用 本篇将延续上文&#xff0c;讲述vue中过滤器的进阶操作 过滤器传参 如果有一天&#xff0c;多个地方使用过滤器&#xff0c;而且需要传递参数&#xff0c;那么可以这么写 多个过滤…

《Netty》从零开始学netty源码(四十三)之PoolChunk.allocate

allocate PoolChunk分配内存空间时可调用allocate方法来分配&#xff0c;具体的源码过程如下&#xff1a; 从代码中可以看出会根据分配的内存大小决定分配的是subpage还是normal的page&#xff0c;接下来具体分析以下方法&#xff1a; allocateSubpageallocateRuninitBuf …

Unity|| 如何把生存类游戏设计得更优秀

你是否曾经玩过这样的生存类游戏&#xff1a; 1、通过最初阶段后&#xff0c;你觉得游戏变得越来越简单 2、游戏的重点从生存转移到了基地建设或其他方面 诸如此类&#xff0c;很大程度上是由于糟糕的难度曲线所致。包括很多&#xff08;非常受欢迎的&#xff09;生存游戏都…

Redis——缓存更新策略

业务场景&#xff1a; 低一致性需求&#xff1a;使用内存淘汰机制。例如店铺类型的查询缓存&#xff0c;很少修改 高一致性需求&#xff1a;主动更新&#xff0c;并以超时剔除作为兜底方案。例如店铺详情查询的缓存&#xff0c;经常修改 主动更新策略 实际开发中最常用的还是…

51单片机(三)独立按键控制LED

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

【SpringMVC源码三千问】DispatcherServlet源码解析

DispatcherServlet#doDispatch() 是 SpringMVC 处理请求分发的方法&#xff0c;只要是 spring mvc 处理的 http 请求&#xff0c;都会经过 DispatcherServlet 的请求分发处理&#xff0c;从而调用相应的 handler method。 DispatcherServlet#doDispatch() 源码分析&#xff1a…

PCL点云库(3) — common模块

目录 3.1 common模块中的头文件 3.2 common模块中的基本函数 &#xff08;1&#xff09;angle角度转换 &#xff08;2&#xff09;distance距离计算 &#xff08;3&#xff09;random随机数生成 &#xff08;4&#xff09;sping扩展模块 &#xff08;5&#xff09;time获…

请问你见过吐代码的泡泡吗(冒泡排序)

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《算法详解》&#xff0c;笔者用重金(时间和精力)打造&#xff0c;将算法知识一网打尽&#xff0c;希望可以…

现场工程师救火-UEFI(BIOS)节能设置导致金牌服务器只跑出龟速

近期协助出现场&#xff0c;解决了一个非常典型的UEFI 启动参数配置不当导致的服务器降效案例。错误的节能参数配置&#xff0c;导致价值几十万的服务器变成龟速服务器&#xff0c;并造成严重的生产事故。 1. 现象 朋友公司近期准备升级2010年就部署的服务器组&#xff0c;新…

vue移动端项目通用技巧

目录 一、配置文件 1.1、取消eslint校验 1.2、基础文件引入 1.3、iconfont引入svg使用 1.4、css的简化应用 1.5、内容溢出用省略号替代 1.6、非组件库的底部导航跳转 1.7、基础版轮播图 一、配置文件 1.1、取消eslint校验 在vue.config.js文件里&#xff1a; const …

【论文阅读】Robustness in Reinforcement Learning

原文为 Trustworthy Reinforcement Learning Against Intrinsic Vulnerabilities: Robustness, Safety, and Generalizability&#xff0c;是 2022 年 CMU 发表的综述文章。 本文主要关注文章的第二部分即鲁棒性 1. 概述 鲁棒性主要解决的问题是提高策略在面对不确定性或者对抗…

Linux:文件查看:《cat》《more》《less》《head》《tail》《wc》《grep》使用方法

同样是查看为什么要有这么多查看方法&#xff1f;&#xff1f;&#xff1f; 因为他们的用法和扩功能肯定不一样&#xff0c;选择与你需要匹配的一条命令可以节省时间的同时更快速 cat 文件 可以直接查看文件内的内容 直接可以查看文件内的内容 要直接看更多的文件以空格隔开的…

AI大模型+低代码,在项目管理中的应用实践

随着ChatGPT大火之后&#xff0c;新的AI技术和模型被证明已经具备的很高的使用价值。 诸如Copilot、Midjourney、notion等产品通过AI的加持&#xff0c;已经让用户能够充分地在应用层面感受到了便利性。 原本几天的工作通过AI模型&#xff0c;可能只需要1分钟就能完成。可以大…

面试腾讯T7,被按在地上摩擦,鬼知道我经历了什么?

时间总是过得飞快&#xff0c;金三银四已经过去了&#xff0c;人们已经开始备战互联网大厂2023年的秋招计划了。刚好最近我有个小徒弟去腾讯面试的时候挂掉了&#xff0c;感觉被技术吊打。根据他的描述我复盘了一下&#xff0c;希望能给备战秋招的朋友一些帮助。 腾讯面试的内…