当前位置: 首页 > 面试题库 >

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

颜经艺
2023-03-14
问题内容

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

  • HTTP
  • 的HTML
  • 的CSS
  • Java脚本
  • jQuery的
  • 网络容器
  • 小程序
  • JSP
  • JSTL
  • 表达语言(EL)

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


问题答案:

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

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

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

  1. 浏览器将 请求 发送到服务器。该请求包括以下几个部分:
    • URL,例如“ https://stackoverflow.com/questions/ask ”,因此服务器知道要传递哪个页面。
    • 的HTTP方法。最常见的是 get ,它表示浏览器要检索信息(例如,单个页面或网络搜索),而 post则 是表示浏览器将某些信息推送到Web服务器,例如论坛帖子。帖子通常会更改服务器上的某些内容(例如论坛中的新帖子),而获取不会更改。
    • 请求正文,可以包含例如文本框的文本,要上传的图像等。
  2. 服务器发回一个 响应 ,它是浏览器请求的答案。它包括:
    • 一个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应用程序位于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

为了使该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和/helloURL
向我们的servlet发出请求。例如,如果我们的Web应用程序在www.example.com上运行,则要http://www.example.com/hello使用的正确URL将使用GET。

JSP

代表 Java服务器页面
。如您所见,使用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>

实际上,(通过Web容器)将JSP转换为Java
Servlet代码并进行编译。真!这不是魔术。这意味着,它们不过是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,因此在
服务器端 运行。

EL

手段 表达语言
和使用的Java对象,你在Java类创建计算表达式并访问值。通常,您将Servlet,JSP,JSTL和Expression语言结合在一起:

  • 客户端请求到达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用于客户端编程逻辑。如果您不需要Java脚本,请不要依赖它,某些用户已将其关闭。
  • 大多数其他技术(例如JSF)都建立在现有技术之上。找出它们的基础,以了解它们在哪里运行(客户端,服务器)以及应该做什么。


 类似资料:
  • 问题内容: 我正在开发一个Java Web应用程序,该应用程序通过从Web服务加载的大型XML配置文件来使其行为成为基础。由于在访问应用程序的特定部分之前实际上并不需要这些文件,因此它们会延迟加载。当需要这些文件之一时,查询将发送到Web服务以检索相应的文件。由于某些配置文件可能会被大量使用,因此比其他配置文件使用的频率要高得多,我想设置某种类型的缓存(可能有1小时的过期时间),以避免一遍又一遍地

  • 最近,我通过学习CodeLabs教程学习了kotlin coroutine。经过一些实践,我想知道我是否可以用java编写相同的代码。首先,我在MyKotlinFragment中编写了一个简单的kotlin代码。kt文件如下: 在我的片段中调用了;它起作用了。 接下来,我打开了一个名为MyRoutineFragment的java文件。java在同一个项目中,但我无法让它工作。 我无法将第一个文件转

  • 问题内容: 我知道这一个http://onjava.com/pub/a/onjava/2003/08/20/memoization.html,但是还有别的吗? 问题答案: 使用普通的简单类型安全Java来进行记忆也很容易。 您可以使用以下可重复使用的类从头开始。 我将它们用作缓存,其寿命是Web应用程序上的请求。 当然,如果您需要驱逐策略或更多功能(例如同步),请使用Guava 。 如果您需要记住

  • 问题内容: 您可能具有在开发人员机器上使用的一组属性,每个开发人员使用的属性各不相同,在暂存环境中使用另一组属性,在生产环境中使用另一组属性。 在Spring应用程序中,您可能还具有要在本地环境而不是生产环境中加载的bean,反之亦然。 您如何处理?您是否使用单独的文件,ant / maven资源过滤或其他方法? 问题答案: 我只是将各种属性放在JNDI中。这样,可以配置每个服务器,并且我可以拥有

  • 问题内容: 我在应用服务器上运行了多个Web应用,每个Web应用WAR文件都包含同一jar文件的副本。 这是否意味着该jar文件中的类将在JVM中多次加载,对于每个存在的WAR文件一次?接下来,如果我在此类中有一个静态同步方法,那么它是否仅在Web应用程序中存在的线程之间同步,而不是与不同类的jar文件中同一类中的同一方法同步? WAR文件?(希望这个问题有意义,如有必要将予以澄清)。 如果是这种

  • 目前,我正在尝试使用和来运行Spring Boot应用程序,在默认情况下作为web应用程序运行,在需要时作为独立的命令行应用程序运行(通过某种命令行参数)。我正在努力弄清楚当提供程序参数时,如何单独将其作为控制台应用程序运行。请给出任何建议。 主类-SpringApplication CommandLineRunner