jjzjj

【SpringMVC】| SpringMVC 入门

@每天都要敲代码 2024-04-27 原文

目录

一: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岁生日!

有关【SpringMVC】| SpringMVC 入门的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  3. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  4. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  5. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

  6. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  7. Simulink方法总结和避坑指南(一)——Simulink入门与基本调试方法 - 2

    文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景  最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。  在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记

  8. ESP32学习入门:WiFi连接网络 - 2

    目录一、ESP32简单介绍二、ESP32Wi-Fi模块介绍三、ESP32Wi-Fi编程模型四、ESP32Wi-Fi事件处理流程 五、ESP32Wi-Fi开发环境六、ESP32Wi-Fi具体代码七、ESP32Wi-Fi代码解读6.1主程序app_main7.2自定义代码wifi_init_sta()八、ESP32Wi-Fi连接验证8.1测试方法8.2服务器模拟工具sscom58.3测试代码8.4测试结果前言为了开发一款亚马逊物联网产品,开始入手ESP32模块。为了能够记录自己的学习过程,特记录如下操作过程。一、ESP32简单介绍ESP32是一套Wi-Fi(2.4GHz)和蓝牙(4.2)双模解决方

  9. ruby-on-rails - Rails 还是 Sinatra? PHP程序员入门学习哪个好? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?

  10. SpringCloud入门实战(七)-Hystrix入门简介 - 2

    📝学技术、更要掌握学习的方法,一起学习,让进步发生👩🏻作者:一只IT攻城狮。💐学习建议:1、养成习惯,学习java的任何一个技术,都可以先去官网先看看,更准确、更专业。💐学习建议:2、然后记住每个技术最关键的特性(通常一句话或者几个字),从主线入手,由浅入深学习。❤️《SpringCloud入门实战系列》解锁SpringCloud主流组件入门应用及关键特性。带你了解SpringCloud主流组件,是如何一战解决微服务诸多难题的。项目demo:源码地址👉🏻SpringCloud入门实战系列不迷路👈🏻:SpringCloud入门实战(一)什么是SpringCloud?SpringCloud入门实战

随机推荐