Javaweb1

1.BS和CS系统架构

BS(Browser/Server)和CS(Client/Server)是两种常见的系统架构,它们在计算机科学和软件工程中有着不同的发展历史和应用场景。

  1. CS(Client/Server)架构

    • 定义:CS架构是指客户端与服务器之间相互协作的软件架构,客户端负责与用户交互,而服务器负责处理和存储数据,以及执行应用程序的核心逻辑。
    • 特点:在CS架构中,客户端通常是一个独立的应用程序,与服务器通过网络连接,向服务器发送请求并接收响应。这种架构通常具有较高的性能和灵活性,但需要客户端软件的安装和更新。
    • 发展历史:CS架构是早期的软件架构之一,起源于20世纪70年代。最初,这种架构主要用于大型企业系统和数据库应用程序,如银行系统和人力资源管理系统。
  2. BS(Browser/Server)架构

    • 定义:BS架构是指通过Web浏览器作为客户端,与服务器进行交互的软件架构。在BS架构中,客户端通过浏览器访问Web服务器上的应用程序,服务器端负责处理用户请求,并生成相应的HTML、CSS和JavaScript等前端代码,返回给客户端进行展示和交互。
    • 特点:BS架构具有跨平台性和易于维护的特点,因为客户端只需一个标准的Web浏览器即可访问应用程序,无需安装任何额外的软件。但相对于CS架构,BS架构通常会牺牲一些性能。
    • 发展历史:BS架构的发展始于1990年代末期,随着Internet的普及和Web技术的发展,BS架构逐渐成为主流。最初的Web应用程序通常是简单的静态页面,但随着技术的进步和浏览器的增强,Web应用程序的功能和复杂性不断增加,包括动态内容、交互性和多媒体等。

1.1CS架构和BS架构的优缺点。

CS架构优点

  1. 性能优秀:CS架构中,客户端和服务器之间的通信通常是直接的,没有中间层,因此可以实现较高的性能。
  2. 灵活性强:开发人员可以灵活控制客户端和服务器端的逻辑,定制化程度高。
  3. 安全性高:由于客户端与服务器之间的通信是私有的,可以采取更严格的安全措施。

CS架构缺点

  1. 依赖客户端软件:客户端需要安装专门的软件,增加了部署和维护的成本。
  2. 跨平台兼容性差:不同操作系统上的客户端可能需要不同的版本,跨平台兼容性较差。
  3. 更新困难:对于分布在不同客户端的软件更新,需要一定的管理和协调。

BS架构优点

  1. 跨平台性:由于客户端使用标准的Web浏览器,因此可以在各种操作系统和设备上运行,具有较好的跨平台性。
  2. 易于部署和更新:无需安装额外的客户端软件,只需更新服务器端代码即可实现所有客户端的更新。
  3. 维护简单:客户端只需浏览器,无需安装和维护额外的软件,减少了维护成本和工作量。

BS架构缺点

  1. 性能相对较差:由于每次交互都需要通过网络与服务器通信,可能会导致性能不佳,尤其是在网络较慢或不稳定的情况下。
  2. 安全性风险:因为数据和逻辑都存储在服务器端,客户端只是一个浏览器,因此容易受到安全威胁,需要采取额外的安全措施。
  3. 对浏览器的依赖:BS架构完全依赖于客户端的浏览器,可能受到浏览器版本和兼容性的限制。

举个例子:一个在线邮件客户端可以作为CS架构的典型例子。用户在本地安装邮件客户端软件(客户端),通过与邮件服务器(服务器)之间的直接通信来收发邮件。这种方式下,邮件客户端可以实现快速响应和较好的性能。

另一个例子是在线购物网站,通常采用BS架构。用户通过Web浏览器访问网站,与网站服务器进行交互,浏览商品、下订单等操作。在这种架构下,用户无需安装额外的软件,可以跨平台访问,但可能会面临网络延迟等性能问题。

1.2BS架构系统通信原理

1.2.1客户端(浏览器)和服务器交互过程

