Java框架知识补充
0
JBoss/01 简介.md
Normal file
54
JBoss/02 JBoos Resteasy.md
Normal file
@@ -0,0 +1,54 @@
|
||||
|
||||
## 1 简介
|
||||
|
||||
|
||||
### 概述
|
||||
JBoss Resteasy是一个遵守JAX-RS 标准的REST的开源项目
|
||||
|
||||
RESTEasy是JBoss的一个开源项目,提供各类框架帮助你构建RESTful Web Services和RESTful Java应用程序。做为一个JBOSS的项目,它固然能和**JBOSS应用服务器**很好地集成在一块儿。可是,它也能在任何运行JDK5或以上版本的Servlet容器中运行。
|
||||
|
||||
|
||||
## 2 使用
|
||||
|
||||
```java
|
||||
package com.liao;
|
||||
|
||||
import javax.ws.rs.GET;
|
||||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.PathParam;
|
||||
import javax.ws.rs.core.Response;
|
||||
|
||||
@Path("/message")
|
||||
public class MessageRestService {
|
||||
|
||||
@GET
|
||||
@Path("/{param}")
|
||||
public Response printMessage(@PathParam("param") String msg) {
|
||||
|
||||
String result = "Restful example : " + msg;
|
||||
|
||||
return Response.status(200).entity(result).build();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## Resteasy Client
|
||||
|
||||
|
||||
JAX-RS 2.0介绍了一种新的client API,涉及主要3个类:Client , WebTarget 和Response。有两种方式来创建一个Client,标准的方式和使用ResteasyClientBuilder类,后一种方式配置client的方法更少。
|
||||
|
||||
```
|
||||
Client client = ClientBuilder.newClient();
|
||||
... or...
|
||||
Client client = ClientBuilder.newBuilder().build();
|
||||
WebTarget target = client.target("http://foo.com/resource");
|
||||
Response response = target.request().get();
|
||||
String value = response.readEntity(String.class);
|
||||
response.close(); // You should close connections!
|
||||
|
||||
ResteasyClient client = new ResteasyClientBuilder().build();
|
||||
ResteasyWebTarget target = client.target("http://foo.com/resource");
|
||||
```
|
||||
@@ -1,8 +1,15 @@
|
||||
## 1 概述
|
||||
|
||||
### 基本概念
|
||||
JSR(Java Specification Request)-Java规范提案
|
||||
|
||||
jax-rs对应JSR370。jax-rs全称Java API for RESTful Services。
|
||||
|
||||
java.ws.rs是jax-rs规范中定义的包名。
|
||||
|
||||
|
||||
|
||||
|
||||
java.ws.rs是jax-rs规范中定义的包名。jax-rs全称Java API for RESTful Services。jax-rs规范目前版本是2.0规范文档
|
||||
|
||||
jax-rs中定义了
|
||||
* 一组启动方式 (以jee作为http容器 还是配合servlet作为http容器)
|
||||
@@ -16,6 +23,7 @@ jax-rs中定义了
|
||||
* Restlet 由Jerome Louvel和Dave Pawson开发 是最早的REST框架 先于JAX-RS出现
|
||||
* Apache Wink 一个Apache软件基金会孵化器中的项目 其服务模块实现JAX-RS规范
|
||||
|
||||
### JSR
|
||||
## 2 注解
|
||||
### @Path
|
||||
注解位置 类注解 方法注解
|
||||
|
||||
|
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
136
Java基础教程/Java语言基础/附录1 POJO、JavaBean、EJB.md
Normal file
@@ -0,0 +1,136 @@
|
||||
http://www.wjhsh.net/zhangminghui-p-4889761.html
|
||||
|
||||
|
||||
### POJO
|
||||
|
||||
POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。
|
||||
使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter setter方法的类,没有业务逻辑,有时可以作为VO(value -object)或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。
|
||||
|
||||
|
||||
### JPA
|
||||
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。 [1]
|
||||
Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。
|
||||
|
||||
容器级特性的支持JPA框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。
|
||||
|
||||
|
||||
### Spring
|
||||
Spring + Hibernate 常常被称为 Java Web 应用人气最旺的框架组合。而在 JCP 通过的 Web Beans JSR ,却欲将JSF + EJB + JPA 、来自 JBoss Seam(Spring 除外)的一些组件和EJB 3(能够提供有基本拦截和依赖注入功能的简化 Session Bean框架)的一个 Web 组合进行标准化。Spring 2.0 为 JPA 提供了完整的 EJB容器契约,允许 JPA在任何环境内可以在 Spring 管理的服务层使用(包括 Spring 的所有DI 和 AOP增强)。同时,关于下一个Web应用组合会是 EJB、Spring + Hibernate 还是 Spring + JPA 的论战,早已充斥于耳。
|
||||
|
||||
|
||||
### JavaEE
|
||||
JavaEE:Java Platform Enterprise Edition
|
||||
JavaEE是一个分层架构,分布式的体系结构。
|
||||
|
||||
分层架构: JavaEE由四个层次构成,分别是客户层,Web层,业务层,持久层
|
||||
* 客户层:页面展示层,运行在客户机上,可以访问Web层和业务层。Applet、客户应用程序
|
||||
* 表示层:JSP和Servlet构成的Web页面。Web容器
|
||||
* 业务层:处理程序的业务逻辑,主要是一些业务方法的集合。主要框架有Spring,SpringMVC,Struts,EJB框架等。EJB 构件 EJB容器
|
||||
* 持久层:数据库层,JDBC,JNDI,DataSource等,主要一流框架有Mybatis,Hibernate框架等
|
||||
|
||||
### EJB
|
||||
EJB:Enterprise Java Bean,一个重量级的业务层框架,重量级的意思在于其启动时开销大。
|
||||
|
||||
Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)
|
||||
|
||||
1.JavaBean
|
||||
JavaBean(官方解释)是可复用的Java组件,严格遵循Sun定义的规范要求,JavaBean是一个标准,开发者可以直接复用别人写好软件组件而不必理解它内部的工作机制。简单来说一个JavaBean应该有下面几个特点,
|
||||
|
||||
>类应该是public的
|
||||
|
||||
>属性应该private的,对于属性值的访问应该是要通过getXX,setXX,isXXX方法,isXXX是用于检查元素的值是否是Boolean的。
|
||||
|
||||
>该类应该有一个无参的构造函数,元素值的初始化要通过setXXX方法。
|
||||
|
||||
>这个类应该是实现了Serializable 接口(java.io.Externalizable),这个是为了持久化存储的需要。
|
||||
|
||||
例如:
|
||||
|
||||
package com.example;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
public class Bar implements Serializable {
|
||||
|
||||
private String name = null;
|
||||
|
||||
private boolean flag = false;
|
||||
|
||||
|
||||
public Bar() {
|
||||
}
|
||||
|
||||
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
|
||||
public void setName(final String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
|
||||
public boolean isFlag() {
|
||||
return this.flag;
|
||||
}
|
||||
|
||||
|
||||
public void setFlag(final boolean flag) {
|
||||
this.flag = flag;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
2.EJB(Enterprise Java Bean)
|
||||
EJB是运行在一个J2EE服务器上的Java类,它用于处理业务逻辑的,应该是这样的:
|
||||
|
||||
>有状态(Stateful)
|
||||
|
||||
>无状态的(Stateless)
|
||||
|
||||
>实体(Entity)
|
||||
|
||||
>消息驱动Bean(Message Driven Beans)
|
||||
|
||||
举例(无状态Bean):
|
||||
|
||||
|
||||
|
||||
@Stateless
|
||||
public class EmployeeServiceBean {
|
||||
@PersistenceContext
|
||||
EntityManager em;
|
||||
|
||||
public void addEmployee(Employee emp) {
|
||||
em.persist(emp);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Read more: http://www.javaexperience.com/difference-between-pojo-javabean-ejb/#ixzz3otv2sKDE
|
||||
说明:因为EJB2.0和EJB被要求是实现EJBobject 接口和指明EJB的部署类型,所以在EJB3.0中引入了注解来简化开发步骤。
|
||||
|
||||
3.POJO(Plain Old Java Object)
|
||||
一个POJO没有要求去实现了一个接口或者继承一个类,也没有任何的指导信息。POJO最大的不同之处就是它和EJB无关。Java是一个简化的JavaBean,我们之所以叫它是是简化的bean是因为它只用于装载数据而不用业务逻辑的处理。一个持久化的POJO就是PO,如果用于展示层那么它就是VO .
|
||||
|
||||
4.1.PO(persistant object ):持久化对象
|
||||
持久对象,可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合。PO中应该不包含任何对数据库的操作。
|
||||
|
||||
4.2.VO(Value Object)
|
||||
一个值对象就是一个含有值的对象,比如java.lang.Integer.VO:通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要.个人觉得同DTO(数据传输对象),在web上传递。
|
||||
|
||||
4.3.DAO:data access object
|
||||
数据访问对象,是一个sun的一个标准j2ee设计模式 .此对象用于访问数据库。通常和PO结合使用,DAO中包含了各种数据库的操作方法。通过它的方法,结合PO对数据库进行相关的操作。夹在业务逻辑与数据 库资源中间。配合VO, 提供数据库的CRUD操作。
|
||||
|
||||
4.4.DO(Domain Object)
|
||||
领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。
|
||||
|
||||
4.5.VO(View Object)
|
||||
视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
|
||||
|
||||
4.6. BO( Business object)
|
||||
用于调用DAO的业务逻辑类,并且将PO和VO联合起来进行业务操作。
|
||||
|
||||
4.7.DTO(Data Transfer Object)
|
||||
主要用于远程调用中的传输对象。比如说,一个100个字段的表就对应于PO中的100个属性,但是我们的接口只需要10个字段。那么我们就可以将只含有十个字段的DTO传递给客户端使用。这不会向客户端暴露表结构,一旦它和接口关联起来,那么它就是VO了。
|
||||
75
Java基础教程/Java语言基础/附录2 Web服务器、Web容器、中间件.md
Normal file
@@ -0,0 +1,75 @@
|
||||
# 网络技术栈
|
||||
> [参考文档](http://c.biancheng.net/servlet2/container.html)
|
||||
> [参考文档](https://blog.csdn.net/weixin_47975351/article/details/124655111)
|
||||
|
||||
|
||||

|
||||
|
||||
### web服务器
|
||||
|
||||
部署动态网站一般需要 Web 服务器的支持,例如:
|
||||
* 运行 PHP 网站一般选择 Apache 或者 Nginx;
|
||||
* 运行 ASP/ASP.NET 网站一般选择 IIS;
|
||||
* 运行 Python 网站一般选择内置的 WSGI 服务器模块——wsgiref。
|
||||
|
||||
Web 服务器是一种对外提供 Web 服务的软件,它可以接收浏览器的 HTTP 请求,并将处理结果返回给浏览器。
|
||||
|
||||
在部署 Servlet 网站时,同样需要一种类似的软件,例如 Tomcat、Jboss、Jetty、WebLogic 等,但是它们通常被称为“容器”,而不是“服务器”,这究竟是为什么呢?Servlet 容器和传统意义上的服务器有什么不同呢?
|
||||
|
||||
我们通常所说的 Web 服务器,比如 Apache、Nginx、IIS 等,它们的功能往往都比较单一,只能提供 http(s) 服务,让用户访问静态资源(HTML 文档、图片、CSS 文件、JavaScript 文件等),它们不能执行任何编程语言,也不能访问数据库,更不能让用户注册和登录。
|
||||
|
||||
也就是说,如果只有 Web 服务器,那您只能部署静态网站,不能部署动态网站。要想部署动态网站,必须要有编程语言运行环境(运行时,Runtime)的和数据库管理系统的支持。
|
||||
|
||||
部署动态网站一般至少需要三个组件,分别是 Web 服务器、脚本语言运行时和数据库,例如,部署 PHP 网站一般选择「Apache + PHP 运行时 + MySQL」的组合。
|
||||

|
||||
|
||||
|
||||
### Web容器
|
||||
> 简单来说,Web容器就是让java能够像脚本语言一样响应用户请求的工具。
|
||||
Servlet 是基于 Java 语言的,运行 Servlet 必然少不了 JRE 的支持,它负责解析和执行字节码文件(.class文件)。然而 JRE 只包含了 Java 虚拟机(JVM)、Java 核心类库和一些辅助性性文件,它并不支持 Servlet 规范。要想运行 Servlet 代码,还需要一种额外的部件,该部件必须支持 Servlet 规范,实现了 Servlet 接口和一些基础类,这种部件就是 Servlet 容器。
|
||||
|
||||
Servlet 容器就是 Servlet 代码的运行环境(运行时),它除了实现 Servlet 规范定义的各种接口和类,为 Servlet 的运行提供底层支持,还需要管理由用户编写的 Servlet 类,比如实例化类(创建对象)、调用方法、销毁类等。
|
||||
|
||||
Servlet 中的容器和生活中的容器是类似的概念:生活中容器用来装水、装粮食,Servlet 中的容器用来装类,装对象。
|
||||
|
||||
读者可能会提出疑问,我们自己编写的 Servlet 类为什么需要 Servlet 容器来管理呢?这是因为我们编写的 Servlet 类没有 main() 函数,不能独立运行,只能作为一个模块被载入到 Servlet 容器,然后由 Servlet 容器来实例化,并调用其中的方法。
|
||||
|
||||
一个动态页面对应一个 Servlet 类,开发一个动态页面就是编写一个 Servlet 类,当用户请求到达时,Servlet 容器会根据配置文件(web.xml)来决定调用哪个类。
|
||||
|
||||

|
||||
|
||||
1. 您看,Web 服务器是整个动态网站的“大门”,用户的 HTTP 请求首先到达 Web 服务器,Web 服务器判断该请求是静态资源还是动态资源:如果是静态资源就直接返回,此时相当于用户下载了一个服务器上的文件;如果是动态资源将无法处理,必须将该请求转发给 Servlet 容器。
|
||||
2. Servlet 容器接收到请求以后,会根据配置文件(web.xml)找到对应的 Servlet 类,将它加载并实例化,然后调用其中的方法来处理用户请求;处理结束后,Servlet 容器将处理结果再转交给 Web 服务器,由 Web 服务器将处理结果进行封装,以 HTTP 响应的形式发送给最终的用户。
|
||||
|
||||
常用的 Web 容器有 Tomcat、Jboss、Jetty、WebLogic 等,其中 Tomcat 由 Java 官方提供,是初学者最常使用的。
|
||||
|
||||
为了简化部署流程,Web 容器往往也会自带 Web 服务器模块,提供基本的 HTTP 服务,所以您可以不用再安装 Apache、IIS、Nginx 等传统意义上的服务器,只需要安装一款 Web 容器,就能部署 Servlet 网站了。正是由于这个原因,有的教材将 Tomcat 称为 Web 容器,有的教材又将 Tomcat 称为 Web 服务器,两者的概念已经非常模糊了。
|
||||
|
||||
将 Web 容器当做服务器使用后,上面的流程图就变成了下面的样子:
|
||||
|
||||

|
||||
|
||||
|
||||
> 注意,Servlet 容器自带的 Web 服务器模块虽然没有传统的 Web 服务器强大,但是也足以应付大部分开发场景,对初学者来说是足够的。当然,您也可以将传统的 Web 服务器和 Servlet 容器组合起来,两者分工协作,各司其职,共同完成 HTTP 请求。
|
||||
|
||||
总结,Servlet 容器就是 Servlet 程序的运行环境,它主要包含以下几个功能:
|
||||
* 实现 Servlet 规范定义的各种接口和类,为 Servlet 的运行提供底层支持;
|
||||
* 管理用户编写的 Servlet 类,以及实例化以后的对象;
|
||||
* 提供 HTTP 服务,相当于一个简化的服务器。
|
||||
|
||||
|
||||
容器提供什么
|
||||
* 通讯支持:利用容器提供的方法,可以轻松的让servlet与web服务器对话,无需自己建立ServerSocket、监听端口、创建流等。容器知道自己与Web服务器之间的协议。
|
||||
* 生命周期的管理:控制着Servlet的生与死。
|
||||
* 多线程支持:容器会自动的为其接收的每个Servlet请求创建一个新的Java线程。
|
||||
* 声明方式实现安全:利用容器,可以使用XML部署描述文件来配置和修改安全性,而不必将其硬编码写入到Servlet(或其他)类代码中。
|
||||
* JSP支持:将JSP翻译成Java。
|
||||
|
||||
|
||||
|
||||
## 常见的Java web容器和服务器
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
51
Java基础教程/Java语言基础/附录3 Servlet、JSP、EJB.md
Normal file
@@ -0,0 +1,51 @@
|
||||
> [参考文献](https://www.zhihu.com/question/37962386)
|
||||
|
||||
# 概念介绍
|
||||
|
||||
> 想起我们Java老师经典的话,jsp就是在html里面写java代码,servlet就是在java里面写html代码…其实jsp经过容器解释之后就是servlet.
|
||||
> 当前后端分离以后,就不需要再Servlet里写html代码了。只需要完成业务逻辑返回序列化的原始数据,由前端自行渲染。所以现在的所有前后端分离技术,像Spring这种后端框架,本质上也是创建servlet的。
|
||||
|
||||
|
||||
## Servlet
|
||||
|
||||
Servlet其实就是一个遵循Servlet开发的java类。Servlet是由服务器调用的,运行在服务器端。
|
||||
|
||||
* Java基本程序,依赖jdk和jre,就能在虚拟机上运行
|
||||
* servlet是一种特殊的Java类,遵循新的标准和规范,需要web容器才能提供web服务(没有主类,根据映射选择性执行的Java程序),例如tomcat。相当于为了扩展java无法作为动态语言提供web服务的,建立了新的java技术标准,但是需要额外的运行环境支撑。web容器就是servlet的运行环境。
|
||||
|
||||
|
||||
ervlet是使用Java Servlet 应用程序设计接口(API)及相关类和方法的 Java 程序。除了 Java Servlet API,Servlet 还可以使用用以扩展和添加到 API 的 Java 类软件包。Servlet 在启用 Java 的 Web 服务器上或应用服务器上运行并扩展了该服务器的能力。Java servlet对于Web服务器就好象Java applet对于Web浏览器。Servlet装入Web服务器并在Web服务器内执行,而applet装入Web浏览器并在Web浏览器内执行。Java Servlet API 定义了一个servlet 和Java使能的服务器之间的一个标准接口,这使得Servlets具有跨服务器平台的特性。
|
||||
|
||||
Servlet 通过创建一个框架来扩展服务器的能力,以提供在 Web 上进行请求和响应服务。当客户机发送请求至服务器时,服务器可以将请求信息发送给 Servlet,并让 Servlet 建立起服务器返回给客户机的响应。 当启动 Web 服务器或客户机第一次请求服务时,可以自动装入 Servlet。装入后, Servlet 继续运行直到其它客户机发出请求。Servlet 的功能涉及范围很广。例如,Servlet 可完成如下功能:
|
||||
|
||||
(1) 创建并返回一个包含基于客户请求性质的动态内容的完整的 HTML页面。
|
||||
|
||||
(2) 创建可嵌入到现有 HTML 页面中的一部分 HTML 页面(HTML 片段)。
|
||||
|
||||
(3) 与其它服务器资源(包括数据库和基于 Java 的应用程序)进行通信。
|
||||
|
||||
(4) 用多个客户机处理连接,接收多个客户机的输入,并将结果广播到多个客户机上。例如,Servlet 可
|
||||
|
||||
以是多参与者的游戏服务器。
|
||||
|
||||
(5) 当允许在单连接方式下传送数据的情况下,在浏览器上打开服务器至applet的新连接,并将该连
|
||||
|
||||
接保持在打开状态。当允许客户机和服务器简单、高效地执行会话的情况下,applet也可以启动客户浏览器和服务器之间的连接。可以通过定制协议或标准(如 IIOP)进行通信。
|
||||
|
||||
(6) 对特殊的处理采用 MIME 类型过滤数据,例如图像转换和服务器端包括(SSI)。
|
||||
|
||||
(7) 将定制的处理提供给所有服务器的标准例行程序。例如,Servlet 可以修改如何认证用户。
|
||||
|
||||
## JSP
|
||||
|
||||
JSP全名为Java Server Pages,java服务器页面。JSP是一种基于文本的程序,其特点就是HTML和Java代码共同存在!
|
||||
|
||||
JSP是为了简化Servlet的工作出现的替代品,Servlet输出HTML非常困难,JSP就是替代Servlet输出HTML的。
|
||||
|
||||
在Tomcat博客中我提到过:Tomcat访问任何的资源都是在访问Servlet!,当然了,JSP也不例外!JSP本身就是一种Servlet。为什么我说JSP本身就是一种Servlet呢?其实JSP在第一次被访问的时候会被编译为HttpJspPage类(该类是HttpServlet的一个子类)
|
||||
|
||||
编译过程是这样子的:
|
||||
1. 浏览器第一次请求1.jsp时,Tomcat会将1.jsp转化成1_jsp.java这么一个类,并将该文件编译成class文件。
|
||||
2. 编译完毕后再运行class文件来响应浏览器的请求。以后访问1.jsp就不再重新编译jsp文件了,直接调用class文件来响应浏览器。当然了,如果Tomcat检测到JSP页面改动了的话,会重新编译的。
|
||||
3. 既然JSP是一个Servlet,那JSP页面中的HTML排版标签是用write()出去的罢了。说到底,JSP就是封装了Servlet的java程序罢了。
|
||||
|
||||
BIN
Linux/Linux工具命令/.DS_Store
vendored
Normal file
@@ -32,74 +32,7 @@ Spring5添加的新模块。用于web开发的,功能与SpringMVC类似。Webf
|
||||
### 使用场景:网关
|
||||
* 需要处理大量的请求。所有客户调用网关,网关负责调用其他的组件。可以使用异步的方式。
|
||||
|
||||
## 2 网络技术栈
|
||||
> [参考文档](http://c.biancheng.net/servlet2/container.html)
|
||||
|
||||
|
||||

|
||||
|
||||
### web服务器
|
||||
|
||||
部署动态网站一般需要 Web 服务器的支持,例如:
|
||||
* 运行 PHP 网站一般选择 Apache 或者 Nginx;
|
||||
* 运行 ASP/ASP.NET 网站一般选择 IIS;
|
||||
* 运行 Python 网站一般选择内置的 WSGI 服务器模块——wsgiref。
|
||||
|
||||
Web 服务器是一种对外提供 Web 服务的软件,它可以接收浏览器的 HTTP 请求,并将处理结果返回给浏览器。
|
||||
|
||||
在部署 Servlet 网站时,同样需要一种类似的软件,例如 Tomcat、Jboss、Jetty、WebLogic 等,但是它们通常被称为“容器”,而不是“服务器”,这究竟是为什么呢?Servlet 容器和传统意义上的服务器有什么不同呢?
|
||||
|
||||
我们通常所说的 Web 服务器,比如 Apache、Nginx、IIS 等,它们的功能往往都比较单一,只能提供 http(s) 服务,让用户访问静态资源(HTML 文档、图片、CSS 文件、JavaScript 文件等),它们不能执行任何编程语言,也不能访问数据库,更不能让用户注册和登录。
|
||||
|
||||
也就是说,如果只有 Web 服务器,那您只能部署静态网站,不能部署动态网站。要想部署动态网站,必须要有编程语言运行环境(运行时,Runtime)的和数据库管理系统的支持。
|
||||
|
||||
部署动态网站一般至少需要三个组件,分别是 Web 服务器、脚本语言运行时和数据库,例如,部署 PHP 网站一般选择「Apache + PHP 运行时 + MySQL」的组合。
|
||||

|
||||
|
||||
|
||||
### Web容器
|
||||
> 简单来说,Web容器就是让java能够像脚本语言一样响应用户请求的工具。
|
||||
Servlet 是基于 Java 语言的,运行 Servlet 必然少不了 JRE 的支持,它负责解析和执行字节码文件(.class文件)。然而 JRE 只包含了 Java 虚拟机(JVM)、Java 核心类库和一些辅助性性文件,它并不支持 Servlet 规范。要想运行 Servlet 代码,还需要一种额外的部件,该部件必须支持 Servlet 规范,实现了 Servlet 接口和一些基础类,这种部件就是 Servlet 容器。
|
||||
|
||||
Servlet 容器就是 Servlet 代码的运行环境(运行时),它除了实现 Servlet 规范定义的各种接口和类,为 Servlet 的运行提供底层支持,还需要管理由用户编写的 Servlet 类,比如实例化类(创建对象)、调用方法、销毁类等。
|
||||
|
||||
Servlet 中的容器和生活中的容器是类似的概念:生活中容器用来装水、装粮食,Servlet 中的容器用来装类,装对象。
|
||||
|
||||
读者可能会提出疑问,我们自己编写的 Servlet 类为什么需要 Servlet 容器来管理呢?这是因为我们编写的 Servlet 类没有 main() 函数,不能独立运行,只能作为一个模块被载入到 Servlet 容器,然后由 Servlet 容器来实例化,并调用其中的方法。
|
||||
|
||||
一个动态页面对应一个 Servlet 类,开发一个动态页面就是编写一个 Servlet 类,当用户请求到达时,Servlet 容器会根据配置文件(web.xml)来决定调用哪个类。
|
||||
|
||||

|
||||
|
||||
1. 您看,Web 服务器是整个动态网站的“大门”,用户的 HTTP 请求首先到达 Web 服务器,Web 服务器判断该请求是静态资源还是动态资源:如果是静态资源就直接返回,此时相当于用户下载了一个服务器上的文件;如果是动态资源将无法处理,必须将该请求转发给 Servlet 容器。
|
||||
2. Servlet 容器接收到请求以后,会根据配置文件(web.xml)找到对应的 Servlet 类,将它加载并实例化,然后调用其中的方法来处理用户请求;处理结束后,Servlet 容器将处理结果再转交给 Web 服务器,由 Web 服务器将处理结果进行封装,以 HTTP 响应的形式发送给最终的用户。
|
||||
|
||||
常用的 Web 容器有 Tomcat、Jboss、Jetty、WebLogic 等,其中 Tomcat 由 Java 官方提供,是初学者最常使用的。
|
||||
|
||||
为了简化部署流程,Web 容器往往也会自带 Web 服务器模块,提供基本的 HTTP 服务,所以您可以不用再安装 Apache、IIS、Nginx 等传统意义上的服务器,只需要安装一款 Web 容器,就能部署 Servlet 网站了。正是由于这个原因,有的教材将 Tomcat 称为 Web 容器,有的教材又将 Tomcat 称为 Web 服务器,两者的概念已经非常模糊了。
|
||||
|
||||
将 Web 容器当做服务器使用后,上面的流程图就变成了下面的样子:
|
||||
|
||||

|
||||
|
||||
|
||||
> 注意,Servlet 容器自带的 Web 服务器模块虽然没有传统的 Web 服务器强大,但是也足以应付大部分开发场景,对初学者来说是足够的。当然,您也可以将传统的 Web 服务器和 Servlet 容器组合起来,两者分工协作,各司其职,共同完成 HTTP 请求。
|
||||
|
||||
总结,Servlet 容器就是 Servlet 程序的运行环境,它主要包含以下几个功能:
|
||||
* 实现 Servlet 规范定义的各种接口和类,为 Servlet 的运行提供底层支持;
|
||||
* 管理用户编写的 Servlet 类,以及实例化以后的对象;
|
||||
* 提供 HTTP 服务,相当于一个简化的服务器。
|
||||
|
||||
|
||||
容器提供什么
|
||||
* 通讯支持:利用容器提供的方法,可以轻松的让servlet与web服务器对话,无需自己建立ServerSocket、监听端口、创建流等。容器知道自己与Web服务器之间的协议。
|
||||
* 生命周期的管理:控制着Servlet的生与死。
|
||||
* 多线程支持:容器会自动的为其接收的每个Servlet请求创建一个新的Java线程。
|
||||
* 声明方式实现安全:利用容器,可以使用XML部署描述文件来配置和修改安全性,而不必将其硬编码写入到Servlet(或其他)类代码中。
|
||||
* JSP支持:将JSP翻译成Java。
|
||||
|
||||
|
||||
## 3 响应式编程
|
||||
## 2 响应式编程
|
||||
|
||||
### 响应式编程定义
|
||||
响应式编程是一种面向数据流和变化产波的编程范式。
|
||||
|
||||
18
hello.txt
Normal file
@@ -0,0 +1,18 @@
|
||||
hhhhhello
|
||||
world
|
||||
world
|
||||
world
|
||||
world
|
||||
this is my first vim command;
|
||||
pppp
|
||||
hello
|
||||
"hello"hello
|
||||
new line insert
|
||||
world
|
||||
pppp
|
||||
pppp
|
||||
hello
|
||||
ihello i am vim command;
|
||||
pppp
|
||||
hello
|
||||
|
||||
6
start.sh
@@ -1,4 +1,5 @@
|
||||
git push -f git@github.com:Estom/notes.git
|
||||
# 将笔记推送到不同的仓库中
|
||||
git push git@github.com:Estom/notes.git
|
||||
git push git@github.com:Estom/notes.git
|
||||
|
||||
|
||||
@@ -6,3 +7,6 @@ git push git@github.com:Estom/notes.git
|
||||
find . -name "*.java" -exec wc -l {} \;#利用exec参数
|
||||
find . -name "*.java" |xargs wc -l # 利用xargs参数
|
||||
find . -name "*.java" -exec wc -l {} \; | awk 'BEGIN{num=0} {num+=$1;print $1;}END{print num}'
|
||||
|
||||
# 查看今天的日志
|
||||
find . -name "*.log" | xargs grep "wrod"
|
||||
|
||||