Java Web作业

可计算性:
假设有一个纸带和一个打孔机,然后有一套指令,能够控制打孔机在纸带上移动、能够读取当前位置是否打了孔、能够在当前位置打一个孔,这就是一个图灵机(by阿兰.图灵),假设一个问题能够靠这个纸带+打孔机+指令的方式解决,那就说明这个问题是“可计算的”。

用函数组合的方式来描述计算过程,这就是Lambda演算(by阿隆佐·邱奇),假设一个问题能够用一套函数组合的算法来表达,那就说明这个问题是可计算的。

编程范式:
命令式编程(Imperative Programming): 专注于”如何去做”,这样不管”做什么”,都会按照你的命令去做。解决某一问题的具体算法实现。按图灵机方式运作,为冯诺依曼式计算机设计
函数式编程(Functional Programming):把运算过程尽量写成一系列嵌套的函数调用。按Lambda演算方式运作,为非冯诺依曼计算机设计
逻辑式编程(Logical Programming):它设定答案须符合的规则来解决问题,而非设定步骤来解决问题。过程是事实+规则=结果。


函数式编程:
将计算描述为一种表达式求值。
在狭义上,函数式编程意味着没有可变变量,赋值,循环和其他的命令式控制结构。即,纯函数式编程语言。
    Pure Lisp, XSLT, XPath, XQuery, FP
    Haskell (without I/O Monad or UnsafPerformIO)

在广义上,函数式编程意味着专注于函数

    Lisp, Scheme, Racket, Clojure
    SML, Ocaml, F#
    Haskell (full language)
    Scala
    Smalltalk, Ruby
函数:
不是指命令式编程中的函数(我们可以认为C++程序中的函数本质是一段子程序Subroutine),而是指数学中的函数,即自变量的映射(一种东西和另一种东西之间的对应关系)。也就是说,一个函数的值仅决定于函数参数的值,不依赖其他状态。
在函数式语言中,函数被称为一等函数(First-class function),与其他数据类型一样,作为一等公民,处于平等地位,可以在任何地方定义,在函数内或函数外;可以赋值给其他变量;可以作为参数,传入另一个函数,或者作为别的函数的返回值。
纯函数:
 不依赖外部状态:相同的输入,永远会得到相同的输出
 不改变外部状态:没有任何可观察的副作用。
变量
不是指命令式编程语言中的变量(存储状态的内存单元),而是数学代数中的变量,即一个值的名称。
变量的值是不可变的(immutable),即不可多次赋值
表达式和语句
表达式(expression):一个单纯的运算过程,总是有返回值
语句(statement):执行某种操作(更多的是逻辑语句),没有返回值。
严格意义上,函数式编程要求只使用表达式,不使用语句。命令式编程语言中的控制语句在函数式编程中也是表达式。但只有纯函数式编程语言才完全符合要求。
状态:
命令式编程的状态就是图灵机的纸带,包括了当前定义的全部变量,以及一些当前系统的状态,比如打开的文件、网络的连接、申请的内存等等。
函数式编程强调无状态,不是不保存状态,而是强调将状态锁定在函数的内部,不依赖于外部的任何状态。更准确一点,它是通过函数创建新的参数或返回值来保存程序的状态的。

每个叠加函数的参数或返回结果表示程序的一个中间状态

流行原因
简单:加快了开发的速度
并行:在编程过程中无需修改代码程序就可并发执行,且运行期间不会产生死锁
函数:可复用
单元测试,代码热部署,易于管理:不依赖,不改变外部状态