在BS(Browser/Server)架构中,系统通信的原理涉及到客户端(浏览器)和服务器之间的交互过程。

  1. 用户发送请求

    • 用户在浏览器中输入URL或点击链接等操作。
    • 浏览器根据用户的请求生成HTTP请求,其中包括请求的目标URL、请求方法(如GET、POST等)、请求头等信息。
  2. 请求到达服务器

    • 用户的请求通过网络传输到服务器端。
    • 服务器接收到请求后,根据请求的URL和方法进行解析,确定要执行的操作。
  3. 服务器处理请求

    • 服务器根据请求的内容执行相应的逻辑处理,可能涉及到查询数据库、生成动态内容、计算等操作。
    • 服务器端程序处理完请求后,准备生成响应并发送给客户端。
  4. 服务器生成响应

    • 服务器根据请求的处理结果生成HTTP响应,包括响应状态码、响应头和响应体等内容。
    • 响应体通常包含HTML、CSS、JavaScript等前端代码,用于在客户端浏览器中展示页面内容。
  5. 响应返回客户端

    • 服务器将生成的HTTP响应通过网络传输到客户端浏览器。
    • 客户端浏览器接收到响应后,根据响应内容进行解析和处理。
  6. 页面渲染

    • 客户端浏览器根据接收到的HTML、CSS、JavaScript等前端代码,进行页面渲染,显示用户请求的页面内容。
    • 浏览器会按照HTML文档的结构,解析并渲染出页面的各个元素,包括文本、图片、链接等。
  7. 用户交互

    • 用户在浏览器中可以与页面进行交互,例如点击链接、填写表单、发送请求等操作。
    • 用户的交互行为会触发相应的事件,浏览器会捕获并处理这些事件,可能会产生新的HTTP请求,继续与服务器进行通信。

通过以上步骤,BS架构系统实现了客户端(浏览器)与服务器之间的通信。用户通过浏览器发送请求,服务器端处理请求并生成响应,客户端接收响应并渲染页面内容,从而实现了用户与应用程序的交互。这种基于HTTP协议的通信方式,使得BS架构系统具有跨平台、分布式部署等优势,适用于各种网络应用场景。

1.2.2域名、IP地址、端口号和URL

  1. 域名(Domain Name)

    • 域名是用来标识互联网上的一个主机(服务器)的名称,通常由一串字符组成,如google.com、facebook.com等。
    • 域名的作用是方便人们记忆,代替了复杂的IP地址。通过域名可以直接访问到相应的网站或服务器。
  2. IP地址(Internet Protocol Address)

    • IP地址是用来标识网络上的设备(如计算机、服务器)的唯一地址。它是由32位(IPv4)或128位(IPv6)二进制数表示的。
    • 在互联网通信中,数据包的传输需要知道目标设备的IP地址,以便正确路由数据到达目标。
  3. 端口号(Port Number)

    • 端口号是用来标识网络通信中的一个具体的服务或进程的编号,范围是0到65535。
    • 在一台设备上,不同的服务或进程可以通过不同的端口号来区分,例如Web服务通常使用80端口,SMTP服务使用25端口等。
  4. URL(Uniform Resource Locator)

    • URL是统一资源定位符,用来描述一个资源在互联网上的位置。它包含了访问资源所需的协议、域名、端口号、路径等信息。
    • 例如,一个URL可能是http://www.example.com:8080/index.html,其中"http://“是协议,“www.example.com"是域名,”:8080"是端口号,”/index.html"是路径。

这些概念之间的关系如下:

  • 用户通常通过输入域名来访问网站,例如输入"www.example.com"。
  • 浏览器通过DNS(域名系统)将域名解析为对应的IP地址,例如"192.0.2.1"。
  • 浏览器通过IP地址和端口号与服务器建立连接,并发送HTTP请求,获取网页内容。
  • URL则是用来指定请求的具体资源路径,例如"/index.html"表示请求服务器上的index.html文件。

域名是便于人们记忆的网站名称,通过DNS解析成IP地址;IP地址标识了具体的设备;端口号用于标识设备上的不同服务或进程;而URL则是描述了资源在互联网上的位置和访问方式。

image.png

2.服务器

2.1 Web服务器

