本章概要
温馨提示:
本文配套代码:https://gitee.com/guduwuhen/springboot2-lesson 下的:springboot-lesson1.1和lesson1-2
在java架构模式中,我们可以将MVC架构模式抽象为如下结构:
1.View层。View层即UI层,可采用的技术如JSP,Structs,SpringMVC等
2.Controller层。Controller表示控制器层,可采用的技术,如Servlet/Filter,Spring等
3.Service层。Service层表示核心服务层,向架构上层提供服务
4.DAO层。DAO层表示数据访问层,可采用的技术如jdbc和ORM框架(如Spring JDBC,JPA,Hibernate,Mybatis等)
5.Model层。Model层即表示JavaBean对象
6.Utilities层。Utilities层表示公共工具层
Web开发框架主要经历了四个阶段:
下面我们分别介绍一下这四个阶段的主要开发思想:
1.在该阶段架构模式中,Servlet/Filter扮演Controller角色,JSP扮演View角色,JavaBean扮演Model角色
2.该阶段的数据库访问技术为具体DB的jdbc
缺点:
1. 前后端分离不彻底。由于JSP技术前后端分离不彻底,开发人员往往会在JSP页面中嵌套Java代码,从而需要前端开发人员懂java技术。
2. JSP页面可读性差,编写效率低,尽管引入EL,JSTL等技术
3. Sevlet/Filter作为控制器,面临的稳定性,安全性考验(Servlet是线程不安全的)等
4. 数据库访问技术采用传统的jdbc,造成过多的冗余代码
为了解决这些问题,JavaWeb专家们提出了一种架构思想:模块化,抽象化和专一化的思想。基于该思想
,涌向出一批专业化开源框架,其中较为出名的组合框架便是SSH了。
阶段二:SSH
在该架构模式中,Controller采用Spring框架技术,View采用Structs框架技术,DB访问技术采用Hibernate框架技术。从SSH中,很容易看出前后端出现了专业化,精细化分工,且朝框架演变,如前端框架采Structs,后端框架采用Spring等然而,SSH架构模式虽然解决了Servlet/Filter架构模式存在的问题,实现了专业化、精细化分工,实现了模块化和抽象化。
hibernate优点:
1、hibernate是全自动,hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql。
2、功能强大,数据库无关性好,O/R映射能力强,需要写的代码很少,开发速度很快。 3、有更好的二级缓存机制,可以使用第三方缓存。
4、数据库移植性良好。
5、hibernate拥有完整的日志系统,hibernate日志系统非常健全,涉及广泛,包括sql记录、关系异常、优化警告、缓存提示、脏数据警告等
hibernate缺点:
1、学习门槛高,精通门槛更高,程序员如何设计O/R映射,在性能和对象模型之间如何取得平衡,以及怎样用好Hibernate方面需要的经验和能力都很强才行。
2、hibernate的sql很多都是自动生成的,无法直接维护sql;虽然有hql查询,但功能还是不及sql强大,当需要定制sql语句时,需要精通hql语言,学习成本大,并且不灵活。
阶段三:SSM
在SSH框架中,Hibernate
虽然能满足业务需求,能解决业务,但其笨重不灵活,不能很好地实现可配置化的灵活方式,Structs
也过于笨重。为了解决该问题,JavaWeb
专家们又提出了另外一种架构模式,即SSM
架构模式。程序执行流程图如下:
从流程图中可以看出,Spring MVC
扮演Controller
角色,SpringMVC
中的V扮演View
角色,Mybatis
扮演数据库访问技术。
优点:
1、易于上手和掌握,提供了数据库查询的自动对象绑定功能。
2、sql写在xml里,便于统一管理和优化, 解除sql与程序代码的耦合。
3、提供映射标签,支持对象与数据库的orm字段关系映射
4、 提供对象关系映射标签,支持对象关系组建维护(关联表)
5、提供xml标签,支持编写动态sql
6、速度比Hibernate的速度较快
缺点:
1、关联表多时,字段多的时候,sql工作量很大。
2、sql依赖于数据库,导致数据库移植性差。
3、由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
4、不支持级联更新、级联删除。
5、Mybatis的日志除了基本记录功能外,其它功能薄弱很多。
6、编写动态sql时,不方便调试,尤其逻辑复杂时
在当前的JavaEE中,算是比较流行的开发模式了,也是大都数企业的技术选型之一
其实就是Mybatis/hibernate对比,概括起来就是:
Mybatis:小巧、方便、高效、简单、直接、半自动化
Hibernate:强大、方便、高效、复杂、间接、全自动化
在讲解之前我们首先需要安装Maven环境。
1)从官方网站下载最新的安装包:http://maven.apache.org/download.cgi
解压并安装并安装:我下载的是:
apache-maven-3.6.1
版本,解压后路径为:D:\webserver\apache-maven-3.6.1
;
D:\webserver\apache-maven-3.6.1\bin
目录添加到path路径,这样在cmd命令窗口可以直接使用mvn命令
打开cmd命令窗口,输入:mvn -v 如果输出如下图所示结果,表示安装成功。
2)修改Maven安装目录\conf\settings文件:配置默认仓库(即repository)的路径及阿里云镜像
首先在apache-maven-3.6.1目录下创建repository目录,作为我们的数据仓库。
小技巧:
- 数据仓库的目录,最好不要设置在C盘,因为可以会影响操作系统的性能,在操作系统重新安装时,可能会丢失。
- 数据仓库的镜像配置,最好配置为阿里巴巴提供镜像地址,这样下载依赖的Jar包时,速度较快。
配置默认仓库
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
去掉上面对
的注释,修改“/path/to/local/repo”
为数据仓库的路径,根据自己的情况修改
修改完如下:
<localRepository>D:\webserver\apache-maven-3.6.1\repository</localRepository>
阿里云镜像配置
<mirrors>
<!-- mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
<mirror>
<id>mirrorId</id>
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
-->
</mirrors>
删除子节点的内容,修改为如下:
<!--阿里云镜像配置-->
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
小技巧:在IDEA开发工具中怎么配置默认
maven
路径及仓库呢?这样可以避免每次新建项目都需要指定自己的maven
目录。方法如下:
小技巧:设置全局字符集,让所有项目(包括新建)的字符集设置一致。
- 选择菜单
File-> Other Setting -> Setting for New Projects..
.- 在打开的
Setting for New Projects
窗口中,搜索encoding
,然后把全局编码(global encoding
)的下拉框和项目编码(project encoding
)的下拉框都修改为utf-8
我们用一个实例来讲解传统的Spring MVC
开发,通过实例,我们可以深入了解基于Spring MVC
开发,到底需要做哪些工作,也为后面学习Spring Boot
的简化开发提供对比。
新建工程:File-> New project...
,按照如下四个步骤进行创建web工程:
步骤解释:
1) 第一步:选择Maven方式创建,同时,在 Create from archetype 前面的复选框上打钩,这个选项代表我们使用下面的原型进行创建工程,我们选择org.apache.maven.archetype:maven-archetype-webapp 这个原型模板创建web工程。
2) 第二步:输入组织名称、模块名称,项目版本一般采用默认
3) 第三步:如果已经设置过Maven的全局配置,那么这个步骤可以直接跳过,如果没有配置,需要根据自己的情况选择一下maven的按照路径及使用的配置信息、仓库路径;
4)第四步:项目名称不用修改,项目路径根据实际情况修改一下
这样一个初始的web项目就创建完了,下面介绍一下默认的项目结构:
1)默认的项目为我们创建了webapp目录,其中包含WEB-INF目录及web.xml文件,其中web.xml文件中没有具体内容配置;
2)pom文件中,默认为我们生成了版本信息及引入了打包所用的插件,但是基于Spring Mvc开发的jar包需要我们自己引入。
在pom文件中添加对Spring Mvc的依赖,代码如下:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
小技巧: Maven依赖Jar坐标查询
添加完毕后,我们可以从IDEA开发工具中看一下,添加完这个引用后,Maven会为我们导入哪些Jar包。如下图:
可以看出,Maven为我们导入8个与Spring Mvc有关系的Jar,每个包的作用如下:
(1)
spring-core.jar
:这个jar文件包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。
(2)spring-beans.jar
:这个jar文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行(IoC/DI)
操作相关的所有类。 如果应用只需基本的IoC/DI
支持,引入spring-core.jar
及spring-beans.jar
文件就可以了。
(3)spring-aop.jar:
:这个jar文件包含在应用中使用Spring的AOP特性时所需的类。使用基于AOP的Spring特性,如声明型事务管理,也要在应用里包含这个jar包。
(4)spring-context.jar
:这个jar文件为Spring核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类, JDNI所需的全部类,UI方面的用来与模板(Templating)引擎如Velocity FreeMarker、JasperReports集成的类,以及校验Validation方面的相关类。
(5)spring-web.jar
:这个jar文件包含Web应用开发时,用到Spring框架时所需的核心类,包括自动载入WebApplicationContext特性的类、文件上传的支持类、Filter类和大量工具辅助类。
(6)spring-webmvc.jar
:这个jar文件包含Spring MVC框架相关的所有类。包含国际化、标签、Theme、视图展现的FreeMarker、JasperReports、Tiles、Velocity、XSLT相关类。当然,如果你的应用使用了独立的MVC框架,则无需这个JAR文件里的任何类。
(7)spring-jcl.jar
:这个jar文件主要是负责日志源码分析。对LOG4J, SLF4J_LAL, SLF4J, JUL这些日志框架进行统一管理。
(8)spring-expression.jar
:这个jar文件是Spring框架中一个强大表达式解析语言,支持在运行时动态的解析表达式给对象赋值。
在src/main目录下创建java和resource目录,默认的目录的类型是不对,下面介绍一个小技巧,修改目录类型:
小技巧:修改文件目录类型
针对web项目,我们至少需要修改如下三个配置文件,才能让项目支持Spring Mvc:
1、 web.xml 配置文件:Spring容器启动、spingmvc的前端控制器、字符集配置
2、 Springmvc 配置文件
3、 Spring 配置文件
下面分别介绍一下怎么去配置:
对于web.xml文件,我们需要配置如下几项:
代码如下:
<web-app>
<display-name>SpringBoot-lesson1display-name>
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>
classpath:spring-context.xml
param-value>
context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>
<servlet>
<servlet-name>springmvcServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:spring-mvc.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>springmvcServletservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
<filter>
<filter-name>CharacterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>utf-8param-value>
init-param>
<init-param>
<param-name>forceRequestEncodingparam-name>
<param-value>trueparam-value>
init-param>
<init-param>
<param-name>forceResponseEncodingparam-name>
<param-value>trueparam-value>
init-param>
filter>
<filter-mapping>
<filter-name>CharacterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<welcome-file-list>
<welcome-file>index.htmlwelcome-file>
<welcome-file>index.htmwelcome-file>
<welcome-file>index.jspwelcome-file>
welcome-file-list>
web-app>
对于Springmvc 配置文件,我们需要配置如下几项:
在resource目录下创建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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--SpringMVC的配置文件,包含网站跳转逻辑的控制,配置 -->
<context:component-scan base-package="com.binge.springboot" use-default-filters="false">
<!--只扫描控制器。 -->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--配置视图解析器,方便页面返回 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--两个标准配置 -->
<!-- 将springmvc不能处理的请求交给tomcat -->
<mvc:default-servlet-handler/>
<!-- 能支持springmvc更高级的一些功能,JSR303校验,快捷的ajax...映射动态请求 -->
<mvc:annotation-driven/>
</beans>
由于我们的视图层文件都存放在/WEB-INF/views/ 目录下,因此我们需要创建此目录。
对于Spring 配置文件,我们需要配置如下几项:
代码如下:有本文先不讲Mybatis的集成,因此,下面的配置文件中,我们只是添加了注释,没有具体的代码。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 使用Annotation自动注册Bean,解决事物失效问题:在主容器中不扫描@Controller注解,在SpringMvc中只扫描@Controller注解。 -->
<!--=================== 数据源,事务控制,xxx ================-->
<!--================== 配置和MyBatis的整合=============== -->
<!-- 配置扫描器,将mybatis接口的实现加入到ioc容器中 -->
<!-- 配置一个可以执行批量的sqlSession -->
<!-- ===============事务控制的配置 ================-->
<!--开启基于注解的事务,使用xml配置形式的事务(必要主要的都是使用配置式) -->
<!--配置事务增强,事务如何切入 -->
<!-- Spring配置文件的核心点(数据源、与mybatis的整合,事务控制) -->
</beans>
在view目录下先创建hello.jsp文件,代码如下:
<html>
<body>
<h2>Hello lesson 1!</h2>
</body>
</html>
1) 在java目录下创建com.binge.springboot包,然后在包下创建controller目录;
2) 在controller目录下创建Lesson1Controller.java 作为我们控制层的类,这个类编写一个方法,进行hello.jsp界面的访问,代码如下:
package com.binge.springboot.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/lesson1")
public class Lesson1Controller {
@RequestMapping("/hello")
public String hello(){
return "hello";
}
}
点击Run—EDit Configurations…
点击左侧“+”号,找到Tomcat Server—Local
在Tomcat Server -> Unnamed -> Server -> Application server项目下,点击 Configuration ,找到本地 Tomcat 服务器,再点击 OK按钮
切换到Deployment,然后点击右侧的“+”,选择Artifact
选择部署的项目:
点击OK后,部署完成,控制台会出现如下界面:
运行出现如下界面,说明运行运行成功:
输入测试地址:http://localhost:8080/springboot_lesson_war/lesson1/hello
这个界面返回的就是应该是views/hello.jsp中的内容,测试成功!!!
这个章节,我们使用IDEA开发工具搭建了Spring Mvc
的开发环境,并写了一个最简单的例子。从这些步骤,大家可以看出,需要配置的文件特别多,而且稍有不慎,就会出现错误。对于新手来说,上手非常不容易,在这种情况,一些开发大牛就想,能否简化Maven的配置及去除配置文件,用最简单的方法去搭建一个开发环境呢?这时候,Spring Boot
就出现了。这一章节的内容大家如果不理解,没有关系,我们只要了解传统的SSM
开发很啰嗦,现在出现了一种更简单的开发框架Spring Boot
,我们只需要站在巨人的身上开始我们简单的开发就可以了,下面正式开始Spring Boot
的学习。
Spring Boot
带来了全新的自动化配置解决方案,使用 Spring Boot
可以快速创建基于 Spring
生
产级的独立应用程序 。 Spring Boot
中对一些常用的第三方库提供了默认的 自动化配置方案,使得
开发者只需要很少的 Spring
配置就能运行一个完整的 Java EE 应用。
Spring Boot
项目可以采用传统的方案打成 war 包,然后部署到 Tomcat 中运行。也可以直接打成可执行 jar 包,这样通过java -jar
命令就可以启动一个Spring Boot
项目 。
总体来说, Spring Boot
主要有如下优势 :
• 提供一个快速的 Spring 项目搭建渠道,创建独立的 Spring 应用程序。
• 开箱即用 ,很少的 Spring 配置就能运行一个 Java EE 项目 。
• 允许通过 Maven 来根据需要获取 starter
• 提供了生产级的服务监控方案。
• 内嵌服务器(Tomcat 、 Jetty ), 可以快速部署。
• 提供生产就绪型功能,如指标、健康检查和外部配置。
• 纯 Java 配置,没有代码生成 ,也不需要XML 配直。
约定优于配置,这是 Spring Boot 的主导思想 。 对于 Spring Boot 而言 ,大部分情况下存在默认配置 ,你甚至可以在没有任何定义的情况下使用 Spring 框架,如果需要自定义也只需要在配置文件配 置一些属性便可以,十分便捷 。
下面我们用一个实例,进行Spring Boot
的开发框架搭建,同时,也可以和上一节传统的开发框架进行对比,看看基于Spring Boot的开发是否真的很方便。
File->New->Project
进行新建项目,在弹出的对话框中按下图进行操作:
next后,组的名称和工程的名称都需要修改,如下图:
Next,如图所示,需要打钩,开启热部署及lombok插件;
next后,选择左侧的web,然后右侧选择spring web 建立web工程:
next后
默认项目已经为我们生成了主类,配置文件、pom配置文件;pom配置文件已经为我们配置好了对Spring Mvc
的配置,同时也内置了tomat容器,我们不需要安装tomcat,不需要再去配置繁琐的xml文件,直接就可以生成一个web项目,下面开始写测试代码进行测试。
在com.binge.springboot.lesson12
目录下创建包:controller
;然后在此包下创建类:TestController.java
,代码如下:
package com.binge.springboot.lesson12.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@RequestMapping("/index")
public String index() {
return "hello spring boot lesson 2";
}
}
注意:@RestController
注释表示发布的是Restful
接口
在自动生成的主类 Lesson12Application.java 文件上点击右键,然后如下图操作启动程序:
出现下图框表示启动成功:
启动日志中会,显示端口号及启动耗时,如图所示。
打开浏览器输入:http://localhost:8080/index ,出现如下界面,说明接口可以正常访问。
本文主要介绍web开发的演进、常用的几种开发框架;用一个实例介绍了传统的Spring Mvc项目搭建过程,同时也用了一个实例介绍了Springboot2.x怎么快速创建项目。通过对比发现,后者要简单的多。同时在此过程中,我们也介绍了几个小技巧,这些技巧都是我们在项目中用到比较多的,而且比较实用的。下一章,我们会学习Spring Boot2.x 的基础配置。