精华内容
下载资源
问答
  • 上节课我们学习了在 Kubernetes 集群内部使用 kube-dns 实现服务发现的功能,那么我们部署在 Kubernetes 集群中应用如何暴露给外部用户使用呢?我们知道前面我们使用 NodePort 和 LoadBlancer 类型 Service ...

    外部服务发现之 ingress

    上节课我们学习了在 Kubernetes 集群内部使用 kube-dns 实现服务发现的功能,那么我们部署在 Kubernetes 集群中的应用如何暴露给外部的用户使用呢?我们知道前面我们使用 NodePort 和 LoadBlancer 类型的 Service 可以实现把应用暴露给外部用户使用,除此之外,Kubernetes 还为我们提供了一个非常重要的资源对象可以用来暴露服务给外部用户,那就是 ingress。对于小规模的应用我们使用 NodePort 或许能够满足我们的需求,但是当你的应用越来越多的时候,你就会发现对于 NodePort 的管理就非常麻烦了,这个时候使用 ingress 就非常方便了,可以避免管理大量的 Port。

    介绍

    Ingress其实就是从 kuberenets 集群外部访问集群的一个入口,将外部的请求转发到集群内不同的 Service 上,其实就相当于 nginx、haproxy 等负载均衡代理服务器,有的同学可能觉得我们直接使用 nginx 就实现了,但是只使用 nginx 这种方式有很大缺陷,每次有新服务加入的时候怎么改 Nginx 配置?不可能让我们去手动更改或者滚动更新前端的 Nginx Pod 吧?那我们再加上一个服务发现的工具比如 consul 如何?貌似是可以,对吧?而且在之前单独使用 docker 的时候,这种方式已经使用得很普遍了,Ingress 实际上就是这样实现的,只是服务发现的功能自己实现了,不需要使用第三方的服务了,然后再加上一个域名规则定义,路由信息的刷新需要一个靠 Ingress controller 来提供。

    Ingress controller 可以理解为一个监听器,通过不断地与 kube-apiserver 打交道,实时的感知后端 service、pod 的变化,当得到这些变化信息后,Ingress controller 再结合 Ingress 的配置,更新反向代理负载均衡器,达到服务发现的作用。其实这点和服务发现工具 consul consul-template 非常类似。

    现在可以供大家使用的 Ingress controller 有很多,比如 traefik、nginx-controller、Kubernetes Ingress Controller for Kong、HAProxy Ingress controller,当然你也可以自己实现一个 Ingress Controller,现在普遍用得较多的是 traefik 和 nginx-controller,traefik 的性能较 nginx-controller 差,但是配置使用要简单许多,我们这里会以更简单的 traefik 为例给大家介绍 ingress 的使用。

    Traefik

    Traefik 是一款开源的反向代理与负载均衡工具。它最大的优点是能够与常见的微服务系统直接整合,可以实现自动化动态配置。目前支持 Docker、Swarm、Mesos/Marathon、 Mesos、Kubernetes、Consul、Etcd、Zookeeper、BoltDB、Rest API 等等后端模型。
    在这里插入图片描述要使用 traefik,我们同样需要部署 traefik 的 Pod,由于我们演示的集群中只有 master 节点有外网网卡,所以我们这里只有 master 这一个边缘节点,我们将 traefik 部署到该节点上即可。

    首先,为安全起见我们这里使用 RBAC 安全认证方式:(rbac.yaml):

    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: traefik-ingress-controller
      namespace: kube-system
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: traefik-ingress-controller
    rules:
      - apiGroups:
          - ""
        resources:
          - services
          - endpoints
          - secrets
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - extensions
        resources:
          - ingresses
        verbs:
          - get
          - list
          - watch
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: traefik-ingress-controller
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: traefik-ingress-controller
    subjects:
    - kind: ServiceAccount
      name: traefik-ingress-controller
      namespace: kube-system
    

    直接在集群中创建即可:

    $ kubectl create -f rbac.yaml
    serviceaccount "traefik-ingress-controller" created
    clusterrole.rbac.authorization.k8s.io "traefik-ingress-controller" created
    clusterrolebinding.rbac.authorization.k8s.io "traefik-ingress-controller" created
    

    然后使用 Deployment 来管理 Pod,直接使用官方的 traefik 镜像部署即可(traefik.yaml)

    ---
    kind: Deployment
    apiVersion: extensions/v1beta1
    metadata:
      name: traefik-ingress-controller
      namespace: kube-system
      labels:
        k8s-app: traefik-ingress-lb
    spec:
      replicas: 1
      selector:
        matchLabels:
          k8s-app: traefik-ingress-lb
      template:
        metadata:
          labels:
            k8s-app: traefik-ingress-lb
            name: traefik-ingress-lb
        spec:
          serviceAccountName: traefik-ingress-controller
          terminationGracePeriodSeconds: 60
          tolerations:
          - operator: "Exists"
          nodeSelector:
            kubernetes.io/hostname: master
          containers:
          - image: traefik
            name: traefik-ingress-lb
            ports:
            - name: http
              containerPort: 80
            - name: admin
              containerPort: 8080
            args:
            - --api
            - --kubernetes
            - --logLevel=INFO
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: traefik-ingress-service
      namespace: kube-system
    spec:
      selector:
        k8s-app: traefik-ingress-lb
      ports:
        - protocol: TCP
          port: 80
          name: web
        - protocol: TCP
          port: 8080
          name: admin
      type: NodePort
    

    直接创建上面的资源对象即可:

    $ kubectl create -f traefik.yaml
    deployment.extensions "traefik-ingress-controller" created
    service "traefik-ingress-service" created
    

    要注意上面 yaml 文件:

    tolerations:
    - operator: "Exists"
    nodeSelector:
      kubernetes.io/hostname: master
    

    由于我们这里的特殊性,只有 master 节点有外网访问权限,所以我们使用nodeSelector标签将traefik的固定调度到master这个节点上,那么上面的tolerations是干什么的呢?这个是因为我们集群使用的 kubeadm 安装的,master 节点默认是不能被普通应用调度的,要被调度的话就需要添加这里的 tolerations 属性,当然如果你的集群和我们的不太一样,直接去掉这里的调度策略就行。

    nodeSelector 和 tolerations 都属于 Pod 的调度策略,在后面的课程中会为大家讲解。
    

    traefik 还提供了一个 web ui 工具,就是上面的 8080 端口对应的服务,为了能够访问到该服务,我们这里将服务设置成的 NodePort:

    $ kubectl get pods -n kube-system -l k8s-app=traefik-ingress-lb -o wide
    NAME                                          READY     STATUS    RESTARTS   AGE       IP            NODE
    traefik-ingress-controller-57c4f787d9-bfhnl   1/1       Running   0          8m        10.244.0.18   master
    $ kubectl get svc -n kube-system
    NAME                      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                       AGE
    ...
    traefik-ingress-service   NodePort    10.102.183.112   <none>        80:30539/TCP,8080:30486/TCP   8m
    ...
    

    现在在浏览器中输入 master_node_ip:30486 就可以访问到 traefik 的 dashboard 了:
    在这里插入图片描述

    Ingress 对象

    现在我们是通过 NodePort 来访问 traefik 的 Dashboard 的,那怎样通过 ingress 来访问呢? 首先,需要创建一个 ingress 对象:(ingress.yaml)

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: traefik-web-ui
      namespace: kube-system
      annotations:
        kubernetes.io/ingress.class: traefik
    spec:
      rules:
      - host: traefik.haimaxy.com
        http:
          paths:
          - backend:
              serviceName: traefik-ingress-service
              servicePort: 8080
    

    然后为 traefik dashboard 创建对应的 ingress 对象:

    $ kubectl create -f ingress.yaml
    ingress.extensions "traefik-web-ui" created
    

    要注意上面的 ingress 对象的规则,特别是 rules 区域,我们这里是要为 traefik 的 dashboard 建立一个 ingress 对象,所以这里的 serviceName 对应的是上面我们创建的 traefik-ingress-service,端口也要注意对应 8080 端口,为了避免端口更改,这里的 servicePort 的值也可以替换成上面定义的 port 的名字:admin

    创建完成后,我们应该怎么来测试呢?

    第一步,在本地的/etc/hosts里面添加上 traefik.haimaxy.com 与 master 节点外网 IP 的映射关系
    
    第二步,在浏览器中访问:http://traefik.haimaxy.com 我们会发现并没有得到我们期望的 dashboard 界面,这是因为我们上面部署 traefik 的时候使用的是 NodePort 这种 Service 对象,所以我们只能通过上面的 30539 端口访问到我们的目标对象:http://traefik.haimaxy.com:30539
    

    在这里插入图片描述加上端口后我们发现可以访问到 dashboard 了,而且在 dashboard 当中多了一条记录,正是上面我们创建的 ingress 对象的数据,我们还可以切换到 HEALTH 界面中,可以查看当前 traefik 代理的服务的整体的健康状态
    在这里插入图片描述 第三步,上面我们可以通过自定义域名加上端口可以访问我们的服务了,但是我们平时服务别人的服务是不是都是直接用的域名啊,http 或者 https 的,几乎很少有在域名后面加上端口访问的吧?为什么?太麻烦啊,端口也记不住,要解决这个问题,怎么办,我们只需要把我们上面的 traefik 的核心应用的端口隐射到 master 节点上的 80 端口,是不是就可以了,因为 http 默认就是访问 80 端口,但是我们在 Service 里面是添加的一个 NodePort 类型的服务,没办法映射 80 端口,怎么办?这里就可以直接在 Pod 中指定一个 hostPort 即可,更改上面的 traefik.yaml 文件中的容器端口:

    containers:
    - image: traefik
    name: traefik-ingress-lb
    ports:
    - name: http
      containerPort: 80
      hostPort: 80
    - name: admin
      containerPort: 8080
    

    添加以后hostPort: 80,然后更新应用:

    $ kubectl apply -f traefik.yaml
    

    更新完成后,这个时候我们在浏览器中直接使用域名方法测试下:
    在这里插入图片描述
    第四步,正常来说,我们如果有自己的域名,我们可以将我们的域名添加一条 DNS 记录,解析到 master 的外网 IP 上面,这样任何人都可以通过域名来访问我的暴露的服务了。

    如果你有多个边缘节点的话,可以在每个边缘节点上部署一个 ingress-controller 服务,然后在边缘节点前面挂一个负载均衡器,比如 nginx,将所有的边缘节点均作为这个负载均衡器的后端,这样就可以实现 ingress-controller 的高可用和负载均衡了。
    

    到这里我们就通过 ingress 对象对外成功暴露了一个服务,下节课我们再来详细了解 traefik 的更多用法。

    展开全文
  • 当客户端发送请求在网络某个地方停滞时候,服务器端并不会感知到,延迟到一定时间就会发生超时现象,客户端通常会断开连接。而这时候停滞在途中某个请求,又发送服务器了࿰...
  • 答: 计算机网络发展过程大致经历了四个阶段。 第一阶段:(20世纪60年代)以单个计算机为中心面向终端计算机网络系统。这种网络系统是以批处理信息为主要目的。它缺点是:如果计算机负荷较重,会导致系统...
  • 入门学习Linux常用必会60命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    虚拟控制台切换可以通过按下Alt键和一个功能键来实现,通常使用F1-F6 。 例如,用户登录后,按一下“Alt+ F2”键,用户就可以看到上面出现“login:”提示符,说明用户看到了第二虚拟控制台。然后只需按“Alt+...
  • 五个网络用四个路由器(每一个路由器有两个端口)互连起来。能否改变这种连接方法,使用一个具有五个端口路由器将这五个网络互连起来? 问题6-9:当运行PING 127.0.0.1时,这个IP数据报将发送给谁? 问题6-10:...
  • 至此,我们有了一简单开发环境了,可以充分利用网上大量以oSIP为基础代码片段和官方说明文档开始具体函数功能的测试和使用了:) --------------------------------...
  • AnyRouter(软网关) v1.11

    2019-11-02 23:28:57
    集路由器、DNS服务器、NAT、上网日志记录、上网限制于一身代理服务器软件,用于实现局域网内所有计算机共享一 Internet 连接(连接方式包括MODEM、xDSL、宽带等),防止单位重要资料机密文件等泄密,...
  • AnyRouter(软网关) v2.75

    2019-11-02 08:38:23
    集路由器、DNS服务器、NAT、上网日志记录、上网限制于一身代理服务器软件,用于实现局域网内所有计算机共享一 Internet 连接(连接方式包括MODEM、xDSL、宽带等),防止单位重要资料机密文件等泄密;...
  • 这里我们只介绍网络通信中重要的四层: 分层名称 功能 常用协议 应用层 针对特定应用的协议 FTP(文件传输有协议),DNS(域名系统)以及常见的 HTTP协议 传输层 管理两节点之间的数据传输。负...

    原地址:https://blog.csdn.net/qq_39412582/article/details/88543382

    首先我们先来回顾一下OSI七层模型:

    这里我们只介绍网络通信中重要的四层:

    分层名称    功能    常用协议
    应用层    针对特定应用的协议    FTP(文件传输有协议),DNS(域名系统)以及常见的 HTTP协议
    传输层    管理两个节点之间的数据传输。负责可靠传输(确保数据被可靠的传送到目标地址)    TCP(传输控制协议)和UDP(用户数据报协议)
    网络层    地址管理和路由选择(通过路由器寻址)    IP协议
    数据链路层    互联设备之间的传送和识别数据帧    一般是一些硬件:网卡光纤等可见设备
    应用层详解
    HTTP协议即超文本传输协议。
    说到HTTP协议,我们就离不开URL(统一资源定位符),没有它,HTTP是不完整的。
    什么是URL?
    https://www.google.com/search?q=URL&oq=URL&aqs=chrome..69i57j0l5.1240j0j8&sourceid=chrome&ie=UTF-8
    这就是一个URL,其实通俗来讲,它就是我们所说的网址。
    一个完整的URL包括:

    目录    解释
    协议名    http 或者 https
    登录认证信息    可选,一般不可见
    服务器地址    www.google.com
    服务器端口号    http是80 https是 443(比http更加保密的协议) ssh是 22
    带层次的文件路径    这里没显示出来,一般是一个相对路径比如:/dir/index.html
    查询字符串    这里显示的是search?q = URL(?之前是访问的资源,后面是传输的参数,=各个参数之间用 & 分隔)
    片段标识符    …
    HTTP协议格式
    画一张图以便理解和记忆:

    HTTP请求格式


    格式    内容
    首行    方法+URL+版本号(版本号现在浏览器一般都支持 HTTP/1.1)
    Header(头部)    请求的属性,冒号分割的键值对,每组属性之间使用 \n 分隔,遇到空行表示Header部分结束
    Body    空行后面都是body。Body允许为空字符串。如果Body存在,则在Header中有一个Content-Length来标记Body长度
    HTTP请求方法
    方法    说明    支持的HTTP协议版本
    GET    获取资源 (通过URL传参,一般数量是有限的)    1.0、1.1
    POST    获取传输实体的主体(通过正文传参)    1.0、1.1
    PUT    传输文件    1.0、1.1
    HEAD    回去报文首部    1.0、1.1
    DELETE    删除文件    1.0、1.1
    OPTIONS    询问支持的方法    1.1
    TRACE    追踪路径    1.1
    CONNECT    邀请用隧道协议来连接代理    1.1
    LINK    建立和资源之间的关系    1.0
    UNLNE    断开连接关系    1.0
    其中我们最常用的就是 GET 和POST请求。

    HTTP响应

    看起来HTTP响应格式跟请求很相似:

    格式    解释
    首行    版本号+状态码+状态码解释
    Header    请求的属性,冒号分割的键值对,每组属性之间使用 \n 分隔,遇到空行表示Header部分结束
    Body    空行后面都是Body。Body允许为空字符串。如果Body存在,则在Header中有一个Content-Length属性来标识Body长度;如果服务器返回了一个html页面,那么html页面内容就在Body中。
    HTTP状态码及解释

    类型    类别    解释
    1xx    Informational(信息状态码)    接受的请求正在处理
    2xx    Success(成功状态码)    请求正常处理完毕
    3xx    Redirection(重定向状态码)    需要进行附加操作已完成请求
    4xx    Client Error(客户端错误状态码)    服务器无法处理请求
    5xx    Server Error(服务器错误状态码)    服务器处理请求错误
    常见状态码:
    200(OK)、404(Not Found)、403(Forbidden)、302(重定向)、504(Bad Gateway)

    HTTP常见Header:

    类型    解释
    Content-Type    数据类型,如:txt、html
    Content-Length    Body长度
    Host    客户端告诉服务器,所请求的资源是在哪个主机的哪个端口
    User-Agent    声明用户的操作系统和浏览器版本信息
    referer    当前页面是从哪个页面跳转过来的
    location    搭配3xx状态码使用, 告诉客户端接下来要去哪里访问
    Cookie    用于在客户端存储少量信息. 通常用于实现会话(session)的功能;
    简易HTTP服务器

    #include <iostream>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <string.h>
    #include <stdlib.h>
    #include <cstdio>
    using namespace  std;

    int main(int argc,char* argv[])
    {
      if(argc != 3)
      {
        cerr << argv[0] << " ip port"<< endl;
        exit(0);
      }
      int fd = socket(AF_INET,SOCK_STREAM,0);
      if(fd < 0)
      {
        cerr<< "socket error" << endl;
        exit(1);
      }
      struct sockaddr_in addr;
      addr.sin_family = AF_INET;
      addr.sin_port = htons(atoi(argv[2]));
      addr.sin_addr.s_addr = inet_addr(argv[1]);

      int ret = bind(fd,(struct sockaddr*)&addr,sizeof(addr));
      if(ret < 0)
      {
        cerr<< "bind error"<< endl;
        exit(2);
      }
      ret = listen(fd,5);
      if(ret < 0)
      {
        cerr<< "listen error " << endl;
        exit(3);
      }
      while(1)
      {
        struct sockaddr_in client_addr;
        socklen_t len;
        int client_fd = accept(fd, (struct sockaddr*)&client_addr, &len);
        if (client_fd < 0) {
          perror("accept");
          continue;
        }
        char input_buf[1024 * 10] = {0};
        ssize_t read_size = read(client_fd, input_buf, sizeof(input_buf) - 1);
        if (read_size < 0) {
          return 1;
        }
        cout<< "[Request] "<< input_buf << endl;
        char buf[1024] = {0};
        const char* hello = "<h1>hello world</h1>";
        sprintf(buf, "HTTP/1.0 200 OK\nContent-Length:%lu\n\n%s", strlen(hello), hello);
        write(client_fd, buf, strlen(buf));
      }
      return 0;
    }

    说完状态码,我们再来谈谈端口号:

    端口号: 就是 用来标识一台主机上进行通信的不同的应用程序

    在TCP/IP中,用一个五元组来标识一个通信:

    五元组
    五元组: 即源IP、源端口号、目的IP、目的端口号、协议号

    查看指令:nenstat -n

    端口号的划分范围:

    0 - 1023:表示知名端口号,常见的HTTP、HTTPS、SSH、FTP都属于知名端口号,都是固定的。
    1024 - 65535 :操作系统动态分配的端口号。客户端程序的端口号就是由操作系统动态分配出来的。
    知名端口号: cat /etc/services 可以查看知名端口号

    ssh服务器, 使用22端口
    ftp服务器, 使用21端口
    telnet服务器, 使用23端口
    http服务器, 使用80端口
    https服务器, 使用443
    那么问题来了(面试题):

    一个进程是否可以bind多个端口号?
    答:可以,一个进程可以有多个socket,每个socket可以bind一个端口号。
    一个端口号是否可以被多个进程bind?
    答:不可以。前面我们说过端口号是用来标识一台主机上不同的应用程序,一个应用程序就是一个进程,如果可以的话,那么这个端口号标识的是哪一个进程呢。
    但是, 非要这样做也不是没有办法,可以    在一个进程bind一个端口号之后 fork出一个子进程,该子进程也可以拥有此 端口号。
    最后介绍两个查看网络状态的指令:

    netstat 用来产看网络状态的重要工具
    语法: nestat 【选项】
    功能: 产看网络状态
    常用选项:

    拒绝显示别名,能显示数字的全部转化成数字
    l 仅列出有在 Listen (监听) 的服務状态
    p 显示建立相关链接的程序名
    t (tcp)仅显示tcp相关选项
    u (udp)仅显示udp相关选项
    a (all)显示所有选项,默认不显示LISTEN相关
    查看TCP: netstat -alpt
    查看UDP: netstat -alpu
    pidof 查看服务器进程id
    功能:通过进程名,查看进程id
     

    展开全文
  • ·提供强大的四级地址簿及通讯组功能,包括:企业地址簿/私人地址簿/域公共地址簿/(系统)公共地址簿,并支持完善的管理机制。 ·支持数字证书服务并提供强大的管理功能,可直接在WebMail中撰写或阅读经过数字签名...
  • 玩转Linux系统之轻松搭建Nginx服务

    热门讨论 2021-05-09 16:09:27
    主要有功能: 1.web服务:搭建web站点 2.反向代理:负载调度器实现负载均衡 3.动静分离:它擅长处理静态网页,动态可以转给Apache处理 4.虚拟主机:多域名对应一台主机,提高服务器使用率,降低成本 企业...

    LNMP系统工作原理

    提示:本节讲解Nginx服务,整个平台将在后期教程详细讲解
    在这里插入图片描述

    由此可见,Nginx服务起着至关重要的作用。

    主要有四项功能:

    1.web服务:搭建web站点
    2.反向代理:负载调度器实现负载均衡
    3.动静分离:它擅长处理静态网页,动态的可以转给Apache处理
    4.虚拟主机:多个域名对应一台主机,提高服务器使用率,降低成本


    企业案例

    提示:从要求分析需求,需要搭建Nginx、DNS以及防火墙配置相关策略。

    1. 搭建两个nginx虚拟主机,www.benet.com与www.accp.com 目录为/var/www/benet和/var/www/accp
    2. www.benet.com站点上启用状态统计
      步骤:
      搭建Nginx
      1)设置静态IP(有多种方法,我习惯用sed)
      sed -i ‘2c BOOTPROTO=static’ /etc/sysconfig/network-scripts/ifcfg-ens33
      sed -i ‘17c ONBOOT=yes’ /etc/sysconfig/network-scripts/ifcfg-ens33
      sed -i ‘17a IPADDR=192.168.1.1’ /etc/sysconfig/network-scripts/ifcfg-ens33
      ifdown ens33;ifup ens33
      或者,进入网卡配置文件手工配置:
      在这里插入图片描述
      2)添加防火墙规则允许http、DNS服务流量通过
      systemctl start firewalld.service
      firewall-cmd --add-service=http
      firewall-cmd --add-service=dns
      3)安装依赖包及DNS服务
      挂载系统盘
      mount /dev/cdrom /mnt/
      rpm -ivh /mnt/pcre-devel-8.32-15.el7_2.1.x86_64.rpm
      rpm -ivh /mnt/zlib-devel-1.2.7-17.el7.x86_64.rpm
      rpm -ivh /mnt/Packages/bind-9.9.4-37.el7.x86_64.rpm
      4)卸载光盘,挂载Nginx源码包
      三步骤:解、配、编、安
      [root@localhost ~]# umount /dev/cdrom
      umount: /dev/cdrom:未挂载
      [root@localhost ~]# eject
      [root@localhost ~]# mount /dev/cdrom /mnt/

      tar -zxf /mnt/nginx-1.12.0.tar.gz -C /usr/src/
      cd /usr/src/nginx-1.12.0/
      置安装目录 (with-http_stub_status_module代表:添加状态统计模块,可选项)
      ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
      译并
      make&&make install
      创建nginx符号链接(将nginx启动程序执行文件放到命令的默认搜索路径,方便执行)
      ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
      分别创建benet、accp网页根目录
      mkdir -p /var/www/benet
      mkdir -p /var/www/accp
      设置网页内容
      echo “Look at the handsome guy on the opposite side” > /var/www/benet/index.html
      echo “Look at the beauty on the other side” > /var/www/accp/index.html
      5)nginx主配置文件
      包含全局配置、I/O事件配置、HTTP配置三大部分
      ①.全局配置:
      worker_processes代表工作进程数,一般以cpu个数来定义
       nginx启动后会启动两个进程,一个是master进程,一个是worker进程,master进程管理worker进程,work进程管理客户端连接
       查看cpu核心数
      cat /proc/cpuinfo| grep “processor”| wc -l
      ②.I/O事件配置:
       use epoll
       worker_connections 代表每个工作进程可以提供的连接数量
      ③.HTTP配置
    Server配置部分代表虚拟主机配置
    A.在一个server必须包含,root、server_name,index,listen
    B.location:对用户请求资源进行定位,通过location可以实现动静分离
    = 精确(严格)匹配, 优先度最高,后续不再匹配正则
    ^~:优先前缀匹配,找到即停
    普通前缀:(最长匹配原则),找到后继续查找正则
    正则匹配(~ ~*): 表示区分大小写的正则匹配,按顺序查找,找到即停
    ~区分大小写的正则匹配
    ~* 表示不区分大小写的正则匹配
    !~和!~*:!~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则
    / 通用匹配,任何请求都会匹配到(本质上等同于语法 空) 最后被匹配,正常必须有
    

    编辑Nginx配置文件: vim /usr/local/nginx/conf/nginx.conf
    在这里插入图片描述
    Accp站点设置
    在这里插入图片描述
    重载nginx服务
    killall -s HUP nginx
    搭建DNS服务
    1)编辑dns主配置文件
    vim /etc/named.conf
    在这里插入图片描述
    配置项释义:
    在这里插入图片描述
    2)创建区域文件
    进入实例文件目录:cd /var/named/
    创建benet区域文件
    [root@localhost named]# cp -p named.localhost benet.com.zone
    创建accp区域文件
    [root@localhost named]# cp -p named.localhost accp.com.zone
    编辑benet区域文件
    vim benet.com.zone
    在这里插入图片描述
    编辑accp区域文件
    vim accp.com.zone
    在这里插入图片描述
    启动dns服务
    systemctl start named
    验证:
    Win10测试机
    配置ip地址(同网段),dns服务器地址(填写192.168.1.1)
    浏览器访问benet网站
    在这里插入图片描述
    访问benet访问统计 URL:www.benet.com/status
    在这里插入图片描述
    浏览器访问accp网站
    在这里插入图片描述

    nginx与apache区别

    Nginx相对于apache的优势

    1. 轻量级,采用C进行编写,同样的web服务,会占用更少的内存及资源
    2. 抗并发,nginx以epoll and kqueue作为开发模型,处理请求是异步非阻塞的,多个连接对应一个进程,负载能力比apache高很多,
      而apache则是同步多进程模型,只能一个连接对应一个进程,当压力过大时,它是会被阻塞型的。
      在高并发下nginx能保持低资源低消耗高性能 ,而apache在PHP处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
    3. 设计高度模块化,编写模块相对简单
    4. .配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃
    5. 一般用于处理静态文件,静态处理性能比apache高三倍以上
    6. 作为负载均衡服务器,支持7层负载均衡
    7. 本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器
    8. nginx启动特别容易, 并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,支持热部署,比如:实现不间断服务的情况下进行软件版本的升级与版本的回退
    9. 社区活跃,各种高性能模块出品迅速

    Apache相对于Nginx的优势:

    1. apache的rewrite比nginx强大,在rewrite频繁的情况下,用apache
    2. apache发展到现在,模块超多,基本想到的都可以找到
    3. apache更为成熟,少bug ,nginx的bug相对较多
    4. apache超稳定,一个进程死掉时,会影响到多个用户的使用,稳定性差
    5. apache对PHP支持比较简单,nginx需要配合其他后端用
    6. apache在处理动态请求有优势,nginx在这方面是鸡肋,一般动态请求要apache去做,nginx适合静态和反向。
    7. apache仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区

    总结:两者核心区别

    • Apache是同步多进程模型,一个连接对应一个进程,而Nginx是异步的,多个连接(万级别)可以对应一个进程。
    • 适用场景:
      一般来说,需要性能的web服务,用Nginx;
      如果不需要性能只求稳定,更考虑Apache;
      Nginx处理放静态内容比Apache要好,特别是在可承受压力、带宽及资源消耗上都要优于Apache。
      所以更为通用的方案是,前端Nginx抗并发,后端Apache集群,配合起来会更好。

    展开全文
  • AnyRouter是一集路由器、DNS服务器、NAT、上网日志记录、上网限制于一身代理服务器软件,用于实现局域网内所有计算机共享一Internet连接(连接方式包括MODEM、xDSL、宽带等),防止单位重要资料机密文件等...
  • Web编程技术期末总结

    2020-09-10 01:46:39
    1.TCP/IP代表一个协议集,其中最重要的是TCP和IP,它包含四个层次:应用层,传输层,网络层,物理接口层。 2.应用层协议有:Telnet(远程登录协议),FTP(文件传输协议),SMPT(简单邮件传输协议),DNS(域名服务...

    Web编程技术考前复习材料

    第一章

    1.TCP/IP代表一个协议集,其中最重要的是TCP和IP,它包含4个层次:应用层、传输层、网络层和物理接口层。
    2.应用层协议主要有:远程登录协议(Telnet),用于实现互联网中的远程登录,文件传输协议(FTP),用于实现文件传输,简单邮件传输协议(SMTP),实现电子邮件收发,域名服务系统(DNS),用于实现域名到IP地址的映射,超文本传输协议(HTTP),用于在Web浏览器和Web服务器之间传输Web文档。
    3.传输层也叫运输层,主要功能更是负责进程之间的端到端通信。传输层定义了两种协议:传输控制协议(TCP)和用户数据报协议(UDP).
    4.网络层也叫IP层,负责处理互联网中计算机之间的通信,向传输层提供统一的数据包。它的主要功能有以下3个方面:处理来自传输层的分组发送请求,处理接收的数据包,处理互连的路径。
    5.物理接口层的主要功能是接收IP层的IP数据报,通过网络向外发送;或接收处理从网络上来的物理帧,抽出IP数据报,向IP发送。该层是主机与网络的实际连接层。
    6.WWW——Word Wide Web的英文缩写。 7.Web技术还涉及以下相关概念:
    (1) 超文本传输(HTTP)协议:一种详细规定了浏览器和万维网服务器之间相互通信的规则,通过因特网传送万维网文档的数据传送协议。
    (2) 统一资源定位符(URL):互联网的一个协议要素,可以定义任何远程或本地的可用资源,其通用格式为: 协议:[//] [用户名[:密码]@]主机名[:端口号] ][/资源路径]
    (3) 超文本标记语言(HTML):用于描述网页文档外的外观和格式。
    8.Web信息交换过程简单描述:
    (1)客户端向web服务器发出访问动态页面的请求、
    (2)Web服务器根据客户端所请求的页面的后缀名确定该页面所采用的动态网页编程技术,然后将该页面提交给相应的动态网页解释引擎。
    (3)动态网页解释引擎执行页面中的脚本以实现不同的功能,并把执行结果返回web服务器。
    (4)Web服务器把包含执行结果的HTML页面发送到客户端。
    9.Web客户端技术:
    (1)HTML语言
    (2)JAVA Applets
    (3)脚本程序
    (4)CSS
    10. Web服务器技术:主要包括CGI、PHP、ASP、ASP.NET、JSP等技术
    11. JSP的特点:
    (1) 将内容的生成和显示进行分离
    (2) 强调可重用性组件
    (3) 采用标识简化页面开发
    (4) 健壮性和安全性
    (5) 良好的移植性
    (6) 企业级的扩展性和性能

    第二章
    1.HTML(Hyper Text Markup Language)即超文本标记语言。
    2.HTML实例:(文档结构)

    <html> 
    <head> 
    <title>标题 </title> 
    </head> 
    <body>页面内容测试</body> 
    </html>
    

    3.标签:单标签和双标签两种形式。
    4.标题标签:<h#>文字</h#> #=1,2,3,4,5,6
    5.其他文本效果:
    字体:<font face=字体值>文本</font>
    下划线:<u>文字</u>
    删除线:<strike>文字</strike>
    闪烁:<blink>文字</blink>
    增强:<strong>文字</strong>
    强调:<em>文字</em>
    示例:<samp>文字</samp>
    粗体:<b>文字</b>
    斜体:<i>文字</i>
    6.超链接:<A href=”资源地址” name=”字符串”>链接文字</a>
    7.内部链接:锚点
    8.外部链接:
    (1)网站链接:<a href=”http://www.baidu.net”>链接百度</a>
    (2)电子邮件链接:<a href=”mailto:haimes@163.com”>写信给我</a>
    (3)FTP链接<a href=”ftp://ftp.jmu.edu.cn”>下载档案</a>
    (4)News链接:<a href=”news:news.hrmex.net”>seedmet news 服务</a>
    (5)Gopher链接<a href=”gopher://gopher.hmex.net/”>seedmet gopher 服务</a>
    (6)BBS链接<a href=”telnet://bbs.jmu.edu.cn/”>seedmet bbs服务</a>

    第三章
    1.Java的特点:平台无关性、简单性、面向对象、安全性、分布性、动态性、健壮性、多线程性、可移植性。
    2.Java语言程序实际上有两种:一种是java应用程序(application),是一种独立程序。
    3.Java语言中规定标识符是以字母(大小写均可,java中对大小写敏感)、下划线(_)或美元符号($)开始的,其后可跟数字、字母、下划线或美元符号组成的字符序列。
    Java语言采用的是Unicode编码字符集(即统一编码字符集)。 (P27~P36)

    第四章
    1.一个jsp页面的基本结构通常包含三个部分:普通的HTML标记、jsp标签和jsp脚本(变量和方法的声明、jsp程序片段和java表达式)。
    2.HTML注释:<!--注释[<%=表达式 %>]-->
    3.隐藏注释:<%--注释--%>
    4.声明变量和方法:只需在<%!与%>标记之间放置java的变量声明语句即可,而且所声明变量在整个jsp页面中有效(声明方法类似)
    声明方法或者变量时,,还需要遵循如下规则:
    (1)声明必须以(;)结尾
    (2)可以一次声明多个变量和方法,但必须以(;)结束
    (3)必须在使用变量或方法之前在jsp文件中声明它们。
    (4)可以直接使用在编译指令<%@ page %>中所包含进来的变量和方法,无须对它们重新声明。
    (5)一个声明仅在一个页面中有效。如果想每个页面都能用到一些声明,最好把这些声明写成一个单独的文件,然后用<% @include%><jsp:include >包含进来。
    6.表达式:<%=expression %> 注意:在jsp中引用表达式时,必须遵循如下规则。
    (1)不能用一个分号(;)来作为表达式的结束符。
    (2)构成表达式的元素必须符合java语言的语法规则。
    (3)表达式可以嵌套,这时表达式的求解顺序为从左到右。
    7.JSP的编译指令:3种常用的编译指令:page指令、include指令、taglib指令
    8.page编译指令:
    功能:定义整个jsp页面的属性及其属性值。 语法格式:<%@ page 属性1 = 值 属性2 =值…%> 该指令所包含属性如下:
    (1) Language:定义JSP网页所使用的脚本语言的种类,其默认值是java。
    (2) Import:指定JSP网页中需要导入的java包列表。
    (3) Session:设置此网页是否要加入到一个session中(其值为布尔类型)。如果为true,则session是有用的,否则,就不能使用session对象以及定义了scope=session的<jsp:useBean>元素,这样的使用会导致错误。其默认值是true。
    (4) autoFlush:指定当缓冲区满时是否自动输出缓冲区的数据(其值为布尔类型)。如果为true,输出正常,否则当缓冲区满时将抛出异常。其默认值是true。
    (5) contentType:定义了JSP网页所使用的字符集及JSP响应的MIME类型。默认MIME类型是text/html,默认字符集是ISO-8859-1.
    注意:page指令作用于整个JSP页面和由include指令和<jsp:include>包含进来的静态文件中,但不能用于动态包含文件。可以在一个页面上使用多个page指令,但是其中的属性只能使用一次(import属性例外)。
    9.Include指令: 功能:指令在JSP文件中包含的一个静态的文件,即在JSP文件被编译时需要插入的文本或代码。 语法格式:<%@ include file=”文件名称” %>
    10.JSP的操作指令
    (1) Jsp:useBean操作指令:在JSP页面中声明一个javaBean组件实例,如果该实例不存在,则创建一个Bean实例并指定它的名字和作用范围。
    (2) Jsp:setProperty操作指令:在bean中设置一个或多个属性值。
    (3) Jsp:getProperty操作指令:获取bean的属性值,在jps中使用此标签可以提取Javabean中的属性值,并将结果以字符串的形式显示给客户。
    (4) jsp:include操作指令:在JSP文件中包含一个静态或动态文件。
    (5) Jsp:forward操作指令:用于将浏览器显示的网页重定向到另一个HTML文件或jsp文件。
    (6) Jsp:param操作指令:为其他标签提供附加信息。
    (7) Jsp:plugin操作指令:让客户端执行一个小Java程序(Applet或Bean),有可能的话还要下载一个Java插件,用于执行它。

    第五章
    Jsp中常见的8种内部对象 内部对象名 主要功能 request 封装用户提交的请求信息 response 封装响应用户请求的信息
    session 在用户请求时期保存对象属性 application 提供存取servlet class 环境信息的方法
    Out 向客户端输出信息 pageContext 存取JSP执行过程中需要用到的属性和方法 config 提供存取servlet
    Class初始参数及server环境信息 exception 在页面出错时产生无法控制的Throwable
    Request:request对象的类型是一个执行javax.servelt.http.HttpServletRequest界面的类
    Request对象常用方法: getHeader(String name):获得HTTP协议定义的传送文件头信息,例如,request.getHeader(“User-agent”)返回客户端浏览器的版本号、类型等信息。
    getAttribute(String name):返回name指定的属性值,若不存在指定的属性值,就返回空值(null)。
    getMethod():获得客户端向服务端传送数据的方法(如:GET、POST和PUT等类型)。 getParameter(String name):获得客户端传送给服务端的参数值,该参数由name指定。
    getQueryString():获得由客户端以GET方式向服务端传送的字符串。
    Response:response对象的类型为javax.servlet.http.HttpServletResponse类。
    Response对象的常用方法: setContentType(String s):该方法可以改变contentType的属性值。当用户访问一个contentType属性值是text/html的JSP页面时,JSP引擎将按照ContentType属性的值来响应客户的请求信息。Response对象可以调用该方法来设置contentType的值,其中参数s可取text/html、application/x-msxcel和application/msword等。
    sendRedirect(URL):该方法将实现客户的重定向,即在处理客户请求的过程中,可能会根据不同的事件将客户重新引导至另一个页面。其中参数URL的值为重定向页面所在的相对路径。(重定向语句之后的代码将不再执行)
    Session对象的常用方法:
    Session是会话的意思,其实它指的是当一个用户在客户端打开IE浏览器并连接到服务器端开始,一直到该用户关闭IE浏览器位置的这段时期。
    Session对象在第一个JSP页面被装载时自动创建,完成会话期管理。当用户第一次登录网站时,服务器端的JSP引擎将为该用户生成一个独一无二的session对象。需要说明的是,session对象中所保存和检索的信息不能是基本数据类型,必须是java语言中相应的Object对象。
    setAttribute(String key,Object obj):该方法实现将参数obj所指定的对象添加到session对象中,并添加的对象指定一个索引关键字key。索引关键字的值由参数key确定。
    getAttribute(String name):该方法实现从session对象中提取由参数name指定的对象。若对象不存在,将返回null。
    getId():每生成一个session对象,服务器都会给其分配一个独一无二的编号,该方法将返回当前session对象的编号。
    removeAttribute(String name): 该方法将实现从session中删除由参数name所指定的对象。
    isNew():该方法判断是否一个新的用户。如果是返回true,否则返回false。 Out对象的常用方法:
    Out对象的类型是一个继承自抽象的javax.servlet.jsp.JspWrite类。实际上out对象是一个输出流,可以向客户端输出数据。
    Out.print(类型名):此方法实现向客户端输出各种类型的数据(如out.print(char))。
    Out.println(类型名):此方法实现向客户端换行输出各种类型数据。 out.newLine():此方法实现向客户端输出一个换行符。
    Out.flush():此方法实现向客户端输出缓冲区的数据。 Out.close():此方法用来关闭输出流。
    out.clearBuffer():此方法实现清除缓冲区里面的数据,并把数据写到客户端。
    Out.clear():此方法清除缓冲区里的数据,但不把数据写到客户端。
    out.getBufferSize():此方法用来获得缓冲区的大小,缓冲区的大小可用<%@ page buffer=”size” %>设置。
    out.isAutoFlush():此方法用来设置是否自动向客户端输出缓冲区中的数据。返回值为布尔类型,如果是则返回true,否则返回false。
    Application常用的方法
    与session对象相似,当一个用户首次访问服务器上的一个JSP页面时,服务器的JSP引擎就为该用户创建了application对象,当客户在服务器的各个页面之间浏览时,这个application对象都是同一个,直到服务器关闭。但是与session对象不同的是,所有用户的application对象都是同一个,即所有用户共享这个application对象。Application对象由服务器创建,也由服务器自动清除,不能被用户创建和清除。
    getAttribute(String name):该方法返回由参数name指定的、存放在application中的对象。注意返回时应该使用强制类型转换成为对象原来的类型。
    getAttributeNames():该方法返回所有存放在application中的对象,结果集是一个Enumeration(枚举)类的对象。
    getInitParameter(String name):该方法返回由参数name所指定的application中某个属性的初始值。
    setAttribute(String name , Object obj):该方法用来将参数obj指定的对象添加到application中,并为添加的对象指定一个关键字。该关键字由name指定。
    Exception:无法保证在进行JSP编程时不发生错误,那么当JSP文件执行过程中发生了错误该如何处理呢?实际上exception对象是专门负责处理这些问题的。但是要注意exception对象一般要和page指令一起配合使用,通过指定某个页面为错误处理页面,把JSP文件执行时所有发生的错误和异常都集中到那个页面去进行处理,这不仅提高了系统的统一性,程序流程也变得更简单清晰。

    第六章

    1. SQL(Structured Query Language)的中文意思是“结构化查询语言”,这种语言是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的,它的前身是SQUARE语言。
    2. SQL语言包含了4个部分:
      (1) 数据查询语言(DQL),
      (2) 数据操纵语言(DML),
      (3) 数据定义语言(DDL),
      (4) 数据控制语言(DCL)。
    3. SQL的技术优势:
      (1) 非过程化语言
      (2) 数据库操作语言的统一
      (3) 支持所有的关系数据库
    4. JDBC可以完成以下工作:
      (1)和一个数据库建立连接。
      (2)向数据库发送SQL语句。
      (3)处理数据库返回的结果。
    5. JDBC的工作方式:(按照工作方式分为4类)
      (1)JDBC-ODBC Bridge+ODBC 驱动
      JDBC-ODBC Bridge桥驱动将JDBC调用翻译成ODBC调用,再由ODBC驱动翻译成访问数据库命令。
      优点:可以利用现存的ODBC数据源来访问数据库。
      缺点:效率和安全性比较差,不适合用于实际项目。
      (2)基于本地API的部分java驱动
      应用程序通过本地协议跟数据库打交道,然后将数据库执行的结果通过驱动程序中的java部分返回给客户端程序。
      优点:效率较高
      缺点:安全性较差
      (3)基于中间件驱动
      应用程序通过中间件访问数据库
      优点:安全性较好
      缺点:两段通信,效率比较差
      (4)纯java本地协议
      通过本地协议用纯java直接访问数据库
      优点:效率高,安全性好
    6. 目前市面上最流行的两种数据库接口是ODBC和JDBC。 这样说似乎ODBC完全可以取代JDBC,其实不然,可以从以下几点说明:
      (1)因为ODBC是一个C语言接口,所以在java中直接使用ODBC不适当,从java中来调用C代码在安全性、健壮性、实现的方便、可移植行等方面有许多不便。它使得java在这些方面的许多优点得不到发挥。
      (2)基于C语言的ODBC到基于java API的ODBC的实现容易产生问题。毕竟java和C在很多方面存在着差异,比如C语言中定义了指针类型,而java中没有指针。
      (3)从掌握难易程度而言,JDBC要比ODBC要容易学习一些。因为ODBC对非常简单的的操作,比如查询一个数据库都需要设置复杂的选项。
      (4)考虑客户端的环境,ODBC不能保证在任何一台客户机上使用(除非事先在这台客户机上安装了ODBC的驱动程序以及驱动管理器)。如果JDBC的驱动程序是由纯java代码编写的,那么JDBC将适合任何的java平台环境。
    7. JDBC的常用对象
      (1) Statement对象 Statement对象用于把SQL语句发送到数据库。只须简单地创建一个Statement对象并采用适当的方法执行SQL语句,使用适当的方法执行发送的SQL语句。Statement stmt = con.createStatement(); 需要调用带有SQL语句参数的Statement的方法。

    a) executeUpdate:使用该方法可以创建表、改变表、删除表,也被用于执行更新表SQL语句。executeUpdate()传回一个数值结果,表示语句影响的行数。
    b) executeQuery:被用来执行select语句,它几乎是使用最多的执行语句。该语句执行后会将结果集返回给java.sql.ResultSet,可以使用ResultSet的next()来移动至下一条记录,它会传回true或false表示是否有下一条资料,使用getXXX()来取得相应记录所对应的值。

    (2) PreparedStatement 对象
    PreparedStatement实例包含已编译的SQL语句。这就是使语句“准备好”。由于PreparedStatement对象已预编译过,所以其执行速度要快于Statement对象,因此,多次执行的SQL语句经常创建为PreparedStatement对象,以提高效率。
    (3) ResultSet对象
    结果集(ResultSet)是数据中查询结果返回的一种对象。结果集读取数据的方法主要是getXXX(),它的参数可以使整型表示第几列(是从1开始的),还可以是列名。返回的是对应的XXX类型的值。 结果集从其使用的特点上可以分为四类:基本的ResultSet、可滚动的ResultSet类型、可更新的ResultSet、可保持的ResultSet。
    8. JDBC数据库操作:
    (1) JDBC连接数据库 JDBC连接数据库分为两个步骤:装载驱动程序和建立连接

    a) 装载驱动程序 class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
    b) 建立连接 Connection con = DriverManager.getConnection(url, user , password);
    c) 常见数据库连接 MySQL数据库 class.forName(“org.gjt.mm.mysql.Driver”).newInstance();
    String url = “jdbc:mysql://localhost/myDB?user=test&password=test&useUnicode=true&characterEncoding=8859_1”; //myDB为数据库名
    Connection conn=DriverManager.getConnection(url);

    第七章

    1. <form>表单标记
      (1)action属性:设置或获取表单内容要发送处理的URL。
      (2)Method属性:指定数据传送到服务器的方式。两种主要的方式,当method=get时。将输入数据加载action指定的地址后面传送到服务器,当method=post时则将输入数据按照HTTP传输协议中的post传输方式传送到服务器。
      (3)Name属性::用于设定表单的名称。
    2. <input>表单输入标记
      (1)属性name设定当前变量名称
      (2)属性type的值决定了输入数据的类型。

    a) type=text:表示输入单行文本
    b) Type=textarea:表示输入多行文本
    c) Type=password:表示输入数据为密码,用星号表示
    d) Type=checkbox:表示复选框
    e) Type=radio:表示单选框
    f) Type=submit:表示提交按钮,数据将被送到服务器
    g) Type=reset:表示清除表单数据,以便重新输入
    h) Type=file:表示插入一个文件
    i) Type=hidden:表示隐藏按钮
    j) Type=image:表示插入一个图像
    k) Type=button:表示普通按钮
    l) Type=value:用于设定输入默认值,即如果用户不输入就采用此默认值。
    m) Type=src:是针对type=image的情况来说的,设定图像文件的地址

    1. 表单在客户端确认的利弊:在客户端脚本技术出现之前,确认表单只能在服务器端完成,但是这样不仅会占用服务器资源,也会占用网络资源。特别是用户多次修改表单数据仍不符合要求,那么就需要不断地网络连接和服务器响应,效率较低。但如果在网页中引入了客户端脚本技术(JavaScript),即将表单确认程序跟随网页一起从服务器端下载到客户端的浏览器上,这样当用户填写完表单中的数据后,提交时就可以由浏览器解释执行表单确认程序,而无须服务器响应,从而大大减轻了网络负载并提高了响应速度。很明显,用户的等待时间减少了。
    2. isDate()日期确认函数
      功能:确认返回所输入的数据是否一个有效的日期,如果是函数返回true,否则返回false
    Function isDate (myStr){
    Var the1st = myStr.isdexof(‘/’);
    Var the2nd =theStr.lastIndexof(‘/’);
    If( the1st == the2nd ){  return (false) ;}
    Else{  var m = myStr.substring(0,the1st);
    Var d = myStr.substring(the1st+1,the2nd);
    Var y = myStr.substring(the2nd+1,myStr.length);
    Var maxDays = 31;
    If(isInt(m) == false || isInt(d )== false || isInt(y) == false)
    { return (false);}
     Else if (y.length<4)
    { return (false);}
    Else if (!isBetween(m,1,12))
      { return (false);}
      Else if(m==4 || m==6 ||m ==9 || m==11)
    maxDays = 30;
     Else if (m==2) 
      { if(y%4 >0)
     	maxDays = 28;
    Else   maxDays=29;}
    If(isBetween(d,1,maxDays) == false)
    {  return(false) ;}
    Else { return(true) ;}
     }
    }
    
    
    1. isBetween(val,low,high)范围确定函数
      功能:确认所输入的数据是否位于参数low和high之间,如果是函数返回true,否则返回false
    Function isBetween(val,low,high)
    {
    If( (val<low) ||(val>high)) 
    {  return (false) ;}
    Else {  return (tru) ;}
    }
    
    

    isDigit(myNum)数字确认函数
    功能:确认所输入的数据是否一个合法数字。如果是函数返回true,否则返回false

    Function isDigit(myNum)
    {
    Var mask = ‘ 0123456789’ ;
    If(isEmpty(myNum))  {
    Return (false);
    }else if (mask.indexOf(myNum) == -1) {
    Return (false);
    }
    Return (true);
    }
    
    
    
    1. isEmpty(myStr)函数
      功能:确认所输入的数据是否为空,如果为空函数返回true,否则返回false
    Function isEmpty(myStr){
    If( (myStr == null ) || (myStr.length == 0 )) return (true) ;
    Else return(false);
    }
    
    
    1. 向客户端输出数据: Out对象常用的方法: Out.Println(boolean) 功能:JSP向客户端输出一个布尔值。 Out.println(char) 功能:jsp向客户端输出一个字符。 Out.println(double)
      功能:JSP向客户端输出一个双精度的浮点数 Out.println(float) 功能:JSP向客户端输出一个单精度的浮点数
      表单在服务器端确认的利弊:表单确认放在服务器端执行的最大优点就是在于屏蔽了客户端平台的异构性,因为不管客户端安装的是什么操作系统,JSP的执行都能够顺利进行。当然表单的确认放在服务器端执行也增加了服务器的负载,并且延长了客户端的等待时间。

    第九章

    1. Servlet的基本概念:Servlet(java服务器小程序)是用java编写的Server端程序,它与协议和平台无关。
    2. Servlet的特点:采用java代码编写、运行于服务器端、跨平台、处理消息传递、结构简洁设计轻巧 Servlet的优势:处理客户端传递过来的HTTP请求,并返回一个响应。同事还具有Java语言的一切特性,Servlet可直接接受客户端的请求,然后完成商业逻辑;请求包括:Get或 post请求
    3. Servlet的主要功能在于交互式地浏览和修改数据,生成动态web内容。这个过程包括4个阶段:
      (1)Client想server发送请求
      (2)Server将请求信息发送至servlet
      (3)Servlet根据请求信息生成响应内容(包括静态或动态的内容)并将其传给servlet。 (4)Servlet将响应返回给client
    4. Servlet的生命期
      (1)servlet的初始化。当servlet第一次被请求加载时,服务器初始化这个servlet,换几句话说就是创建一个servlet对象,对象调用init()方法完成初始化的过程。
      (2)被创建的servlet对象调用service()方法响应客户的请求。
      (3)服务器被关闭时,调用destroy()方法杀掉servlet对象。
      注意:init()方法仅被调用一次,也就是在servlet首次加载时被调用。以后再有客户请求(无论是不同客户的请求还是同一客户的再次请求)相同的servlet服务时,web服务器将启动一个新的线程,在该线程中servlet调用service()方法响应客户的请求。
    5. Java servlet的技术优势:
      (1)servlet可以和其他资源(文件、数据库、applet、java应用程序等)交互,以生成返回给客户端的响应内容。如果需要,还可以保存请求响应过程中的信息。
      (2)采用servlet,服务器可以完成授权对本地资源的访问(如数据库),并且servlet自身将会控制外部用户的访问数量及访问性质。
      (3)Servlet可以是其他服务的客户端程序,例如,它们可以用于分布式的应用系统中,可以从本地硬盘,或者通过网络从远端硬盘激活servlet。
      (4)Servlet可以被链接(chain)。一个servlet可以调用另一个或者一系类servlet,即成为它的客户端。
      (5)采用servlet Tag技术,可以在HTML页面中动态调用servlet。
      (6)Servlet API与协议无关。它并不对传递它的协议有任何假设
      (7)像所有的java程序一样,servlet拥有面向对象java语言的所有优势
      (8)Servlet提供了java应用程序的所有优势——可移植、稳健、易开发。使用servlet的tag技术,servlet能够生成嵌于静态HTML页面中的动态内容。
      (9)一个servlet被客户端发送的第一个请求激活,然后它将继续运行于后台,等待以后的请求。每个请求将生成一个新的线程,而不是一个完成的进程。多个客户能够在同一个进程中同时得到服务。一般来说,servlet进程只是在web server 卸载时被卸载。
      通过表单调用servlet:
      DoGet():用于处理用户的Get请求。
      DoPost():用于处理用户的Get请求。
      DoPut():用于处理用户的HTTPPUT请求。
      DoDelete():用于处理用户的Delete请求。

    第十章

    1. javaBean是java程序的一种组件,其实就是java类。javaBean规范将“组件软件”的概念引入到java编程的领域。
    2. Javabean具有的特性:
      (1)javabean是一个公开的类
      (2)Javabean包含一个无参的构造函数
      (3)Javabean给外界提供一组get型公开函数,利用这些函数来提取java bean内部的属性值。
      (4)Javabean给外界提供的一组set型公开函数,利用这些函数来修改javabean内部的属性值。

    第十一章
    MVC:即把一个应用的输入、处理、输出流程按照Model、View、Control的方式进行分离,这样一个应用程序被分为模型层、视图层、控制层。在MVC模型之前,Sun公司提出了两种基于JSP开发WEB应用系统的模型,基于纯JSP的开发模型和基于JSP+javabean的开发模型。
    MVC模型的技术优势
    (1)耦合性降低。
    (2)部署速度和可维护性提高。
    (3)可适用性和组件可重用行提高。
    (4)有利于程序功能的扩展。

    编写Servlet的注意事项: 用户编写的Servlet需要从HttpServlet继承;
    在自定义的Servlet类内部重载doGet、doPost方法来处理客户端的GET/POST请求;
    注意定义doGet和doPost方法时的异常处理问题;
    必须导入java.io包、javax.Servlet包及javax.Servlet.http包;
    doGet和doPost这两个方法是由service()方法调用的, 有时可能需要直接覆盖service()方法;

    1. Servlet接口
    Public interface Servlet {
    Public abstract void destroy();
    Public abstract ServletConfig getServletConfig();
    Public abstract void init(ServletConfig) throws
    ServletException;
    Public abstract void
    service(ServletRequest,ServletResponse)
    throws ServletException lOException; }
    
    
    1. HttpServlet类的方法
      (1) service()方法
    Public void service(ServletRequest request, ServletResponse response)
    throws ServletException,loException
    它是GenericServlet中的service()方法的实现;
    该访法调用下面重载的service()方法;
    Protected void service(HttpServletRequest request,HttpServletResponse response)
    HttpServlet实现这个方法后就成为一个HTTP请求分发者。
    service ()方法把请求代理给doXXX()方法。
    
    

    (2)doXXX ()方法
    doGet 方法doGet的格式如下:

    protected void doGet ( HttpServletResquest request, HttpServletResponse response)
    throws ServletException,IOException;
    
    

    doPost 方法doPost的格式如下:

    protected void doPost(HttpServletResquest request, HttpServletResponse response)
    throws ServletException,IOException;
    
    
    展开全文
  • java开源包1

    千次下载 热门讨论 2013-06-28 09:14:34
    Cleo 是一灵活软件库用于处理一些预输入和自动完成搜索功能,该项目是 LinkedIn 公司开源项目。 SwingSet 增强现实标记跟踪软件库 AccuTag AccuTag是AR(增强现实)标记跟踪软件库。它利用GPGPU快速和...
  • java开源包12

    热门讨论 2013-06-28 10:14:45
    Cleo 是一灵活软件库用于处理一些预输入和自动完成搜索功能,该项目是 LinkedIn 公司开源项目。 SwingSet 增强现实标记跟踪软件库 AccuTag AccuTag是AR(增强现实)标记跟踪软件库。它利用GPGPU快速和...
  • AnyRouter是一集路由器、DNS服务器、NAT、上网日志记录、上网限制于一身代理服务器软件,用于实现局域网内所有计算机共享一 Internet 连接(连接方式包括MODEM、xDSL、宽带等),防止单位重要资料机密文件等...
  • Java资源包01

    2016-08-31 09:16:25
    Cleo 是一灵活软件库用于处理一些预输入和自动完成搜索功能,该项目是 LinkedIn 公司开源项目。 SwingSet 增强现实标记跟踪软件库 AccuTag AccuTag是AR(增强现实)标记跟踪软件库。它利用GPGPU快速和...
  • java开源包101

    2016-07-13 10:11:08
    Cleo 是一灵活软件库用于处理一些预输入和自动完成搜索功能,该项目是 LinkedIn 公司开源项目。 SwingSet 增强现实标记跟踪软件库 AccuTag AccuTag是AR(增强现实)标记跟踪软件库。它利用GPGPU快速和...
  • java开源包11

    热门讨论 2013-06-28 10:10:38
    Cleo 是一灵活软件库用于处理一些预输入和自动完成搜索功能,该项目是 LinkedIn 公司开源项目。 SwingSet 增强现实标记跟踪软件库 AccuTag AccuTag是AR(增强现实)标记跟踪软件库。它利用GPGPU快速和...
  • java开源包2

    热门讨论 2013-06-28 09:17:39
    Cleo 是一灵活软件库用于处理一些预输入和自动完成搜索功能,该项目是 LinkedIn 公司开源项目。 SwingSet 增强现实标记跟踪软件库 AccuTag AccuTag是AR(增强现实)标记跟踪软件库。它利用GPGPU快速和...
  • java开源包3

    热门讨论 2013-06-28 09:20:52
    Cleo 是一灵活软件库用于处理一些预输入和自动完成搜索功能,该项目是 LinkedIn 公司开源项目。 SwingSet 增强现实标记跟踪软件库 AccuTag AccuTag是AR(增强现实)标记跟踪软件库。它利用GPGPU快速和...
  • java开源包6

    热门讨论 2013-06-28 09:48:32
    Cleo 是一灵活软件库用于处理一些预输入和自动完成搜索功能,该项目是 LinkedIn 公司开源项目。 SwingSet 增强现实标记跟踪软件库 AccuTag AccuTag是AR(增强现实)标记跟踪软件库。它利用GPGPU快速和...
  • java开源包5

    热门讨论 2013-06-28 09:38:46
    Cleo 是一灵活软件库用于处理一些预输入和自动完成搜索功能,该项目是 LinkedIn 公司开源项目。 SwingSet 增强现实标记跟踪软件库 AccuTag AccuTag是AR(增强现实)标记跟踪软件库。它利用GPGPU快速和...
  • java开源包10

    热门讨论 2013-06-28 10:06:40
    Cleo 是一灵活软件库用于处理一些预输入和自动完成搜索功能,该项目是 LinkedIn 公司开源项目。 SwingSet 增强现实标记跟踪软件库 AccuTag AccuTag是AR(增强现实)标记跟踪软件库。它利用GPGPU快速和...

空空如也

空空如也

1 2 3 4 5
收藏数 84
精华内容 33
关键字:

dns的四个重要功能