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