用于Java中的Web应用程序编程的不同技术如何协同工作?
我想用Java开发一个web应用程序。 但我很困惑所有这些不同的技术以及它们如何协同工作:
- HTTP
- HTML
- CSS
- 使用Javascript
- jQuery的
- Web容器
- Servlet的
- JSP
- JSTL
- 表达语言(EL)
网上有大量关于这些主题的资源,而且每个资源看起来都需要阅读几本书来理解它们。 您能解释一下这些技术,以便在开始开发Web应用程序时对它们有基本的了解吗?
请注意,此解释的目的是给出一般性的理解,而不是检查每个主题的所有细节。 有经验的用户肯定会发现看起来“过于笼统”的点,但不要让新用户感到困惑。 每个主题都提供了进一步阅读的链接。
让我们从基础知识开始。 您需要知道网页如何进入您的计算机才能理解以下所有技术。
HTTP
HTTP代表超文本传输协议 。 它描述了浏览器如何与Web服务器通信以检索其内容(网页)。 网页存储在服务器上,浏览器需要一种方法来告诉服务器它想要获得哪个网页。 另一方面,服务器需要告诉浏览器是否找到了所请求的资源,并将此信息发送到浏览器。
- 浏览器向服务器发送请求 。 该请求包含几个部分:
- URL,例如“ https://stackoverflow.com/questions/ask ”,因此服务器知道要传递的页面。
- HTTP方法 。 最常见的是get ,表示浏览器想要检索信息(例如单个页面或网络搜索),并发布 ,这表示浏览器将某些信息推送到网络服务器,如论坛post。 post通常会改变服务器上的内容(比如论坛中的新post),而get则不然。
- 请求正文,可以包含例如文本框的文本,要上载的图像等。
- 服务器发回一个响应 ,这是浏览器请求的答案。 它包括:
- HTTP状态代码 。 这是一个三位数字,显示请求的结果。 最常见的是OK(2xx),REDIRECTION(3xx),CLIENT ERROR(4xx)和SERVER ERROR(5xx)。 重定向状态代码是将浏览器重定向到另一个页面的最佳方式。
- 响应正文,包含网页(如果有的话)。
HTML
HTML代表超文本标记语言并呈现内容 。 HTML文本从服务器发送到客户端(即浏览器),并由浏览器呈现以将其显示给用户。 示例HTML:
My first webpage Hello World!
由于HTML多年来已得到改进,因此每个HTML页面的第一行包含DOCTYPE声明非常重要。 它告诉浏览器应该如何呈现不同的标签 (如
)。 渲染过程由浏览器完成。 由本地计算机上的浏览器完成的所有操作都称为客户端 。 记住那个词!
CSS
意味着层叠样式表 。 这为网页添加了样式 ,如颜色,字体大小,元素位置等.CSS定义通常保存在单独的文件中以提高可维护性。 样式的渲染也是在客户端完成的 。
JavaScript的
不,这与Java无关。 重复: 没有 。 它是一种完全不同的编程语言 ,由客户端的浏览器执行。 使用JavaScript ,您可以在网页中包含编程逻辑 ,并执行以下操作:
- validation用户输入
- 花哨的幻灯片
- 甚至编程游戏!
您需要知道可以在浏览器中关闭JavaScript,然后不会执行任何JavaScript代码。 所以你不应该依赖于你的web应用程序的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(""); out.println(""); out.println(""); out.println("Hi "); out.println(""); out.println(""); out.println("Hello World!
"); out.println(""); out.println(""); } }
HttpServlet
类有几个doXxx
方法,每个HTTP方法一个,可以被开发人员覆盖。 这里,重写了doGet
,这意味着在向此servlet发送GET请求时执行此代码。 此方法获取请求和响应作为参数, HttpServletRequest
和HttpServletResponse
。
要通过URL访问此Servlet,必须配置web.xml :
HelloWorld com.example.HelloWorld HelloWorld /hello
现在,客户端可以使用GET和/hello
作为URL向我们的servlet发出请求。 例如,如果我们的网络应用程序在www.example.com上运行,则使用GET的正确URL将是http://www.example.com/hello
。
JSP
代表Java Server Pages 。 如您所见,使用Servlet向客户端发送响应是非常不方便的。 一些聪明的家伙有这样的想法:“如果我们可以将Java代码添加到HTML页面怎么办?” 嗯,这就是JSP:
Hello JSP <% for(int i=0; i<10; i++){ out.print("Loop number " + i); } %>
实际上, 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(""); out.println(""); out.println(""); out.println("Hello JSP "); out.println(""); out.println(""); for(int i=0; i<10; i++){ out.print("Loop number " + i); } out.println(""); out.println(""); } }
您可以看到,在将响应发送到客户端之前,所有Java代码都在服务器端进行处理。
JSTL
代表Java标准标记库 。 就像名字所说的那样,它是一个你需要包含的库才能使用它。
使用Java代码的JSP仍然不是最佳解决方案。 随着页面大小的增加,降低可维护性并且难以阅读,它变得非常难以理解。 那么,如果我们可以使用额外的标签来实现页面流,循环等,让Java类做编程逻辑呢? 欢迎使用标签库!
有许多标记库,JSTL是“基本”标记库,提供核心function。 这包括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); } }
而result.jsp
:
Hello EL ${helloObject} The expression is true.
这将输出Hello world! The expression is true.
Hello world! The expression is true.
。
要记住的事情
- 我想我已经清楚地表明在服务器端运行什么以及在客户端运行什么。 不要混淆它们。
- 始终使用正确的工具来完成正确的工作。 用于内容的HTML,用于布局和样式的CSS,用于客户端编程逻辑的Javascript。 如果您不需要它,请不要依赖Javascript,有些用户将其关闭。
- 大多数其他技术,如JSF,都是建立在现有技术之上的。 了解它们的构建内容,以了解它们的运行位置(客户端,服务器)以及它们应该执行的操作。