美文网首页
第10讲 网络编程&Tomcat

第10讲 网络编程&Tomcat

作者: 祥祺 | 来源:发表于2020-02-19 14:04 被阅读0次

    网络编程&Tomcat

    学习摘要:

    网络编程

    计算机网络

    什么是计算机网络

    计算机网络,是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

    计算机网络的分类

    从逻辑功能上看,计算机网络是以传输信息为基础目的,用通信线路将多个计算机连接起来的计算机系统的集合,一个计算机网络组成包括传输介质和通信设备。
    虽然网络类型的划分标准各种各样,但是从地理范围划分是一种大家都认可的通用网络划分标准。按这种标准可以把各种网络类型划分为局域网、城域网、广域网和互联网四种。局域网一般来说只能是一个较小区域内,城域网是不同地区的网络互联,不过在此要说明的一点就是这里的网络划分并没有严格意义上地理范围的区分,只能是一个定性的概念。

    为何要学习计算机网络

    通过计算机网络可以实现资源共享,可以向全社会提供各种经济信息。今天的计算机网络承载着大部分的企业的运转,企业里面的日常工作都是建立在互联网上的。我们的生活,工作都离不开网络。

    网络分层

    什么是网络分层?

    利用计算机网络,从A计算机中,发送一条信息”hello”到B计算机中.应该如何传输过去呢?首先需要将”hello”变成二进制,通过网络线路到达B计算机,再将二进制转成”hello”.这个过程是非常复杂的

    那么为了减少网络设计的复杂性,绝大多数网络采用分层设计方法。所谓分层设计方法,就是按照信息的流动过程将网络的整体功能分解为一个个的功能层,不同机器上的同等功能层之间采用相同的协议,同一机器上的相邻功能层之间通过接口进行信息传递。

    网络分层的标准

    OSI七层参考模型

    开放系统互连参考模型 (Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,
    为开放式互连信息系统提供了一种功能结构的框架。它从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

    七层协议划分图解.png
    TCP/IP四层参考模型
      1. 应用层

    应用层对应于OSI参考模型的高层,为用户提供所需要的各种服务,例如:FTP、Telnet、DNS、SMTP等.

      1. 传输层

    传输层对应于OSI参考模型的传输层,为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。该层定义了两个主要的协议:传输控制协议(TCP)和用户数据报协议(UDP).
    TCP协议提供的是一种可靠的、通过“三次握手”来连接的数据传输服务;而UDP协议提供的则是不保证可靠的(并不是不可靠)、无连接的数据传输服务.

      1. 网际互联层

    网际互联层对应于OSI参考模型的网络层,主要解决主机到主机的通信问题。它所包含的协议设计数据包在整个网络上的逻辑传输。注重重新赋予主机一个IP地址来完成对主机的寻址,它还负责数据包在多种网络中的路由。该层有三个主要协议:网际协议(IP)、互联网组管理协议(IGMP)和互联网控制报文协议(ICMP)。
    IP协议是网际互联层最重要的协议,它提供的是一个可靠、无连接的数据报传递服务。

      1. 网络接入层(即主机-网络层)

    网络接入层与OSI参考模型中的物理层和数据链路层相对应。它负责监视数据在主机和网络之间的交换。事实上,TCP/IP本身并未定义该层的协议,而由参与互连的各网络使用自己的物理层和数据链路层协议,然后与TCP/IP的网络接入层进行连接。地址解析协议(ARP)工作在此层,即OSI参考模型的数据链路层。

    数据传输流程

    那么,有了网络分层之后,在多台计算机之间传输,这个过程就简化了很多.使用网络分层来解决从A计算机发送数据hello到B计算机.

    A在发送的过程中,在不同层会对数据进行封装,最后达到物理层,变成机器码.

    传输到B计算机之后,获取到的也是二进制,那么就需要使用相同的协议,将数据一步步的拆开,最终变成hello.

    七层协议做的事情图解.png

    通信协议

    什么是通信协议

    计算机网络实现通信必须有一些规定,这些规定成为通信协议。是网络通信的基础。

    常见的协议:

    http:超文本传输协议

    https:用安全套接字层传送的超文本传输协议

    ftp:文件传输协议

    mailto:电子邮件地址

    file:本地文件传输协议

    通信协议的组成
     有三部分组成。
        一。 语义部分, 用于决定双方对话的类型
        二。  语法部分, 用于决定双方对话的格式。
        三。 变换规则 , 用于决定通信双方的应答关系。
    

    每一个网络层次,都有其特有的协议,在不同的主机间进行数据传输,相同的网络层次需要使用相同的协议.

    TCP/IP协议

    TCP/IP是一组用于实现网络互连的通信协议。Internet网络体系结构以TCP/IP为核心。
    基于TCP/IP的参考模型将协议分成四个层次,它们分别是:网络访问层、网际互联层、传输层(主机到主机)、和应用层。
    TCP/IP 可以分开使用,但是它们在同一个时期作为一个协议来使用的。放在一起在功能上是互补的。 最早出现在UNIX操作系统中。不过现在几乎所有的操作系统都支持了 。它目前是Internet上最常用的基础协议。

    UDP协议

    UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。

    IP地址和端口

    IP地址

    什么是IP地址?

    IP 地址用于唯一的标识网络中的一个通信实体,这个通信实体可以是主机,打印机等。基于IP协议在网络中传输数据,都必须使用IP地址来标识。

    IP地址存在的重要性

    如果没有IP地址,我们不能把数据发送到指定的位置。
    就像我们在网上购买的快递,快递物品上都有发件人的地址(源IP地址)和收件人的地址(目的IP地址),在运输过程中,这两个地址是保持不变的。如果没有这个地址,我们不知道把物品送给谁。

    IP地址的组成和分类

    IP地址在计算机中用4个字节,也就是32位的二进制数来表示。称为Ipv4, 为了便于记忆和使用,我们通常取用每个字节的十进制数。并且每个字节之间用圆点隔开的文本格式来表示IP地址。
    NIC,APNIC, RIPE 三个网络信息中心具体负责IP地址的分配 ,其中 APNIC 负责亚太地区的IP管理,我国申请IP地址也要通过APNIC,APNIC总部在日本东京大学

    端口

    什么是端口?

    端口是一个16位的整数。用于表示数据交给哪个通信程序处理。是应用程序与外界交流的入口,端口可以从0 ~ 65535 同一台机器上不能有两个程序使用同一个端口。

    端口存在的意义

    就好比你给我寄快递,邮寄地址为:广州市 天河区 棠下村大地工业区603室 孔维胜 收 IP相当于 :广州市 天河区 棠下村大地工业区603室 端口相当于:孔维胜,只有IP地址是不够的,还是不能确定这个快递是邮寄给603 室的哪个人。 只有 IP + 端口 才是唯一的,
    明确的。

    端口的分类

    按照端口号的大小分类,可分为如下几类 [1] :

    (1)公认端口(WellKnownPorts):从0到1023,它们紧密绑定(binding)于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如:80端口实际上总是HTTP通讯。

    (2)注册端口(RegisteredPorts):从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。例如:许多系统处理动态端口从1024左右开始。

    (3)动态和/或私有端口(Dynamicand/orPrivatePorts):从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从1024起分配动态端口。但也有例外:SUN的RPC端口从32768开始。

    IP和端口分析图解.png

    Java提供网络支持的API

    InetAddress

    在Java中,使用InetAddress类来表示IP地址。

    常用的方法 :
    getByName(String host); 根据主机获取对应的InetAddress对象
    getCanonicalHostName(); 获取IP地址的全限定域名
    getHostName(); 获取此IP地址的主机名
    getLocalHost(); 获取本机IP地址
    isReachable();  测试是否可以到达该地址
    

    URLEncoder&URLDecoder

    用于完成普通字符串和application/x-www-form-urlencoded MIME字符串之间的相互转
    为何需要转换呢?
    当传输的内容有中文的时候,需要转换。
    在编程中如何转换呢?
    java提供了相应的类URLEncoder和URLDecoder。
    以中文为例:
    URLEncoder 类内部提供一个encode(String s, String enc)静态方法,它可以将中文转换成application/x-www-form-urlencoded MIME字符串
    URLDecoder 类内部提供一个decode(String s, String enc)静态方法,它可以将application/x-www-form-urlencoded MIME字符串转换中文

    URL&URI

    URL:

    统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
    互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

      如:http://127.0.0.1:8080/javaWeb/hello.html
    

    URI:

    统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一互联网资源名称的字符串。

      如: /javaWeb/hello.html
    

    可以将URL理解成URI的一个特例。

    Java网络编程

    什么是套接字?

    源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。其用于标识客户端请求的服务器和服务.

    比方:Socket 是应用程序创建一个港口码头,应用程序只要把装着货物的集装箱放到码头,就算完成了货物的运送。

    什么是网络编程?

    通过使用套接字来达到进程间通信目的的编程就是网络编程.

    进程之间的通信:

      1):在同一台电脑上,A进程和B进程相互通信.
    
      2):在网络中(外网/内网),A电脑中的aa程序和B电脑中的bb程序相互通信(有网络连接).
    

    为什么需要学习网络编程?

     1):如果没有网络,只能玩单机游戏.(斗地主,三国杀,CS等)
     2):有了网络,QQ游戏等.
    

    基于TCP协议的网络编程

    什么是TCP协议

    TCP是面向连接的通信协议,TCP提供两台计算机之间的可靠无差错的数据传输
    应用程序利用TCP进行通信时,源和目标之间会建立一个虚拟连接。这个连接一旦建立,两台计算机之间就可以把数据当作一个双向字节流进行交换。就像我们打电话一样,互相能听到对方说话。

    TCP协议的特点

    面向连接(经历三次握手),传输可靠(保证数据正确性,保证数据顺序),用于传输大量数据(流模式),速度慢,建立连接需要开销较多(时间,系统资源).在TCP中,基于连接的双方通常称为:服务端和客户端.
    利用TCP协议进行通信的两个应用程序,是有主次之分的。
    一个称为服务器程序,另一个称为客户机程序。

    我们通过一张图来理解三次握手的概念:


    三次握手图解.png

    通过一张图来结束TCP协议的特点的说明:


    TCP传输数据图解.png

    基于TCP协议的通信过程:

      1. 服务器程序创建一个ServerSocket,然后调用accept方法等待客户来连接。
      1. 客户端程序创建一个Socket并请求与服务器建立连接。
      1. 服务器接收客户的连接请求,并创建一个新的Socket与该客户建立专线连接。
      1. 刚才建立了连接的两个Socket,在一个单独的线程上对话。
      1. 服务器开始等待新的连接请求。

    我们通过查看API来认识一下ServerSocket&Socket:

    ServerSocket

    通过构造器创建服务器对象,并指定端口,用于监听指定端口的程序发送数据过来。

    Socket

    客户端要和服务器端建立连接,必须先创建一个Socket对象。

    通过构造器创建对象,并指定连接服务器程序的IP和端口号。

    服务器端程序调用accept方法等待客户的连接请求,一旦accept接收了客户连接请求,该方法将返回一个与该客户建立了专线连接的Socket对象,不同程序出去创建这个Socket对象。

    基于TCP协议的简单案例

    先来看一下流程图


    客户端与服务端分析图.png
    // 客户端
    
    // 1.创建一个客户端对象socket
    
            Socket socket = new Socket("localhost", 9999);
    
            System.out.println("客户端开启");
    
            // 2.从socket对象中获取输出流并发送数据给服务器端
    
            socket.getOutputStream().write("您好服务器端,我是客户端".getBytes("utf-8"));
    
            // 3.调用socket对象中的shutdownOutput方法,通知服务器端数据发送完毕
    
            socket.shutdownOutput();
    
            // 4.从socket对象中获取输入流对象获取服务器端回馈的数据
    
            byte[] b = new byte[1024];
    
            int len = socket.getInputStream().read(b);
    
            System.out.println(new String(b, 0, len));
    
            // 5.调用socket对象中的shutdownInput方法,通知服务器端数据接收完毕
    
            socket.shutdownInput();
    
            // 6.关闭socket对象
    
            socket.close();
    
            System.out.println("客户端结束");
    
    //服务端
    
    // 1.创建一个服务器对象serverSocket
    
            ServerSocket serverSocket = new ServerSocket(9999);
    
            System.out.println("服务器端开启");
    
            // 2.调用监听方法用来监听客户端发送的数据并获取客户端对象socket
    
            Socket socket = serverSocket.accept();
    
            // 3.从socket对象中获取输入流对象并获取发送来的数据
    
            byte[] b = new byte[1024];
    
            int len = socket.getInputStream().read(b);
    
            System.out.println(new String(b, 0, len));
    
            // 4.调用socket对象中的shutdownInput方法,通知客户端数据接收完毕
    
            socket.shutdownInput();
    
            // 5.从socket对象中获取输出流对象并发送数据给客户端
    
            socket.getOutputStream().write("你也好,客户端,我是服务端".getBytes("utf-8"));
    
            // 6.调用socket对象中的shutdownOutput方法,通知客户端数据发送完毕
    
            socket.shutdownOutput();
    
            // 7.关闭socket
    
            socket.close();
    
            System.out.println("服务器端结束");
    
    模拟Tomcat案例

    我们通过做一个案例模拟Tomcat,来认识一下写下来要讲的Tomcat服务器。
    需求很简单,通过浏览器访问我们定义的服务器,然后服务器给浏览器作出响应。

    public static void main(String[] args) throws Exception {
    
            // 1.创建一个服务器端对象serverSocket
    
            ServerSocket serverSocket = new ServerSocket(8080);
    
            System.out.println("服务器开启");
    
            while (true) {
    
                // 2.监听客户端,并获取客户端对象socket
    
                Socket socket = serverSocket.accept();
    
                new Thread(new HandlerRequest(socket)).start();
    
            }
    
        }
    
    public class HandlerRequest implements Runnable {
    
        private Socket socket = null;
    
        public HandlerRequest(Socket s) {
    
            this.socket = s;
    
        }
    
        @Override
    
        public void run() {
    
            try {
    
                // 3.接收客户端发送过来的数据
    
                String info = null;
    
                BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
    
                while ((info = reader.readLine()) != null) {
    
                    if ("".equals(info)) {
    
                        break;
    
                    }
    
                    System.out.println(info);
    
                }
    
                // 4.调用socket对象中的shutdownInput方法,通知客户端接收数据完毕
    
                socket.shutdownInput();
    
                // 5.发送数据给浏览器
    
                PrintWriter writer = new PrintWriter(socket.getOutputStream());
    
                // 6.调用socket对象中的shutOutput方法,通知客户端发送数据完毕
    
                writer.println("HTTP/1.1 200 OK");
    
                writer.println("Content-Type: text/html;charset=utf-8");
    
                writer.println("");
    
                writer.println("您好浏览器端");
    
                writer.flush();
    
                socket.shutdownOutput();
    
                // 7.关闭socket对象
    
                socket.close();
    
            } catch (Exception e) {
    
                e.printStackTrace();
    
            }
    
        }
    
    }
    

    基于UDP协议的网络编程(了解)

    什么是UDP协议?

    UDP 是无连接通信协议,UDP不能保证可靠数据的传输,但能够向若干个目标发送数据,接收若干个源的数据。

    简单的说,如果一个主机向另外一台主机发送数据,这个数据就会立刻发出,而不管另外一台主机是否已准备接收数据,如果收到了也不会发出确认收到与否的信息。

    利用UDP通信的两个程序是平等的,没有主次之分,两个程序代码可以是完全一样的。

    UDP协议的特点

    面向非连接(数据报包),传输不可靠(丢包[数据丢失]),用于传输少量数据(数据报包模式),速度快.在UDP中,基于数据报包的双方通常称为:发送端和接收端.

    UDP数据的发送,发送者将数据发送出去就不管了,是不可靠的,有可能在发送的过程中数据丢失。所以我们要先运行UDP接收程序,再运行UDP发送程序,UDP数据包的接收是过期作废的。

    当UDP接收程序运行到receive方法接收数据时,如果还没有可以接收的数据,在正常情况下,receive方法将阻塞,一直等到网络上有数据到来,receive接收数据并返回。

    通过一张图来结束UDP协议的特点的说明:


    UDP传输数据图解.png

    我们通过查看API来认识一下DatagramSocket&DatagramPacket:

    DatagramSocket

    创建对象的同时可以指定端口号。如果不指定端口,系统会分配一个,当不再使用该对象时,需要调用close方法,关闭它。

    DatagramPacket

    通过调用send方法发送数据。通过调用receive方法接收数据

    如果把 DatagramSocket 比作时港口码头,那么DatagramPacket就是我们发送数据和接收数据的集装箱。

    基于UDP协议的简单的案例
    // 发送端
    
    DatagramSocket ds = new DatagramSocket();
    
    String str = "hello";
    
    DatagramPacket  dp = new DatagramPacket(
    
    str.getBytes(), // 发送的字节
    
    str.getBytes().length(), //发送的字节的长度
    
    InetAddress.getByName(ip地址),// 发送到哪个IP地址,如果是本机 也可以使用InetAddress.getLocalHost();来获取。
    
    30000); // 发送到哪一个端口程序上
    
     ds.send(dp);
    
     ds.close();
     
    
    // 接收端
    
    DatagramSocket ds = new DatagramSocket(3000);
    
    byte[] buf = new byte[1024];
    
    // 接收数据
    
    DatagramPacket dp = new DatagramPacket(buf,1024);
    
    ds.receive(dp);
    
    String content = new String(dp.getData(),0,dp.getLength());
    
    ds.close();
    

    Tomcat服务器

    Web概述

    Web发展历程

    原始年代1990-1992:
    1990年,HTML标记语言的出现标志Web开发时代的到来.
    B/S架构开始在之后的岁月中不断的发展壮大,攻城略地蚕食传统C/S的领域.
    如同所有的新生事物一样,在web的史前岁月,web的开发 技术在在html标记诞生后,无论是在服务端还客户端都缓慢的发展着,在相当长的一个时间内,它并未像今天这样辉煌,甚至于只是静态的文本标识.

    关键字:HTML

    技术特性:静态文本显示,表现力和交互能力不足。(hao123),刷机精灵.

    封建诸侯年代1993-1996:

    1993年,NCSA提出了CGI1.0草案。Web开发终于迎来了它的第二次重大飞跃,伴随着CGI,带来Web的动态处理能力,CGI就是这个时代的国王。(服务器端动态生成内容)
    1994年,PHP
    1995年, Java,Applet.
    1996年,ASP
    关键字:CGI(Common Gateway Interface )(Perl&&C&&Python)
    技术特性:实现了客户端和服务器端的动态交互, 在程序代码中写html标记,是面向过程的开发方式,用多进程运行
    注:CGI是Web服务器端组件,都能产生Web动态页面输出
    工业文明1996-1999:
    1997年,Sun公司推出了Servlet规范。Java阵营终于迎来了自己的web英雄。
    1998年,JSP技术诞生,Servlet和JSP再加上JavaBean,让JavaWeb开发者同时拥有了类似CGI程序的集中处理功能和类似于PHP 的HTML嵌入功能,此外,Java的运行编译技术也大提高了Servlet和JSP的执行效率.
    1998年,Sun发布了EJB1.0标准
    1999年,Sun正式发布了J2EE的第一个版本,紧接着,遵循J2EE,为企业级应用提供支持平台的各类应用服务器争先恐后的涌现出来(WebSphere,WebLogic,JBoss),(同时2001微软发布了ASP.NET技术).


    Web发展历程.png

    CS/BS架构

    C/S和B/S都是软件架构的两种不同的表现形式:

    C/S:Client/Server:客户端和服务端的架构.

    B/S:Browser/Server:浏览器和服务端的架构(通过浏览器访问的应用).


    C/S:

    该软件运行在电脑桌面:比如,QQ,FeiQ,POS机/火车站卖票等.
    开发语言:VC++,C#,awt,swing等.

     特点: 一般的,服务端仅仅是安装一个数据库和数据存储,所有程序的代码(功能/界面)都编写在客户端软件中(把所有的业务逻辑编写在客户端,界面渲染也在客户端).
    
     优点:直观,用户体验好,界面美观,安全性高等.
    
     缺点:每次升级,需要重新安装,移植性较低,开发和维护成本较高
    
    CS.png

    B/S:
    该软件通过浏览器访问,比如:门户网站,管理系统等.
    其实B/S属于特殊的C/S,因为,浏览器就是一个特殊的客户端.
    开发语言:JSP,PHP,ASP等.

     特点:在服务端编写代码,所有的业务逻辑都由服务端完成,客户端只负责界面渲染.
    
     优点:可移植性很高,开发和维护较好.
    
     缺点:用户体验不够好,界面不够丰富,安全性很低.
    
    BS.png
     瘦客户端: 传统的B/S:服务端:负责业务逻辑,客户端,负责界面渲染.
    
     富客户端: 超级BS=CS+BS; 界面华丽.
    
               服务端:负责业务逻辑.
    
               客户端:负责界面渲染 + 少量的业务逻辑.
    
     开发技术:Extjs,EasyUI,bootstrp,Flash等.(JavaScript/CSS/ActionScript)
    

    服务器分类

    软件服务器: 其实就是一个软件,提供了B/S应用运行的环境.

    硬件服务器: 其实就是一台电脑,该电脑安装了软件服务器.


    JavaWeb的软件服务器的分类:

    • 1):http服务器,用于运行静态的网页.

    • 2):Web服务器,实现了JavaEE部分规范(比如Servlet/JSP),没有实现JavaEE中的EJB规范.

      Tomcat,Jetty等.

    • 3):应用服务器,实现了JavaEE全部的规范,支持EJB的.

      TomEE,GlassFish,JBoss,Weblogic,WebSphere.

    Tomcat服务器使用

    tomcat目录结构

    bin目录:Tomcat的工具,启动,关闭等.

    conf目录:装了Tomcat的配置文件.

    lib目录:Tomcat的核心jar包和依赖的jar包.

    logs目录:装了日志文件.

    temp目录:临时目录,上传文件的临时文件.

    webapps目录:默认情况下,部署项目的路径.

    work目录:工作目录,装JSP翻译成Java文件的代码.

    注意:

    启动tomcat去bin目录中找工具,如果想要查看tomcat的日志,去logs目录找.前期启动tomcat会出一些错,所以一定要看日志.

    如图:


    tomcat的目录结构.png

    Tomcat的安装和启动

    Tomcat是使用Java语言编写的一个服务器(程序),要运行Tomcat,必须得有jre.我们通过一个图来了解Tomcat服务器对JDK的要求。


    Tomcat对JDK的要求.png

    安装启动:

     32位的JDK --->32位的Eclipse--->32位Tomcat
    
     64位的JDK --->64位的Eclipse--->64位Tomcat
    
    • 1.安装目录不能使中文的,并且安装路径不允许出现空格.

      如:f:\apache-tomcat-7.0.67:我们把该路径称之为Tomcat的根路径

    • 2.启动Tomcat服务器:Tomcat根/bin/startup.bat.

      但是提示:必须先配置JAVA_HOME或者JRE_HOME的环境变量:

      一般的我们只配置JAVA_HOME:配置为JDK的根路径

      JAVA_HOME=D:\Java\jdk1.7.0_79

    如图:
    
    JDK的配置.png
    配置好之后,再点击Tomcat根/bin/startup.bat:知道控制台没有打印重大的错误,Exception,没有一闪而过,就表示启动成功.   
    
    Tomcat的默认端口是8080:
    

    访问:

     打开浏览器:
    
     http://服务器所在主机的IP:服务器的端口号/资源名字
    
     http://服务器所在主机的名字:服务器的端口号/资源名字
    

    若服务在本机:

     http://本机的IP:服务器的端口号/资源名字
    
     http://127.0.0.1:服务器的端口号/资源名字
    
     http://localhost:服务器的端口号/资源名字
    

    访问成功的页面如下:


    Tomcat启动成功.png

    Tomcat的常见错误:

    查看日志的习惯.


    • 1):没有成功启动Tomcat,就开始访问.--->无法显示此网页

      解决方式:正确启动后再访问

    • 2):出现404的错误提示.HTTP Status 404.

      当前访问的资源不存在的时候,就报404错误.

      此时的问题,是我们自己造成的,把资源的名字写错了.

      解决方式:绝对是路径写错了,检查路径

    • 3):Tomcat成功启动之后,再去启动当前的Tomcat.

      Tomcat的端口已经被占用,端口冲突.

      解决方式:关闭之前启动的所有服务器

    • 4):不能乱改动Tomcat中配置文件的结构.

      查看日志文件,找到错误的位置,错误原因--->再修改.

      解决方式:查看日志.

    • 5):在XML配置文件中使用了中文,此时XML文件必须使用UTF-8的编码.

      XML文件: 文件内容的编码和文件本身编码要相同,都为UTF-8.

      --->1 字节的 UTF-8 序列的字节 1 无效.

    Tomcat的常见配置

    Tomcat的默认端口是8080:

    但是,HTTP协议的默认端口是80.

    而我们在访问的时候,都是遵循于http协议的.

    http://localhost:8080/index.jsp

    如果是80端口:

    http://localhost:80/index.jsp

    http://localhost/index.jsp


    Tomcat根/conf/server.xml文件中,默认第71行.
    如图:


    tomcat修改端口.png

    配置文件改变之后,需要重新启动Tomcat.

    JavaWeb项目结构

    WEB应用程序指供浏览器访问的程序,通常也简称为web应用。

    一个web应用由多个静态web资源和动态web资源组成,如:

    静态资源包括:html、css、js、图片文件等

    动态资源包括:jsp文件、java程序、jar文件、

    配置文件

    ……

    组成 web 应用程序的这些文件要部署在相应的目录层次中,根目录代表整个 web 应用程序的“根”。

    如图:


    web项目目录结构.png

    从JavaEE6开始(Tomcat7,Servlet3.0规范),JavaWeb应用下可以不需要web.xml文件了.(可以使用注解).

    但是建议保留该文件:

    注意:

    1. WEB-INF全大写, 使用中线连接.

    2. WEB-INF/classes一定要配置成字节码输出路径.

    3. 需要使用的jar包,一定要放在WEB-INF/lib中.

    web项目结构一定要规范,否则写再多代码,web容器也不会认可.

    搭建基于Eclipse的纯的JavaWeb项目:

    方式一的步骤:

    1,搭建一个Java项目:

    2,在该项目下新建一个文件夹,表示根,名字为:webapp(名字随意)

    3,在webapp下新建一个文件夹,名字为WEB-INF

    4,在WEB-INF中新建一个文件夹,名字为classes

    5,在WEB-INF中新建一个文件夹,名字为lib

    6,去Tomcat根/webapps/ROOT/WEB-INF目录下拷贝一个web.xml文件到WEB-INF下(只保留头和根元素)

    7,改变该项目的输出目录:也就是改变classpath的路径,从默认的bin目录该变为webapp/WEB-INF/classs中

    以后要把项目给别人,只给webapp目录.

    方式二我们可以通过直接设置的方式来搞定。如图:

    使用Eclipse创建javaWeb项目.png

    安装Tomcat插件

    梦想:在Eclipse工具中就能管理Tomcat服务器(启动,关闭,重启).


    给Eclipse安装Tomcat的插件:

    1.在需要被装插件的Eclipse根/dropins目录

    2.把插件的jar包拷贝到该目录下

    3.重新启动Eclipse.看效果,若看到3只可爱的小猫咪,表示插件安装成功.

    4.把插件跟Tomcat服务器做关联.如图:

    tomcat的插件的配置.png

    把项目部署在Tomcat服务器中.

    方式1:直接把项目的web根路径,拷贝到Tomcat根/webapps目录中.
    该方式,可行,而且是MyEclipse工具的部署方式.

    缺点:

      1:不支持热部署.(代码变动之后,需要重新部署,重新部署的成本很大).
    
      2:把所有的项目都部署在该路径,启动越来越慢,若其中有一个项目有问题,Tomcat是启动不了.
    

    方式2:告诉Tomcat服务器,从指定的路径去部署项目.

      1):找到Tomcat根/conf/server.xml文件.
    
      2):在<Host>元素之间,编写<Context/>元素,具体代码如下:
    
          <Context docBase="web项目的根路径" path="上下文路径"/>
    
      3):访问当前项目的路径:http://ip:port/contextPath/资源名称.
    
      注意:多个<Context>元素的path绝对不能相同.
    

    方式3:从Tomcat5.5开始推荐使用另外的一种方式来部署项目:(其本质和方式二相同)

    步骤:

    1).找到Tomcat根/conf/Catalina/localhost新建一个xml文件:比如abc.xml
    
             内容是:<Context docBase="D:\JavaPros\pureWeb\webapp"/>
    
    2).此时该文件的名字,就相当于是第一种方式的path值(上下文名字)
    
             访问: http://localhost/abc/index.html
    

    相关文章

      网友评论

          本文标题:第10讲 网络编程&Tomcat

          本文链接:https://www.haomeiwen.com/subject/gopryqtx.html