Web服务器是一种软件,它运行在网络上的计算机上,并处理来自客户端浏览器的HTTP请求。它的主要作用是接收用户的请求,并向用户发送相应的Web页面或其他资源,比如HTML文件、图像、样式表等。Web服务器通常使用HTTP协议来与客户端进行通信,并将请求传递给适当的处理程序,然后将处理结果返回给客户端。

举个例子,当你在浏览器中输入一个网址(比如http://www.example.com),浏览器会发送一个HTTP请求到服务器,服务器上的Web服务器接收到这个请求,然后根据请求的内容找到相应的HTML文件,并将它发送给浏览器,浏览器再将页面内容展示给用户。

2.2 应用服务器

应用服务器是一种软件,它用于执行应用程序的核心逻辑,并生成动态的内容,如数据库查询、业务逻辑处理、用户认证等。应用服务器通常与Web服务器结合使用,以处理Web服务器接收到的请求,并根据请求执行相应的业务逻辑。

举个例子,当用户在网站上填写了一个表单并提交时,Web服务器会接收到这个请求,然后将请求传递给应用服务器。应用服务器会执行相应的业务逻辑,比如将表单数据存储到数据库中,然后生成一个HTML页面作为响应,并将它发送给Web服务器,最终由Web服务器返回给用户。

2.3Web服务器和应用服务器的关系

Web服务器和应用服务器通常是相互配合工作的。Web服务器负责处理静态资源(如HTML文件、图像等)的请求,并将动态请求转发给应用服务器处理。应用服务器负责执行应用程序的核心逻辑,并生成动态内容。两者之间通过一些协议(如CGI、FastCGI、WSGI等)进行通信,以实现动态Web应用的运行。

2.4Tomcat

2.4.1Tomcat服务器介绍

Tomcat是一个开源的、轻量级的、用于运行Java Servlet和JavaServer Pages(JSP)的Web服务器和Servlet容器。它由Apache软件基金会开发和维护,是一个非常流行的Java应用服务器。

以下是Tomcat的一些特点和功能:

  1. Servlet容器:Tomcat是一个Servlet容器,它实现了Java Servlet和JSP规范,可以运行Java Web应用程序。

  2. 开源免费:Tomcat是开源软件,遵循Apache许可证,可以免费使用和修改。

  3. 轻量级:Tomcat的设计目标之一是轻量级和高性能,它的核心代码相对简洁,启动速度快,资源占用少。

  4. 跨平台:Tomcat可以在各种操作系统上运行,包括Windows、Linux、Unix等。

  5. 易于配置:Tomcat提供了灵活的配置选项,可以通过简单的配置文件来配置服务器和应用程序的行为。

  6. 扩展性:Tomcat支持插件和扩展,可以通过添加额外的组件和模块来扩展其功能。

  7. 管理和监控:Tomcat提供了Web界面和命令行工具,用于管理和监控服务器,包括应用程序的部署、启动和停止,以及查看服务器状态和日志等。

  8. 与Apache HTTP Server集成:Tomcat可以与Apache HTTP Server集成,以提供更强大的Web服务功能。

2.4.2Tomcat服务器文件夹

Tomcat服务器文件夹是Tomcat安装目录下的一个文件夹,通常包含了Tomcat服务器的各种配置文件、日志文件、部署的Web应用程序等。以下是Tomcat服务器文件夹中常见的一些子文件夹和文件:

  1. bin

    • 包含了Tomcat服务器的可执行文件,如启动和停止服务器的脚本文件(startup.sh、shutdown.sh)、用于配置Tomcat服务的配置文件(catalina.sh、setenv.sh等)。
  2. conf

    • 包含了Tomcat服务器的配置文件,如服务器配置文件(server.xml)、主机配置文件(host.xml)、Web应用程序的部署描述文件(context.xml)等。
  3. lib

    • 包含了Tomcat服务器运行所需的Java类库文件,如servlet-api.jar、jsp-api.jar等。
  4. logs

    • 包含了Tomcat服务器的日志文件,记录了服务器的运行状态、错误信息等。常见的日志文件包括catalina.out、localhost.log、host-manager.log等。
  5. webapps

    • 包含了部署的Web应用程序,每个Web应用程序通常对应一个文件夹,其中包含了该应用程序的相关文件,如HTML、JSP、Servlet类文件等。
  6. work

    • 用于存储Tomcat服务器运行时生成的临时文件,如编译后的JSP文件、临时生成的Servlet类文件等。
  7. temp

    • 用于存储Tomcat服务器运行时的临时文件,如HTTP请求的临时文件、上传文件的临时文件等。
  8. logs

    • 包含了Tomcat服务器的日志文件,记录了服务器的运行状态、错误信息等。常见的日志文件包括catalina.out、localhost.log、host-manager.log等。

3.请求与响应

在网络通信中,请求(Request)和响应(Response)是两个非常重要的概念,它们是客户端(如浏览器)与服务器之间进行数据交换的基本单元。

请求(Request)

  • 请求是客户端(例如浏览器)发送给服务器的消息,用于请求特定资源或执行特定操作。
  • 请求通常包含了客户端要访问的资源的信息,比如URL、请求方法、请求头、请求体等。
  • 例如,在Web开发中,当用户在浏览器中输入一个网址、点击链接或提交表单时,浏览器会发送HTTP请求到服务器,请求相应的网页或资源。

响应(Response)

  • 响应是服务器发送给客户端的消息,用于响应客户端的请求并提供相应的资源或执行相应的操作。
  • 响应通常包含了服务器处理请求后生成的结果,比如HTTP状态码、响应头、响应体等。
  • 例如,在Web开发中,当服务器接收到客户端的HTTP请求后,会根据请求的内容执行相应的逻辑,然后生成HTTP响应,并将其发送回客户端,以提供请求的资源或执行的操作结果。

简而言之,请求是客户端向服务器发送的消息,用于请求资源或执行操作,而响应是服务器向客户端发送的消息,用于响应请求并提供相应的资源或执行的操作结果。这种请求-响应模式是Web开发中的基本通信模式,通过它,客户端和服务器可以进行有效的数据交换和通信。

4.编写第一个webapp

找到如图所示路径建立oa文件夹。在oa文件夹下建立资源文件。
image.png

编写index.html文件。内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>My First HTML Page</title>
</head>
<body>

    <h1>Hello, World!</h1>
    <p>This is a basic HTML page.</p>

</body>
</html>

启动tomcat服务器:
image.png

在浏览器输入地址访问:
image.png

在写一个login.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login Page</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }
        .container {
            width: 300px;
            padding: 20px;
            background-color: #fff;
            border-radius: 5px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }
        h2 {
            margin-top: 0;
            text-align: center;
        }
        input[type="text"],
        input[type="password"],
        input[type="submit"] {
            width: 100%;
            padding: 10px;
            margin-bottom: 10px;
            border: 1px solid #ccc;
            border-radius: 5px;
            box-sizing: border-box;
        }
        input[type="submit"] {
            background-color: #4caf50;
            color: #fff;
            cursor: pointer;
        }
        input[type="submit"]:hover {
            background-color: #45a049;
        }
    </style>
