【SpringMVC】| SpringMVC 入门

目录

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

猜你喜欢

转载自blog.csdn.net/m0_61933976/article/details/128796992