HTTP(HyperText Transfer Protocol,超文本传输协议)是应用最广泛的网络协议。位于TCP/IP通信协议的应用层,所有的WWW文件都必须遵守这个标准。
HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。(现在可以持久连接)
HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。(比如multipart)
HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。(通过cookie技术保存)
请求经过:
客户端的应用层(http协议)
客户端的传输层(tcp或udp协议)
客户端的网络层(ip协议)
客户端的链路层(网卡,路由器等)
经过dns解析,穿越多个isp(互联网服务提供商,移动,联通,电信等),各种数据交换,找到了服务器
服务器的链路层 
服务器的网络层
服务器的传输层
服务器的应用层
响应与之相反
详细过程:
域名解析
① 浏览器 会首先搜索浏览器自身的DNS缓存,看自身的缓存中是否有对应的条目,而且没有过期,如果有且没有过期则解析到此结束。
② 如果浏览器自身的缓存里面没有找到对应的条目,那么会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索解析到此结束.
③ 如果在Windows系统的DNS缓存也没有找到,那么尝试读取hosts文件(位于C:\Windows\System32\drivers\etc),看看这里面有没有该域名对应的IP地址,如果有则解析成功。
④ 如果在hosts文件中也没有找到对应的条目,浏览器就会发起一个DNS的系统调用,就会向本地配置的首选DNS服务器发起域名解析请求(通过的是UDP协议向DNS的53端口发起递归的请求),DNS服务器首先查找自身的缓存,找到对应的条目,且没有过期,则解析成功。如果没有找到对应的条目,则发起迭代DNS解析请求,把找到的结果发送给DNS服务器,并返回给Windows系统内核,内核又把结果返回给浏览器
如果经过以上的4个步骤,还没有解析成功,那么会进行如下步骤(以下是针对Windows操作系统):
⑤ 操作系统就会查找NetBIOS name Cache
⑥ 如果第⑤步也没有成功,那会查询WINS 服务器
⑦ 如果第⑥步也没有查询成功,那么客户端就要进行广播查找
⑧ 如果第⑦步也没有成功,那么客户端就读取LMHOSTS文件(和HOSTS文件同一个目录下)
如果第八步还没有解析成功,那么就宣告这次解析失败
3次握手
1) Client首先发送一个连接试探,ACK=0 表示确认号无效,SYN = 1 表示这是一个连接请求或连接接受报文,同时表示这个数据报不能携带数据,seq = x 表示Client自己的初始序号(seq = 0 就代表这是第0号包),这时候Client进入syn_sent状态,表示客户端等待服务器的回复

2) Server监听到连接请求报文后,如同意建立连接,则向Client发送确认。TCP报文首部中的SYN 和 ACK都置1 ,ack = x + 1表示期望收到对方下一个报文段的第一个数据字节序号是x+1,同时表明x为止的所有数据都已正确收到(ack=1其实是ack=0+1,也就是期望客户端的第1个包),seq = y 表示Server 自己的初始序号(seq=0就代表这是服务器这边发出的第0号包)。这时服务器进入syn_rcvd,表示服务器已经收到Client的连接请求,等待client的确认。

3) Client收到确认后还需再次发送确认,同时携带要发送给Server的数据。ACK 置1 表示确认号ack= y + 1 有效(代表期望收到服务器的第1个包),Client自己的序号seq= x + 1(表示这就是我的第1个包,相对于第0个包来说的),一旦收到Client的确认之后,这个TCP连接就进入Established状态,就可以发起http请求了。
发起http请求
报文格式:
起始行:如 GET / HTTP/1.0 (请求的方法  请求的URL 请求所使用的协议)

头部信息:User-Agent  Host等成对出现的值

主体
响应http请求:
1xx: 信息性状态码

    100, 101

2xx: 成功状态码

    200:OK

3xx: 重定向状态码

    301: 永久重定向, Location响应首部的值仍为当前URL,因此为隐藏重定向;

    302: 临时重定向,显式重定向, Location响应首部的值为新的URL

    304:Not Modified  未修改,比如本地缓存的资源文件和服务器上比较时,发现并没有修改,服务器返回一个304状态码,

                        告诉浏览器,你不用请求该资源,直接使用本地的资源即可。

4xx: 客户端错误状态码

    404: Not Found  请求的URL资源并不存在

5xx: 服务器端错误状态码

    500: Internal Server Error  服务器内部错误

    502: Bad Gateway  前面代理服务器联系不到后端的服务器时出现

    504:Gateway Timeout  这个是代理能联系到后端的服务器,但是后端的服务器在规定的时间内没有给代理服务器响应
解析html代码
浏览器拿到index.html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,就向服务器端去请求下载(会使用多线程下载,每个浏览器的线程数不一样),这个时候就用上keep-alive特性了,建立一次HTTP连接,可以请求多个资源,下载资源的顺序就是按照代码里的顺序,但是由于每个资源大小不一样,而浏览器又多线程请求请求资源,所以从下图看出,这里显示的顺序并不一定是代码里面的顺序。


浏览器在请求静态资源时(在未过期的情况下),向服务器端发起一个http请求(询问自从上一次修改时间到现在有没有对资源进行修改),如果服务器端返回304状态码(告诉浏览器服务器端没有修改),那么浏览器会直接读取本地的该资源的缓存文件。
页面进行渲染
浏览器利用自己内部的工作机制,把请求到的静态资源和html代码进行渲染,渲染之后呈现给用户。
URI  Uniform Resource Identifier 统一资源标识符