</head>
<body>

    <div class="container">
        <h2>Login</h2>
        <form action="login.php" method="post">
            <input type="text" name="username" placeholder="Username" required>
            <input type="password" name="password" placeholder="Password" required>
            <input type="submit" value="Login">
        </form>
    </div>

</body>
</html>

在浏览器输入地址访问:
image.png

点击超链接和直接浏览器直接输入地址访问是一样的,修改index.html文件如图:
image.png
效果如图:
image.png

5.动态和静态资源

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>User List</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
        }
        .container {
            width: 80%;
            margin: 20px auto;
            padding: 20px;
            background-color: #fff;
            border-radius: 5px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }
        h2 {
            margin-top: 0;
        }
        table {
            width: 100%;
            border-collapse: collapse;
        }
        th, td {
            padding: 10px;
            border-bottom: 1px solid #ddd;
            text-align: left;
        }
        th {
            background-color: #f2f2f2;
        }
        tr:hover {
            background-color: #f2f2f2;
        }
    </style>
</head>
<body>

    <div class="container">
        <h2>User List</h2>
        <table>
            <thead>
                <tr>
                    <th>ID</th>
                    <th>Username</th>
                    <th>Email</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>1</td>
                    <td>john_doe</td>
                    <td>john@example.com</td>
                </tr>
                <tr>
                    <td>2</td>
                    <td>jane_smith</td>
                    <td>jane@example.com</td>
                </tr>
                <!-- Add more rows for other users -->
            </tbody>
        </table>
    </div>

