java web基础以及Spring框架

继续填坑,学习一下java web基础以及spring框架

主要参考:

https://www.docs4dev.com/docs/zh/spring-framework/5.1.3.RELEASE/reference

https://www.mi1k7ea.com/

https://github.com/h2pl/Java-Tutorial

Spring基本框架

Spring是一个轻量级的Java Web开发框架,采用分层架构,根据不同的功能被划分成了多个模块,这些模块大体可分为Data Access/Integration、Web、AOP、Aspects、Messaging、Instrumentation、Core Container和Test

img

Core Container

Spring的核心容器是其他模块建立的基础,由Beans模块、Core核心模块、Context上下文模块和Expression Language表达式语言模块组成,具体介绍如下:

  • Core模块:提供了框架的基本组成部分,包括IoC和依赖注入功能;
  • Beans模块 :提供BeanFactory,是工厂模式的经典实现,Spring将管理对象称为Bean;
  • Context模块:是在Core和Beans模块的基础上建立起来的,以一种类似于JNDI注册的方式访问对象,是访问定义和配置任何对象的媒介。ApplicationContext接口是上下文模块的焦点;
  • SpEL模块:提供了强大的表达式语言,用于在运行时查询和操作对象图;

Data Access/Integration

数据访问/集成层包括JDBC、ORM、OXM、JMS和Transactions模块(注:JDBC=Java Data Base Connectivity,ORM=Object Relational Mapping,OXM=Object XML Mapping,JMS=Java Message Service),它们的细节如下:

  • JDBC模块:提供了JDBC抽象层,大幅度减少了在开发过程中对数据库操作的编码;
  • ORM模块:提供了对流行的对象关系映射API的集成,包括JPA、JDO和Hibernate等。通过此模块可以让这些ORM框架和spring的其它功能整合,比如前面提及的事务管理;
  • OXM模块:提供了一个支持对象/XML映射的抽象层实现,如JAXB、Castor、XMLBeans、JiBX和XStream;
  • JMS模块:指Java消息服务,包含的功能为生产和消费的信息。从Spring 4.1开始,集成了spring-messaging模块;
  • Transactions事务模块:为实现特殊接口类及所有的POJO支持编程式和声明式事务管理(注:编程式事务需要自己写beginTransaction()、commit()、rollback()等事务管理方法,声明式事务是通过注解或配置由spring自动处理,编程式事务粒度更细);

Web模块

Spring的Web层包括Web、Servlet、Struts和Portlet组件,具体介绍如下:

  • Web模块:提供面向Web的基本功能和面向Web的应用上下文,比如多部分(multipart)文件上传功能、使用Servlet监听器初始化IoC容器等。它还包括HTTP客户端以及Spring远程调用中与web相关的部分;
  • Servlet模块:包括Spring模型—视图—控制器(MVC)实现Web应用程序;
  • MVC模块:为Web应用提供了模型视图控制(MVC)和REST Web服务的实现。Spring的MVC框架可以使领域模型代码和Web表单完全地分离,且可以与Spring框架的其它所有功能进行集成;
  • WebSocket模块:为WebSocket-based提供了支持,而且在Web应用程序中提供了客户端和服务器端之间通信的两种方式;
  • Struts模块:包含支持类内的Spring应用程序,集成了经典的Struts Web层;
  • Portlet模块:提供了在Portlet环境中使用MVC实现,类似Web-Servlet模块的功能,并反映了spring-webmvc模块的功能;

其他模块

Spring的其他模块还有 AOP、Aspects、Instrumentation 以及 Test 模块,具体介绍如下:

  • AOP模块:提供了面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分离,以降低耦合性;
  • Aspects模块:提供与AspectJ的集成,是一个功能强大且成熟的面向切面编程(AOP)框架;
  • Instrumentation模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用;
  • Test模块:支持Spring组件使用JUnit或TestNG框架的测试;
  • Messaging模块:为STOMP提供了支持作为在应用程序中WebSocket子协议的使用。它也支持一个注解编程模型,它是为了选路和处理来自WebSocket客户端的STOMP信息;

基本概念

上边这些如果没有相关基础,看完应该是一脸懵逼,这里简单介绍一下这些相关概念,先从java web开始说起

servlet与servlet容器

servlet是一个java接口,定义的是一套处理网络请求的规范,所有实现servlet的类,都需要实现它的方法,或者说,所有想要处理网络请求的类,都需要回答这三个问题:

  • 初始化时要做什么
  • 销毁时要做什么
  • 接受到请求时要做什么

然而只实现了servlet的类是无法处理请求的,还需要servlet容器的帮助,比如tomcat

tomcat直接与客户端交互,它监听了端口,请求过来后,根据url等信息,确定要将请求交给哪个servlet去处理,然后调用那个servlet的service方法,service方法返回一个response对象,tomcat再把这个response返回给客户端。我们只需要实现业务逻辑,而具体的通信过程tomcat已经帮我们完成了。

Servlet 生命周期:

  • Servlet 通过调用 init () 方法进行初始化。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 通过调用 destroy() 方法终止(结束)。
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

jsp

jsp应该是过时了的技术,但是这里还是简单提一下吧。