URL  Uniform Resource Locator 统一资源定位符

    格式如下:  scheme://[username:password@]HOST:port/path/to/source

                http://www.magedu.com/downloads/nginx-1.5.tar.gz


URN  Uniform Resource Name 统一资源名称


URL和URN 都属于 URI

版本控制系统:
版本控制软件提供完备的版本管理功能,用于存储、追踪目录(文件夹)和文件的修改历史,是软件开发者的必备工具,是软件公司的基础设施。版本控制软件的最高目标,是支持软件公司的配置管理活动,追踪多个版本的开发和维护活动,及时发布软件。
在开发过程中会出现多个迭代版本,或者多个并存版本,通过人工控制费时费力,版本控制系统不但可以提供简便的解决方式,也为多人合作开发提供了基础。
Linux开源需要管理大量代码,由Linus一人手工合并,由于CVS,SVN等集中式版本控制系统速度慢,商业软件不开源,Linus自己两周内用C开发了一个分布式版本控制系统——Git,并用它实现对Linux源码的管理
目前Git是最流行的分布式版本控制系统,Github为开源项目提供Git存储。
安装过程:Git官网下载并安装
clone glassfish example:
1创建文件夹
mkdir learngit3
cd learngit3
2创建仓库
git init
3clone项目
github URL:https://github.com/javaee/glassfish-samples.git
git clone https://github.com/javaee/glassfish-samples.git
3查看目录


 Gradle和Maven都是项目自动构建工具,编译源代码只是整个过程的一个方面,更重要的是,如果要软件发布到生产环境中来产生商业价值,就要运行测试,构建分布、分析代码质量、甚至为不同目标环境提供不同版本,然后部署。整个过程进行自动化操作是很有必要的。

       整个过程可以分成以下几个步骤:
           a. 编译源代码;
           b. 运行单元测试和集成测试;
           c. 执行静态代码分析、生成分析报告;
           d. 创建发布版本;
           e. 部署到目标环境;
           f. 部署传递过程;
           g. 执行冒烟测试和自动功能测试。

       如果你手工去执行每一个步骤无疑效率比较低而且容易出错,有了自动化构建就只需要自定义构建逻辑,剩下的事情交给工具去完成。

       虽然两者都是项目工具,但是maven现在已经是行业标准,Gradle是后起之秀,很多人对他的了解都是从android studio中得到的,Gradle抛弃了Maven的基于XML的繁琐配置,众所周知XML的阅读体验比较差,对于机器来说虽然容易识别,但毕竟是由人去维护的。取而代之的是Gradle采用了领域特定语言Groovy的配置,大大简化了构建代码的行数。

       比如在Maven中你要引入一些依赖:
          <properties>
                  <kaptcha.version>2.3</kaptcha.version>
          </properties>
          <dependencies>
                  <dependency>
                      <groupId>com.google.code.kaptcha</groupId>
                      <artifactId>kaptcha</artifactId>
                      <version>${kaptcha.version}</version>
                      <classifier>jdk15</classifier>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework</groupId>
                      <artifactId>spring-core</artifactId>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework</groupId>
                      <artifactId>spring-beans</artifactId>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework</groupId>
                      <artifactId>spring-context</artifactId>
                  </dependency>
                  <dependency>
                      <groupId>junit</groupId>
                      <artifactId>junit</artifactId>
                  </dependency>
          </dependencies>
       然后将其转换成Gradle脚本,结果是惊人的:
          dependencies {
              compile('org.springframework:spring-core:2.5.6')
              compile('org.springframework:spring-beans:2.5.6')
              compile('org.springframework:spring-context:2.5.6')
              compile('com.google.code.kaptcha:kaptcha:2.3:jdk15')
              testCompile('junit:junit:4.7')
          }

       注意配置从原来的28行缩减至7行!这还不算省略的一些父POM配置。依赖的groupId、artifactId、 version,scope甚至是classfier,一点都不少。较之于Maven或者Ant的XML配置脚本,Gradle使用的Grovvy脚本杀伤力太大了,爱美之心,人皆有之,相比于七旬老妇松松垮垮的皱纹,大家肯定都喜欢少女紧致的脸蛋,XML就是那老妇的皱纹。

       Gradle很显著的两个特点:
          其一是简洁,基于Groovy的紧凑脚本实在让人爱不释手,在表述意图方面也没有什么不清晰的地方。
          其二是灵活,各种在Maven中难以下手的事情,在Gradle就是小菜一碟,比如修改现有的构建生命周期,几行配置就完成了。

gradle安装

猜你喜欢

转载自blog.csdn.net/blow_bb/article/details/88210347
今日推荐