</body>
</html>

运行效果:
image.png

这是一个静态资源。静态资源和动态资源是Web开发中常用的两种类型的资源,它们在处理方式和生成方式上有所不同:

静态资源

静态资源是指在服务器上事先存储好的文件,如HTML、CSS、JavaScript、图像、视频等,这些文件的内容在客户端请求时不会发生变化。静态资源的特点是内容固定,不需要经过特殊处理,直接通过URL访问即可获取。

静态资源的处理方式简单直接,服务器不需要进行任何逻辑处理,只需要将文件内容返回给客户端即可。由于静态资源不需要动态生成,因此通常具有较高的性能和较低的资源消耗。

动态资源

动态资源是指在服务器端根据客户端请求动态生成的内容,通常是通过服务器端程序(如Servlet、JSP、PHP等)根据请求参数或其他信息生成的内容。动态资源的内容在每次请求时可能会发生变化,例如根据用户输入的搜索关键词返回搜索结果、根据用户登录状态显示不同的页面等。

动态资源的处理方式复杂一些,需要服务器端程序根据请求动态生成内容,并将生成的内容返回给客户端。服务器端程序可能需要访问数据库、执行业务逻辑等操作来生成内容,因此通常具有较高的灵活性,可以根据不同的需求生成不同的内容。

6.servlet

6.1servlet概述

Servlet是Java编程语言编写的服务器端程序,它是Java EE(Java Enterprise Edition)规范的一部分。Servlet主要用于处理来自客户端的HTTP请求,并生成动态的、基于Web的响应。简单来说,Servlet就是一个在服务器端运行的Java程序,用于处理Web请求和生成Web响应。

Servlet的作用可以总结如下:

  1. 处理HTTP请求:Servlet可以接收来自客户端的HTTP请求,并根据请求执行相应的业务逻辑。例如,处理用户提交的表单数据、获取URL参数、验证用户身份等。

  2. 生成HTTP响应:Servlet可以根据请求执行业务逻辑,并生成相应的HTTP响应。例如,根据数据库中的数据生成动态的HTML页面、返回JSON数据给客户端、生成文件下载等。

  3. 与客户端交互:Servlet可以与客户端进行交互,包括读取请求参数、设置响应头、发送重定向、设置Cookie等。

  4. 处理会话管理:Servlet可以管理客户端与服务器之间的会话状态,例如通过Session对象存储用户的登录状态、购物车内容等。

  5. 连接数据库:Servlet可以与数据库进行交互,执行数据库操作,如查询、插入、更新、删除等,以处理业务逻辑所需的数据。

  6. 调用其他Java组件:Servlet可以调用其他Java组件,如JavaBean、EJB(Enterprise JavaBean)、JDBC(Java Database Connectivity)等,以实现更复杂的业务逻辑。

6.2模拟servlet本质

想象一下你是一个服务员(Servlet),工作在一家餐厅(服务器)里。顾客(客户端)在桌子上写下了自己想要的菜单(HTTP请求),然后递给了你。

  1. 接收请求:你接过顾客的菜单,看到上面写着要求点菜的请求。你知道这意味着顾客想要点菜了,于是你开始处理这个请求。

  2. 执行业务逻辑:你根据菜单上的内容,开始处理顾客点菜的请求。你可能需要去厨房(应用服务器)获取食材、做菜,也可能需要去仓库(数据库)查询菜品的信息,然后进行相应的操作。

  3. 生成响应:当菜做好后,你将它们放在盘子上,并将盘子递给了顾客。这时候,你的工作是生成一个菜单(HTTP响应),上面列出了顾客所点的菜品,然后把菜单递给了顾客。

  4. 与客户端交互:顾客看到你递给他的菜单,可能会提出额外的要求,比如加点醋、换个餐具等。你根据他的要求进行相应的操作,并再次递给他菜单。

  5. 处理会话管理:如果顾客是同一个人,可能会多次点菜,你需要记住他之前点了什么菜,以便下次服务时能够提供更好的服务。这就是会话管理的作用。

  6. 调用其他服务:有些时候,你可能需要向其他服务员(Java组件)请求帮助,比如询问厨房是否有某种菜品,或者向收银台查询顾客的账单情况。

