Spring
Spring 是 Java EE 编程领域的一款轻量级的开源框架,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,它的目标就是要简化 Java 企业级应用程序的开发难度和周期。
一些历史:Spring 是 Java EE 编程领域的一款轻量级的开源框架,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,它的目标就是要简化 Java 企业级应用程序的开发难度和周期。
一些称谓:在不同的语境中,Spring 所代表的含义是不同的。下面我们就分别从“广义”和“狭义”两个角度,对 Spring 进行介绍。
广义spring
广义上的 Spring 泛指以 Spring Framework 为核心的 Spring 技术栈。
经过十多年的发展,Spring 已经不再是一个单纯的应用框架,而是逐渐发展成为一个由多个不同子项目(模块)组成的成熟技术,例如 Spring Framework、Spring MVC、SpringBoot、Spring Cloud、Spring Data、Spring Security 等,其中 Spring Framework 是其他子项目的基础。
项目名称 | 描述 |
---|---|
Spring Data | Spring 提供的数据访问模块,对 JDBC 和 ORM 提供了很好的支持。通过它,开发人员可以使用一种相对统一的方式,来访问位于不同类型数据库中的数据。 |
Spring Batch | 一款专门针对企业级系统中的日常批处理任务的轻量级框架,能够帮助开发人员方便的开发出健壮、高效的批处理应用程序。 |
Spring Security | 前身为 Acegi,是 Spring 中较成熟的子模块之一。它是一款可以定制化的身份验证和访问控制框架。 |
Spring Mobile | 是对 Spring MVC 的扩展,用来简化移动端 Web 应用的开发。 |
Spring Boot | 是 Spring 团队提供的全新框架,它为 Spring 以及第三方库一些开箱即用的配置,可以简化 Spring 应用的搭建及开发过程。 |
Spring Cloud | 一款基于 Spring Boot 实现的微服务框架。它并不是某一门技术,而是一系列微服务解决方案或框架的有序集合。它将市面上成熟的、经过验证的微服务框架整合起来,并通过 Spring Boot 的思想进行再封装,屏蔽调其中复杂的配置和实现原理,最终为开发人员提供了一套简单易懂、易部署和易维护的分布式系统开发工具包。 |
狭义spring
狭义的 Spring 特指 Spring Framework,通常我们将它称为 Spring 框架。
https://www.bilibili.com/video/BV1Vf4y127N5/?spm_id_from=333.337.search-card.all.click
Spring 有两个核心部分: IoC 和 AOP。
核心 | 描述 |
---|---|
IOC | Inverse of Control 的简写,译为“控制反转”,指把创建对象过程交给 Spring 进行管理。 |
AOP | Aspect Oriented Programming 的简写,译为“面向切面编程”。 AOP 用来封装多个类的公共行为,将那些与业务无关,却为业务模块所共同调用的逻辑封装起来,减少系统的重复代码,降低模块间的耦合度。另外,AOP 还解决一些系统层面上的问题,比如日志、事务、权限等。 |
在实际开发中,服务器端应用程序通常采用三层体系架构,分别为表现层(web)、业务逻辑层(service)、持久层(dao)。
Spring 致力于 Java EE 应用各层的解决方案,对每一层都提供了技术支持。
- 在表现层提供了对 Spring MVC、Struts2 等框架的整合;
- 在业务逻辑层提供了管理事务和记录日志的功能;
- 在持久层还可以整合 MyBatis、Hibernate 和 JdbcTemplate 等技术,对数据库进行访问。
Spring-mvc
背景知识
spring-mvc是spring的一个后续产品,是一个子项目
springMVC是spring为表述层开发提供的一套完备的解决方案。表述层框架历经Strust, Webwork, Strusts2 等诸多产品的历代更迭以后,目前业界普遍选择了SpringMvc作为JavaEE项目表述层的首选方案。
三层架构:表述(表示)层,业务逻辑层,数据访问层,表述层表示前台页面和后台servlet
搭建
新建项目工程
pom.xml
<?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>org.example</groupId>
<artifactId>springmvc</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
注意里面要打war包,随后把依赖加载进来
javax.servlet-api由于有tomcat提供,所以这里使用的是provided (如上面pom.xml)
新建
main下面新建webapp目录
web.xml是入口配置文件,在这个文件里面可以注册servlet, 注册 listener , 注册 filter ,当然,也可以使用注解模式代替这种模式
web.xml创建过程如下:
新建web.xml,下面的路径要手动加入
web.xml
之所以用到web.xml是因为springmvc的特点是:
配置web.xml可以配置springMvc前端控制器,对浏览器发送的请求进行统一处理
(因为浏览器不能直接访问道一个类,所以需要在web.xml里面注册)
- 默认配置方式
在这种配置方式下,SpringMvc的配置文件位于WEB-INF下,默认名称是<servlet-name>-servlet.xml
, 以下面为例,默认名称就是springmvc-servlet.xml
<?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">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
除了jsp不会被前端控制器处理外,其他都可以
- 扩展配置方式(最优)
<?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">
<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>
<!-- 将前端控制器DispatcherServlet的初始化时间提前到服务器启动时-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
其实就是加了init-param,可以自定义springMVC配置文件的位置和名称,并且加了个优先级load-on-startup
这个时候需要在这个位置<param-value>
创建SpringMVC.xml
名称要写对,classpath就是resources这个目录
下面以扩展配置方式为例创建请求控制器
创建请求控制器
总之就是需要写一个类,每个类的方法就是一个处理请求用的业务代码
新建一个包,包名controller或者handler,然后在里面新建HelloController
HelloController
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller //一定要注解controller,扫描器才会把它当作controller
public class HelloController {
@RequestMapping(value = "/") //value去掉也可
public String index(){
// 返回视图名称(去掉前缀后缀)
return "index";
}
}
创建视图解析器
刚刚控制器可以理解为是后端,这里便是前端的配置,当然不是简单一个index.html。这里咱们把thymeleaf给一下
Spring-MVC.xml
<?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="controller"></context:component-scan>
<!-- thymeleaf视图解析器 -->
<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<property name="order" value="1" />
<property name="characterEncoding" value="utf-8" />
<property name="templateEngine">
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver">
<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/WEB-INF/templates/"/>
<!-- 视图后缀 -->
<property name="suffix" value=".html"/>
<property name="templateMode" value="HTML5"/>
<property name="characterEncoding" value="UTF-8"/>
</bean>
</property>
</bean>
</property>
</bean>
</beans>
视图前缀和视图后缀明显是加到控制器返回的string上的
然后我们写个index.html (这里应该只要路径在哪了吧)
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>首页</h1>
</body>
</html>
然后配置一下tomcat。application server那里选择一个tomcat7
选择带exploded的war包,找不到war包可能是因为前面Pom.xml没有打包
上图的下面application context是上下文路径,这个路径可以在这里自定义,当访问上下文路径时,就相当于访问controller里面的/
启动Tomcat7,访问
当然,换成tomcat6是会报大错的
原因是javax.servlet-api和tomcat6的不兼容
访问指定页面
这里用thymeleaf语法处理一下href本来应该写着的上下文路径(<a href=/springmvc/target>
)
index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>首页</h1>
<a th:href="@{/target}">访问目标页面target.html</a>
</body>
</html>
target.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>target</title>
</head>
<body>
<h1>thai</h1>
</body>
</html>
HelloController
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller //一定要注解
public class HelloController {
@RequestMapping(value = "/")
public String index(){
// 返回视图名称(去掉前缀后缀)
return "index";
}
@RequestMapping(value = "/target")
public String target(){
return "target";
}
}
点击跳转