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

时间:2013-04-25 05:04:39

标签: java web-applications

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

  • HTTP
  • HTML
  • CSS
  • 的Javascript
  • 的jQuery
  • Web容器
  • 的Servlet
  • JS​​P
  • JS​​TL
  • 表达语言(EL)

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

1 个答案:

答案 0 :(得分:8)

请注意,此解释的目的是提供一般性的理解,而不是检查每个主题的所有细节。有经验的用户肯定会发现看起来过于笼统的点数,但不要让新用户感到困惑。每个主题都提供了进一步阅读的链接。

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

HTTP

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

  1. 浏览器向服务器发送请求。该请求包含几个部分:
    • 网址,例如" https://stackoverflow.com/questions/ask",以便服务器知道要传递的页面。
    • HTTP method。最常见的是获取,这表示浏览器想要检索信息(例如单个页面或网络搜索),以及发布,这表明浏览器推送了一些信息到网络服务器,就像一个论坛帖子。帖子通常会更改服务器上的内容(例如论坛中的新帖子),而get则不会。
    • 请求正文,可以包含例如文本框的文本,要上传的图像等。
  2. 服务器发回响应,这是浏览器请求的答案。它包括:
    • A HTTP status code。这是一个三位数字,显示请求的结果。最常见的是OK(2xx),REDIRECTION(3xx),CLIENT ERROR(4xx)和SERVER ERROR(5xx)。重定向状态代码是将浏览器重定向到另一个页面的最佳方式。
    • 响应正文,包含网页(如果有)。
  3. 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无关。重复:没有。它是由{strong>客户端上的浏览器执行的totally different programming language。使用JavaScript,您可以在网页中加入编程逻辑,并执行以下操作:

    • 验证用户输入
    • 精美幻灯片
    • 即使是编程游戏!

    您需要知道可以在浏览器中关闭JavaScript,然后不会执行任何JavaScript代码。所以你不应该依赖于你的webapplication的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容器。

    的Servlet

    现在我们进入Java世界。 Servlets是您的网络应用程序的一部分,它位于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被覆盖,这意味着当向此servlet发送GET请求时将执行此代码。此方法将请求和响应作为参数HttpServletRequestHttpServletResponse

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

    JSP

    代表Java Server Pages。如您所见,使用Servlet向客户端发送响应是非常不方便的。一些聪明的家伙有这样的想法:&#34;如果我们可以将Java代码添加到HTML页面怎么办?&#34;嗯,那就是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容器)并编译。真!这没有什么神奇之处。这意味着,它们只不过是Servlets!这是上述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是&#34; basic&#34;一,提供核心功能。这包括if / else构造,循环等。它包含在JSP中,翻译和编译为Servlet,因此在服务器端上运行。

    EL

    表示Expression Language,用于计算表达式和访问在Java类中创建的Java对象的值。通常,您将Servlets,JSP,JSTL和表达式语言结合起来:

    • 客户端请求来自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。如果您不需要Javascript,请不要依赖Javascript,有些用户会将其关闭。
    • 大多数其他技术,如JSF,都是建立在现有技术之上的。了解它们的构建内容,以了解它们的运行位置(客户端,服务器)以及它们应该执行的操作。