代码模拟:

  1. 充当webapp开发者:
package com.rainsoul.servlet;

import javax.servlet.Servlet;

// 充当的角色发生了改变:webapp开发者
// 只要是我们webapp开发者写的XXXServlet都要实现Servlet接口
public class BankServlet implements Servlet{
	public void service(){
		System.out.println("BankServlet's service...");
	}
}
package com.rainsoul.servlet;

import javax.servlet.Servlet;

// 充当的角色发生了改变:webapp开发者

public class UserListServlet implements Servlet{
	public void service(){
		System.out.println("UserListServlet's service...");
	}
}
package com.bjpowernode.servlet;

import javax.servlet.Servlet;

// 充当的角色发生了改变:webapp开发者

public class UserLoginServlet implements Servlet{
	public void service(){
		System.out.println("UserLoginServlet's service...");
	}
}

充当tomcat服务器开发者:

package org.apache;

import java.util.Scanner;
import java.util.Properties;
import java.io.FileReader;
import javax.servlet.Servlet;

// 充当Tomcat服务器的开发者
public class Tomcat{
	public static void main(String[] args) throws Exception{
		System.out.println("Tomcat服务器启动成功,开始接收用户的访问。");

		// 简单的使用Scanner来模拟一下用户的请求
		// 用户访问服务器是通过浏览器上的“请求路径”
		// 也就是说用户请求路径不同,后台执行的Servlet不同。
		/*
			/userList     UserListServlet
			/login		 UserLoginServlet
			/bank		 BankServlet
			......
		*/
		System.out.print("请输入您的访问路径:");
		Scanner s = new Scanner(System.in);

		// 用户的请求路径  /bbbb
		String key = s.nextLine(); // Tomcat服务器已经获取到了用户的请求路径了。

		// Tomcat服务器应该通过用户的请求路径找对应的XXXServlet
		// 请求路径和XXXServlet之间的关系应该由谁指定呢?
		// 对于Tomcat服务器来说需要解析配置文件
		FileReader reader = new FileReader("web.properties");
		Properties pro = new Properties();
		pro.load(reader);
		reader.close();

		// 通过key获取value
		String className = pro.getProperty(key);
		// 通过反射机制创建对象
		Class clazz = Class.forName(className);
		Object obj = clazz.newInstance(); // obj的类型对于Tomcat服务器开发人员来说不知道。
		
		// 但是Tomcat服务器的开发者知道,你写的XXXXServlet一定实现了Servlet接口
		Servlet servlet = (Servlet)obj;
		servlet.service();

	}
}

充当servlet开发者:

package javax.servlet;

/*
	我们现在充当的角色是SUN公司。
	SUN公司把Servlet接口/规范制定出来了。
*/
public interface Servlet{

	// 一个专门提供服务的方法
	void service();
}

HashMap集合:

key 请求路径value xxxServlet
/aaaaaUserListServlet
/bbbbbUserLoginServlet
/cccccBankServlet
请求路径和Java小程序之间有这个对应关系,我们可以再配置文件中指定:
/aaaa=com.rainsoul.servlet.UserListServlet

/bbbb=com.rainsoul.servlet.UserLoginServlet

/cccc=com.rainsoul.servlet.BankServlet

Tomcat可以解析这个配置文件。

    • 严格意义上来说Servlet其实并不是简单的一个接口:
    • Servlet规范中规定了:
      • 一个合格的webapp应该是一个怎样的目录结构。
      • 一个合格的webapp应该有一个怎样的配置文件。
      • 一个合格的webapp配置文件路径放在哪里。
      • 一个合格的webapp中java程序放在哪里。
      • 这些都是Servlet规范中规定的。
  • Tomcat服务器要遵循Servlet规范。JavaWEB程序员也要遵循这个Servlet规范。这样Tomcat服务器和webapp才能解耦合。
  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值