java - Java中用于对Web应用程序进行编程的不同技术如何协同工作?

标签 java web-applications

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

  • HTTP
  • HTML
  • CSS
  • Javascript
  • jQuery
  • Web容器
  • Servlet
  • JSP
  • JSTL
  • 表达语言(EL)

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

    最佳答案

    请注意,此说明的目的是为了提供一般理解,而不是研究每个主题的所有细节。有经验的用户肯定会发现似乎“过于笼统”的观点,但不要让新用户感到困惑。每个主题中都提供了用于进一步阅读的链接。

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

    HTTP

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

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

  • 的HTML

    HTML代表Hyper Text Markup Language并显示内容。 HTML文本从服务器发送到客户端(即浏览器),并由浏览器呈现以将其显示给用户。 HTML示例:
    <!DOCTYPE HTML>
    <html>
        <head>
            <title>My first webpage</title>
        </head>
        <body>
            <p>Hello World!</p>
        </body>
    </html>
    

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

    的CSS

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

    的JavaScript

    不,这与Java无关。重复:没有。它是totally different programming language,由浏览器在客户端上执行。使用JavaScript,您可以将编程逻辑包含到您的网页中,并执行以下操作:
  • 验证用户输入
  • 花式幻灯片
  • 甚至是编程游戏!

  • 您需要意识到可以在浏览器中关闭JavaScript,然后将不执行任何JavaScript代码。因此,您不应该依赖于Web应用程序的JavaScript可用性(除非像游戏那样必须依赖)。 JavaScript可能会因为诸如重定向(您应该使用HTTP状态代码)或元素样式(为此使用CSS)之类的东西而被滥用。因此,在使用Javascript进行操作之前,请检查是否有其他可能。 Even dropdown menus are possible with only HTML and CSS!

    jQuery的

    jQuery就是用JavaScript编写的库。当您想使JavaScript跨浏览器兼容时,它变得很方便,因为不同的浏览器在JavaScript实现上有一些细微的差异。它对于selecting certain elements of a pageeffects等也很有用。它仍然是JavaScript,因此可以在客户端上运行。

    网络容器

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

    小程序

    现在我们进入Java世界。 Servlets是Web应用程序的一部分,该Web应用程序位于Web容器内的服务器上,它们在服务器端上运行。 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时将执行此代码。此方法获取请求和响应作为参数HttpServletRequestHttpServletResponse

    为了使该Servlet可通过URL访问,必须配置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和/hello作为URL向我们的servlet发出请求。例如,如果我们的Web应用程序运行在www.example.com上,则要使用的正确URL将是使用GET的http://www.example.com/hello

    JSP

    代表Java Server Pages。如您所见,使用Servlet将响应发送到客户端非常不便。一些聪明的人有个主意:“如果我们可以只向HTML页面添加Java代码呢?”好,那就是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>
    

    实际上,是JSPs are translated to Java Servlet code(通过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 Standard Tag Library。顾名思义,这是一个库,您必须先need to include才能使用它。

    带有Java代码的JSP仍然不是最佳解决方案。随着页面大小的增加,它变得非常不可读,降低了可维护性,并且难以阅读。因此,如果我们仅使用附加的标记来实现页面流,循环等并使Java类执行编程逻辑该怎么办?欢迎使用标签库!

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

    EL

    表示Expression Language,用于评估表达式和访问在Java类中创建的Java对象的值。通常,您将Servlet,JSP,JSTL和Expression语言结合在一起:
  • 客户端请求到达Servlet。 Servlet执行一些编程逻辑(例如从数据库中读取数据),并将一些Java对象存储在请求中。之后,它将请求转发到服务器上的另一个资源,例如JSP。 转发 happens inside the webapplication,并且不是重定向。
  • 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用于客户端编程逻辑。如果您不需要Java脚本,请不要依赖它,某些用户已将其关闭。
  • 大多数其他技术(例如JSF)都建立在现有技术之上。找出它们的基础,以了解它们在哪里运行(客户端,服务器)以及应该做什么。
  • 关于java - Java中用于对Web应用程序进行编程的不同技术如何协同工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16206746/

    相关文章:

    java - 使用 JDT 获取方法调用的起始位置和长度

    java - Apache Wicket : Onclick of a form button, 我需要调用一个小的 javascript 函数

    java - 如何安全地将泛型类型的 Collection 转换为数组?

    java - 开发基于 Java EE 的 Web 应用程序时如何提高生产力

    html - 未能在 HTML 中指定字符集是否会导致页面定期呈现垃圾?

    java - 在 Java DAO 上使用同步是否会导致问题?

    java - 用户输入的时间限制

    java - 修改在中位数快速排序中找到的第 k 个元素

    angular - Ionic 3, angular 5 - webapp 的缓存问题

    tomcat - 无法从不同的机器访问我的网页 - 在同一个 WIFI 内