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

Uoo*_*ooo 4 java web-applications

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

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

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

Uoo*_*ooo 8

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

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

HTTP

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

  1. 浏览器向服务器发送请求.该请求包含几个部分:
    • URL,例如" /sf/ ",因此服务器知道要传递的页面.
    • HTTP方法.最常见的是get,它表示浏览器想要检索信息(例如单个页面或websearch),并发布,这表示浏览器将某些信息推送到网络服务器,如论坛帖子.帖子通常会改变服务器上的内容(比如论坛中的新帖子),而get则不然.
    • 请求正文,可以包含例如文本框的文本,要上载的图像等.
  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>
Run Code Online (Sandbox Code Playgroud)

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

CSS

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

JavaScript的

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

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

您需要知道可以在浏览器中关闭JavaScript,然后不会执行任何JavaScript代码.所以你不应该依赖于你的webapplication的JavaScript可用性(除了你必须,比如游戏).JavaScript可能被滥用于重定向(您应该使用HTTP状态代码)或元素样式(使用CSS).因此,在使用Javascript做某事之前,请检查是否可能以其他方式进行.只使用HTML和CSS即可实现下拉菜单!

jQuery的

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

Web容器

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

Servlet的

现在我们进入Java世界.Servlet是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>");
    }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

JSP

代表Java Server Pages.如您所见,使用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>
Run Code Online (Sandbox Code Playgroud)

实际上,JSP被转换为Java Servlet代码(通过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>");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

JSTL

代表Java标准标记库.就像名字所说的那样,它是一个你需要包含的库才能使用它.

使用Java代码的JSP仍然不是最佳解决方案.随着页面大小的增加,降低可维护性并且难以阅读,它变得非常难以理解.那么,如果我们可以使用其他标签来实现页面流,循环等,让Java类执行编程逻辑呢?欢迎使用标签库!

有许多标记库,JSTL是"基本"标记库,提供核心功能.这包括if/else构造,循环等.它包含在JSP中,翻译和编译为Servlet,因此在服务器端运行.

EL

意味着表达式语言,用来计算表达式和Java对象已在Java类中创建访问值.通常,您将Servlets,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);
   }
}
Run Code Online (Sandbox Code Playgroud)

而且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>
Run Code Online (Sandbox Code Playgroud)

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

要记住的事情

  • 我想我已经清楚地表明了在服务器端运行什么以及在客户端运行什么.不要混淆它们.
  • 始终使用正确的工具来完成正确的工作.内容的HTML,布局和样式的CSS,客户端编程逻辑的Javascript.如果您不需要它,请不要依赖Javascript,有些用户将其关闭.
  • 大多数其他技术,如JSF,都是建立在现有技术之上的.了解它们的构建内容,以了解它们的运行位置(客户端,服务器)以及它们应该执行的操作.