请注意,此解释的目的是提供一般性的理解,而不是检查每个主题的所有细节。有经验的用户肯定会发现“太笼统”的点,但我们不要混淆新用户。每个主题都提供了进一步阅读的链接。
让我们从基本的基础开始。您需要了解网页是如何进入您的计算机的,才能了解以下所有技术。
HTTP
HTTP 代表Hyper Text Transfer Protocol。它描述了浏览器如何与网络服务器通信以检索其内容(网页)。网页存储在服务器上,浏览器需要一种方法来告诉服务器它想要获取哪个网页。另一方面,服务器需要告诉浏览器是否找到了请求的资源,并将此信息发送给浏览器。
- 浏览器向服务器发送请求。请求由几个部分组成:
- 服务器发回一个response,这是对浏览器请求的回答。它包括:
-
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。这会将 style 添加到网页中,例如颜色、字体大小、元素位置等。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 page、effects 等也很有用。它仍然是 JavaScript,所以它运行在 client-side。
网络容器
这是一个位于您的服务器上并在服务器端上运行的软件。您的 Web 应用程序通常放在 web container 中。它是客户端请求和您的 web 应用程序之间的接口,并做了几件事来使编程 web 应用程序更舒适。例如,Apache Tomcat 是一个 Web 容器。
小服务程序
现在我们进入 Java 世界。 Servlets 是 Web 应用程序的一部分,它位于 Web 容器内的服务器上,它们在 服务器端 上运行。 Servlet 是处理来自客户端的 request 并返回 response 的 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 和 /hello 作为 URL 向我们的 servlet 发出请求。例如,如果我们的 web 应用程序在 www.example.com 上运行,则要使用的正确 URL 将是使用 GET 的http://www.example.com/hello。
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>
其实是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 和表达式语言结合起来:
- 客户端请求到达 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,请不要依赖它,有些用户已将其关闭。
- 大多数其他技术,如 JSF,都建立在现有技术之上。了解它们的构建基础,以了解它们在哪里运行(客户端、服务器)以及它们应该做什么。