在jsp之前,服务端想返回html需要在servlet中自己手动输出out.println,简直自闭。于是在html语句中写入动态数据这种思想下,jsp诞生了。jsp全称Java Server Page,当有人请求jsp时,服务器内部会将jsp转化为html,也就是说jsp运行在服务器端,但最终发给客户端的都已经是转换好的html静态页面。在这个过程中服务器并没有把jsp文件发给浏览器。

jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)

java bean

Java语言欠缺属性、事件、多重继承功能。所以,如果要在Java程序中实现一些面向对象编程的常见需求,只能手写大量胶水代码。Java Bean正是编写这套胶水代码的惯用模式或约定。这些约定包括getXxx、setXxx、isXxx、addXxxListener、XxxEvent等。遵守上述约定的类可以用于若干工具或库。

MVC模式

JSP和Servlet都有自身的适用环境,那么有没有什么办法能够让它们发挥各自的优势呢?答案是肯有的,MVC模式就能够完美解决这一问题。

MVC模式,是Model-View-Controller的简称,是软件工程中的一种软件架构模式,分为三个基本部分,分别是:模型(Model)、视图(View)和控制器(Controller):

  • Controller——负责转发请求,对请求进行处理
  • View——负责界面显示
  • Model——业务功能编写(例如算法实现)、数据库设计以及数据存取操作实现

在JSP/Servlet开发的软件系统中,这三个部分的描述如下所示:

  1. Web浏览器发送HTTP请求到服务端,然后被Controller(Servlet)获取并进行处理(例如参数解析、请求转发)
  2. Controller(Servlet)调用核心业务逻辑——Model部分,获得结果
  3. Controller(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容
  4. 动态生成的HTML内容返回到浏览器显示

Servlet 充当Controller , jsp 充当 View ,Java bean 充当Model

业务逻辑, 页面显示和处理过程做了很好的分离。

基于这个模型的扩展和改进, 很多Web开发框架开始如雨后春笋一样出现。

Enterprise Java bean

越来越多企业程序员提出诉求:要分布式、要安全、要事务、要高可用性。

诉求可以归结为:“我们只想关注我们的业务逻辑, 我们不想, 也不应该由我们来处理‘低级’的事务, 多线程,连接池,以及其他各种各种的‘低级’API, 此外Java帝国一定得提供集群功能, 这样我们的一台机器死机以后,整个系统还能运转。 ”

于是推出了J2EE, 像Java bean 一样, 这还是一个规范, 但是比Java bean 复杂的多, 其中有:

JDBC: Java 数据库连接

JNDI : Java 命名和目录接口, 通过一个名称就可以定位到一个数据源, 连jdbc连接都不用了

RMI: 远程过程调用, 让一个机器上的java 对象可以调用另外一个机器上的java 对象

JMS : Java 消息服务, 可以使用消息队列了

JTA: Java 事务管理, 支持分布式事务, 能在访问、更新多个数据库的时候,仍然保证事务, 还是分布式。

Java mail : 收发邮件

这一套叫做EJB,使用EJB,就可以把精力放在业务上了

Spring

然而由于EJB十分繁琐笨重,轻量级的spring框架诞生了

对于一个Bean 来说,如果你依赖别的Bean , 只需要声明即可, spring 容器负责把依赖的bean 给“注入进去“, 起初大家称之为控制反转(IoC)。

后来 Martin flower 给这种方式起来个更好的名字,叫“依赖注入”(DI)。

如果一个Bean 需要一些像事务,日志,安全这样的通用的服务, 也是只需要声明即可, spring 容器在运行时能够动态的“织入”这些服务, 这叫面向切面(AOP)。

几个概念

1、应用程序:是能完成我们所需要功能的成品,比如购物网站、OA系统。

2、框架:是能完成一定功能的半成品,比如我们可以使用框架进行购物网站开发;框架做一部分功能,我们自己做一部分功能,这样应用程序就创建出来了。而且框架规定了你在开发应用程序时的整体架构,提供了一些基础功能,还规定了类和对象的如何创建、如何协作等,从而简化我们开发,让我们专注于业务逻辑开发。

3、非侵入式设计:从框架角度可以这样理解,无需继承框架提供的类,这种设计就可以看作是非侵入式设计,如果继承了这些框架类,就是侵入设计,如果以后想更换框架之前写过的代码几乎无法重用,如果非侵入式设计则之前写过的代码仍然可以继续使用。

4、轻量级及重量级:轻量级是相对于重量级而言的,轻量级一般就是非入侵性的、所依赖的东西非常少、资源占用非常少、部署简单等等,其实就是比较容易使用,而重量级正好相反。

5、POJO:POJO(Plain Old Java Objects)简单的Java对象,它可以包含业务逻辑或持久化逻辑,但不担当任何特殊角色且不继承或不实现任何其它Java框架的类或接口。

6、容器:在日常生活中容器就是一种盛放东西的器具,从程序设计角度看就是装对象的的对象,因为存在放入、拿出等操作,所以容器还要管理对象的生命周期。

7、控制反转:即Inversion of Control,缩写为IoC,控制反转还有一个名字叫做依赖注入(Dependency Injection),就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。

8、Bean:一般指容器管理对象,在Spring中指Spring IoC容器管理对象。

0%