4

我想使用 Java 开发一个 web 应用程序。但我很困惑所有这些不同的技术是什么以及它们如何协同工作:

  • HTTP
  • HTML
  • CSS
  • Javascript
  • jQuery
  • 网络容器
  • 小服务程序
  • JSP
  • JSTL
  • 表达语言(EL)

在网络上可以找到关于这些主题的大量资源,而且每个资源看起来都需要阅读几本书才能理解它们。您能否解释一下这些技术,以便我在开始开发 Web 应用程序时对它们有一个基本的了解?

4

1 回答 1

9

请注意,此解释的目的是提供一般理解,而不是检查每个主题的所有细节。有经验的用户肯定会发现“太笼统”的点,但我们不要混淆新用户。每个主题都提供了进一步阅读的链接。

让我们从基本的基础开始。您需要了解网页是如何进入您的计算机的,以便了解以下所有技术。

HTTP

HTTP 代表超文本传输​​协议。它描述了浏览器如何与网络服务器通信以检索其内容(网页)。网页存储在服务器上,浏览器需要一种方法来告诉服务器它想要获取哪个网页。另一方面,服务器需要告诉浏览器是否找到了请求的资源,并将此信息发送给浏览器。

  1. 浏览器向服务器发送请求。请求由几个部分组成:
    • URL,例如“ https://stackoverflow.com/questions/ask ”,因此服务器知道要传递哪个页面。
    • HTTP方法。最常见的是get,它表示浏览器想要检索信息(例如,单个页面,或 web 搜索),而post,它表示浏览器将一些信息推送到 web 服务器,例如论坛帖子。Post 通常会更改服务器上的某些内容(例如论坛中的新帖子),而 get 不会。
    • 请求正文,例如可以包含文本框的文本、要上传的图像等。
  2. 服务器发回一个response,这是浏览器请求的答案。它包括:
    • HTTP 状态码。这是一个显示请求结果的三位数字。最常见的是 OK (2xx)、REDIRECTION (3xx)、CLIENT ERROR (4xx) 和 SERVER ERROR (5xx)。重定向状态代码是将浏览器重定向到另一个页面的最佳方式。
    • 响应正文,其中包含网页(如果有)。

HTML

HTML 代表超文本标记语言并呈现内容。HTML 文本从服务器发送到客户端(即浏览器),并由浏览器呈现以显示给用户。示例 HTML:

<!DOCTYPE HTML>
<html>
    <head>
        <title>My first webpage</title>
    </head>
    <body>
        <p>Hello World!</p>
    </body>
</html>

由于 HTML 多年来一直在改进,因此每个 HTML 页面的第一行包含DOCTYPE声明非常重要。它告诉浏览器应该如何呈现不同的标签(如)。渲染过程由浏览器完成。由本地计算机上的浏览器完成的所有操作都称为客户端。记住那个词!<p>

CSS

表示层叠样式表。这会为网页添加样式,例如颜色、字体大小、元素位置等。CSS 定义通常保存在单独的文件中以提高可维护性。样式的渲染也是在客户端完成的。

JavaScript

不,这与 Java 无关。重复:没有。它是一种完全不同的编程语言,由客户端的浏览器执行。使用JavaScript,您可以在网页中包含编程逻辑并执行以下操作:

  • 验证用户输入
  • 花式幻灯片
  • 甚至编程游戏!

您需要注意,可以在浏览器中关闭 JavaScript,然后不会执行任何 JavaScript 代码。所以你不应该依赖于你的 web 应用程序的 JavaScript 可用性(除非你必须这样做,比如游戏)。JavaScript 可能会被滥用于重定向(应该使用 HTTP 状态代码)或元素样式(使用 CSS)。因此,在使用 Javascript 做某事之前,请检查是否有可能以其他方式进行。甚至下拉菜单也可以仅使用 HTML 和 CSS!

jQuery

jQuery只不过是一个用 JavaScript 编写的库。当你想让你的 JavaScript 跨浏览器兼容时,它会变得很方便,因为不同的浏览器在它们的 JavaScript 实现上有一些细微的差异。它对于选择页面的某些元素效果等也很有用。它仍然是 JavaScript,因此它在客户端运行。

网络容器

这是一个位于您的服务器上并在服务器端运行的软件。您的 Web 应用程序通常放置在Web 容器中。它是客户端请求和您的 web 应用程序之间的接口,并做了几件事来使编程 web 应用程序更舒适。例如,Apache Tomcat是一个 Web 容器。

小服务程序

现在我们进入 Java 世界。Servlet是 Web 应用程序的一部分,它位于 Web 容器内的服务器上,它们在server-side上运行。Servlet 是处理来自客户端的请求并返回响应的 Java 类。一个典型的 HTTP Servlet 如下所示:

public class HelloWorld extends HttpServlet {
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
                      throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hi</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<p>Hello World!</p>");
        out.println("</body>");
        out.println("</html>");
    }
}

HttpServlet类有几个doXxx方法,每个 HTTP 方法一个,开发人员可以覆盖这些方法。在这里,doGet被覆盖,这意味着当一个 GET 请求被发送到这个 servlet 时,这个代码被执行。此方法获取请求和响应作为参数,HttpServletRequest并且HttpServletResponse.

要通过 URL 访问这个 Servlet,必须配置web.xml :

<servlet>
    <servlet-name>HelloWorld</servlet-name>
    <servlet-class>com.example.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloWorld</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

现在,客户端可以使用 GET 和/helloURL 向我们的 servlet 发出请求。例如,如果我们的 web 应用程序在 www.example.com 上运行,则要使用的正确 URL 将http://www.example.com/hello使用 GET。

JSP

代表Java 服务器页面。如您所见,使用 Servlet 向客户端发送响应是相当不方便的。一些聪明人有这样的想法:“如果我们可以将 Java 代码添加到 HTML 页面会怎样?” 嗯,这就是 JSP:

<!DOCTYPE HTML>
<html>
    <head>
        <title>Hello JSP</title>
    </head>
    <body>
        <%
            for(int i=0; i<10; i++){
                out.print("Loop number " + i);
            }
        %>          
    </body>
</html>

事实上,JSP 被翻译成 Java Servlet 代码(由 Web 容器)并编译。真的!这不是魔法。这意味着,它们只不过是 Servlet!这是上述 JSP 的等效 Servlet 代码:

public class ServletAbc extends GenericServlet {
    public void service(ServletRequest req,ServletResponse res)
                        throws ServletException, IOException{
        PrintWriter out = res.getWriter();

        out.println("<!DOCTYPE HTML>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello JSP</title>");
        out.println("</head>");
        out.println("<body>");
        for(int i=0; i<10; i++){
            out.print("Loop number " + i);
        }
        out.println("</body>");
        out.println("</html>");
    }
}

您会看到,在将响应发送到客户端之前,所有 Java 代码都在服务器端进行处理。

JSTL

代表Java 标准标记库。顾名思义,它是一个库,您需要先包含它才能使用它。

带有 Java 代码的 JSP 仍然不是最好的解决方案。随着页面大小的增加,它变得非常不可读,降低了可维护性并且难以阅读。那么,如果我们可以只使用额外的标签来实现页面流、循环等,并让 Java 类来完成编程逻辑呢?欢迎使用标签库!

那里有很多标签库,而 JSTL 是“基本”标签库,提供核心功能。这包括 if/else 结构、循环等。它包含在 JSP 中,被翻译和编译为 Servlet,因此在服务器端运行。

埃尔

表示表达式语言,用于评估表达式和访问您在 Java 类中创建的 Java 对象的值。通常,您将 Servlet、JSP、JSTL 和表达式语言结合起来:

  • 客户端请求到达 Servlet。Servlet 执行一些编程逻辑(例如从数据库中读取数据)并在请求中存储一些 Java 对象。之后,它将请求转发到服务器上的另一个资源,例如 JSP。转发 发生在 Web 应用程序内部,不是重定向。
  • JSP 使用 EL 访问请求中的 Java 对象,显示它们并将响应发送给客户端。

例如,这是您的 Servlet:

public class HelloWorld extends HttpServlet {
   public void doGet(HttpServletRequest request,
                     HttpServletResponse response)
                     throws ServletException, IOException {
      // access databases, do calculations etc. here
      String hello = "Hello world!";
      String someBoolean = true;
      request.setAttribute("helloObject", hello);
      request.setAttribute("myBoolean", hello);
      RequestDispatcher dispatcher = request.getRequestDispatcher("/result.jsp);
      dispatcher.forward(request, response);
   }
}

result.jsp

<!DOCTYPE HTML>
<html xmlns:c="http://java.sun.com/jsp/jstl/core">
    <head>
        <title>Hello EL</title>
    </head>
    <body>
        ${helloObject}
        <c:if test="${myBoolean}">
            The expression is true.
        </c:if>
    </body>
</html>

这将输出Hello world! The expression is true..

要记住的事情

  • 我想我已经足够清楚地展示了在服务器端运行什么以及在客户端运行什么。不要把它们混在一起。
  • 始终为正确的工作使用正确的工具。HTML 用于内容,CSS 用于布局和样式,Javascript 用于客户端编程逻辑。如果您不需要它,请不要依赖 Javascript,有些用户已将其关闭。
  • 大多数其他技术,如 JSF,都是建立在现有技术之上的。了解它们的构建基础,以了解它们在哪里运行(客户端、服务器)以及它们应该做什么。
于 2013-04-25T05:04:38.780 回答