我想使用Java开发Web应用程序。但是我很困惑所有这些不同的技术是什么以及它们如何协同工作:
在网上可以找到关于这些主题的大量资源,并且每个主题似乎都需要阅读几本书才能理解。您可以解释这些技术,以便在开始开发Web应用程序时对它们有一个基本的了解吗?
请注意,此说明的目的是为了提供一般理解,而不是研究每个主题的所有细节。有经验的用户肯定会发现似乎“过于笼统”的观点,但不要让新用户感到困惑。每个主题中都提供了用于进一步阅读的链接。
让我们从基本的基础开始。您需要了解网页如何进入您的计算机才能了解以下所有技术。
HTTP代表 超文本传输协议
。它描述了浏览器如何与Web服务器通信以检索其内容(网页)。网页存储在服务器上,浏览器需要一种方法来告诉服务器它想要获取哪个网页。另一方面,服务器需要告知浏览器是否找到了所请求的资源,并将此信息发送给浏览器。
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定义通常保存在单独的文件中,以提高可维护性。样式的渲染也在 客户端 完成。
不,这与Java无关。重复: 什么都没有* 。它是由 客户端
的浏览器执行的完全不同的编程语言。使用JavaScript,您可以在网页中包含
编程逻辑 ,并执行以下操作: ***
您需要意识到可以在浏览器中关闭JavaScript,然后将不执行任何JavaScript代码。因此,您不应该依赖于Web应用程序的JavaScript可用性(除非像游戏那样必须依赖)。JavaScript可能会因为诸如重定向(您应该使用HTTP状态代码)或元素样式(为此使用CSS)之类的东西而被滥用。因此,在使用Javascript进行操作之前,请检查是否有其他可能。甚至只有HTML和CSS,下拉菜单也可以!
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和/hello
URL
向我们的servlet发出请求。例如,如果我们的Web应用程序在www.example.com上运行,则要http://www.example.com/hello
使用的正确URL将使用GET。
代表 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代码都在 服务器端 进行了处理。
代表 Java标准标记库
。顾名思义,它是一个库,您需要先包含它,然后才能使用它。
带有Java代码的JSP仍然不是最佳解决方案。随着页面大小的增加,它变得非常不可读,降低了可维护性,并且难以阅读。那么,如果我们仅使用附加的 标签
来实现页面流,循环等并使Java类执行编程逻辑该怎么办?欢迎使用标签库!
那里有很多标记库,而JSTL是“基本”库,提供了核心功能。这包括if / else构造,循环等。它包含在JSP中,已翻译并编译为Servlet,因此在
服务器端 运行。
手段 表达语言
和使用的Java对象,你在Java类创建计算表达式并访问值。通常,您将Servlet,JSP,JSTL和Expression语言结合在一起:
例如,这是您的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.
。
问题内容: 我正在开发一个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