javaserver
JavaServer Pages(JSP)是一种Java标准技术,使您能够为Java Web应用程序编写动态的,数据驱动的页面。 JSP建立在Java Servlet规范之上。 两种技术通常可以协同工作,尤其是在较旧的Java Web应用程序中。 从编码的角度看,它们之间最明显的区别是,使用servlet编写Java代码,然后将客户端标记(如HTML)嵌入到该代码中,而使用JSP时,您首先使用客户端脚本或标记,然后嵌入使用JSP标记将页面连接到Java后端。
JSP还与JSF(JavaServer Faces)紧密相关, JSF是用于构建MVC(模型-视图-控制器)Web应用程序的Java规范。 与JSF相比,JSP是一种相对简单且较旧的技术,而JSF是Eclipse Mojarra ,MyFaces和PrimeFaces等Java Web框架的标准。 虽然将JSP用作旧JSF应用程序的前端并不少见,但是Facelets是现代JSF实现的首选视图技术。
虽然JSP可能不是构建动态Web页面的首选,但它是Java Java Web技术的核心。 JSP页面相对较快且易于构建,并且它们与Tomcat之类的servlet容器中的 Java servlet无缝交互。 您将在较旧的Java Web应用程序中遇到JSP,有时您可能会发现它对于构建简单的动态Java Web页面很有用。 作为Java开发人员,您至少应该熟悉JSP。
本文将简要介绍JavaServer Pages,包括JSP标准标记库(JSTL) 。 示例向您展示了如何编写一个简单HTML页面,如何嵌入JSP标记以连接到Java servlet以及如何在servlet容器中运行该页面。
请参阅本系列以前的文章,以了解有关Java servlet和JavaServer Faces的更多信息。
雅加达EE中的JSP
在Java EE 8发布之后,Oracle将Java Enterprise Edition(Java EE)的管理权移交给了Eclipse Foundation。 展望未来,Java企业平台已更名为Jakarta EE 。 与Java Servlet和JSF规范一起,JSP是包含在Jakarta EE中的持续支持和升级的Java Web技术之一。
编写JSP页面
一个简单的JSP页面(.jsp)由嵌入JSP标签HTML标记组成。 在服务器上处理文件时,HTML呈现为应用程序视图,网页。 嵌入式JSP标记将用于调用服务器端代码和数据。 图1中的图显示了HTML,JSP和Web应用程序服务器之间的交互。
清单1显示了一个简单的JSP页面。
清单1.一个简单的JSP页面
<html>
<body>
<p>${2 * 2} should equal 4</p>
</body>
</html>
在清单1中,您将看到一个包含JSP表达式HTML块,该JSP表达式是使用Expression Language(EL)编写的Java服务器指令。 在表达式“ ${2 * 2}
”中,“ ${}
”是用于将代码插入到HTML中的JSP语法。 执行时,JSP将输出执行表达式内部内容的结果。 在这种情况下,输出将为数字4。
Servlet容器中的JSP
JSP页面必须部署在Java servlet容器内。 为了部署基于JSP和servlet的Java Web应用程序,您将.jsp文件,Java代码和应用程序元数据打包在.war文件中,该文件是一个简单的.zip文件,具有用于Web应用程序的常规结构。
将JSP加载到servlet容器后,它将被编译为servlet。 JSP和Java Servlet具有相似的特性,包括访问和响应请求对象的能力。 Apache Tomcat 9x是Servlet 4.0和JSP 2.3规范的参考实现。 (请注意,JSP 2.2和2.3之间的更新相对较小。)
Servlet容器与应用程序服务器
在Java世界中, Servlet容器 (也称为Web服务器)就像应用程序服务器的精简(啤酒)版本。 Servlet容器处理请求和响应交互,并允许这些交互与Web应用程序的Java企业功能的子集对接。 Java应用程序服务器将servlet容器作为完整Java企业堆栈的一部分 ,其中包括EJB,JPA,JMS等。
JSP的示例应用
我们将在Tomcat中使用一个示例应用程序来使您开始使用JavaServer Pages。 如果尚未安装Tomcat,请浏览至Tomcat下载页面,然后为您的操作系统选择Tomcat安装。 撰写本文时,Tomcat 9是当前发行版 ,与Servlet 4.0和JSP 2.3兼容。
您可以将Tomcat作为Windows服务安装,或者使用/bin/catalina.sh start
或/bin/catalina.bat
从命令行运行它。 无论哪种方式,都启动Tomcat,然后转到localhost:8080
以查看图2所示的Tomcat欢迎页面。
Tomcat中的隐式对象
在Tomcat欢迎页面上,单击“ 示例”链接,然后单击“ JSP示例” 。
接下来,打开“ 隐式对象执行” Web应用程序。 图3显示了此应用程序的输出。 花一点时间研究此输出。
请求参数
隐式对象是可通过JSP页面访问的内置对象。 作为网页开发人员,您将使用这些对象创建对诸如请求参数之类的东西的访问,这些请求参数是发出HTTP请求时从浏览器发送过来的数据。 考虑隐式对象的浏览器URL:
http://localhost:8080/examples/jsp/jsp2/el/implicit-objects.jsp?foo=bar
该参数是?foo=bar
,您可以在网页的输出中看到它,表显示“ EL Expression”,值是“ bar”。 要对此进行测试,请将URL更改为http:// localhost:8080 / examples / jsp / jsp2 / el / implicit-objects.jsp?foo = zork , 按Enter ,您将看到更改反映在输出中。
此示例是使用JSP标记访问服务器端请求参数的非常简单的介绍。 在这种情况下,JSP页面使用称为param
的内置(隐式)对象访问Web应用程序的请求参数。 在清单1中看到的JSP表达式语法中,可以使用param
对象。
在该示例中,我们使用表达式进行一些数学运算: ${2 * 2}
,其输出为4
。
在此示例中,该表达式用于访问一个对象和该对象上的字段: ${param.foo}
。
Web应用程序中的JSP
在“隐式对象”页面上,单击后退箭头,然后单击“ 源”链接。 这将带您进入Implicit Objects Web应用程序的JSP代码,如清单2所示。
清单2. Implicit Objects Web应用程序的JSP代码
<%@page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<html>
<head>
<title>JSP 2.0 Expression Language - Implicit Objects</title>
</head>
<body>
<h1>JSP 2.0 Expression Language - Implicit Objects</h1>
<hr>
This example illustrates some of the implicit objects available
in the Expression Language. The following implicit objects are
available (not all illustrated here):
<ul>
<li>pageContext - the PageContext object</li>
<li>pageScope - a Map that maps page-scoped attribute names to
their values</li>
<li>requestScope - a Map that maps request-scoped attribute names
to their values</li>
<li>sessionScope - a Map that maps session-scoped attribute names
to their values</li>
<li>applicationScope - a Map that maps application-scoped attribute
names to their values</li>
<li>param - a Map that maps parameter names to a single String
parameter value</li>
<li>paramValues - a Map that maps parameter names to a String[] of
all values for that parameter</li>
<li>header - a Map that maps header names to a single String
header value</li>
<li>headerValues - a Map that maps header names to a String[] of
all values for that header</li>
<li>initParam - a Map that maps context initialization parameter
names to their String parameter value</li>
<li>cookie - a Map that maps cookie names to a single Cookie object.</li>
</ul>
<blockquote>
<u><b>Change Parameter</b></u>
<form action="implicit-objects.jsp" method="GET">
foo = <input type="text" name="foo" value="${fn:escapeXml(param["foo"])}">
<input type="submit">
</form>
<br>
<code>
<table border="1">
<thead>
<td><b>EL Expression</b></td>
<td><b>Result</b></td>
</thead>
<tr>
<td>\${param.foo}</td>
<td>${fn:escapeXml(param["foo"])} </td>
</tr>
<tr>
<td>\${param["foo"]}</td>
<td>${fn:escapeXml(param["foo"])} </td>
</tr>
<tr>
<td>\${header["host"]}</td>
<td>${fn:escapeXml(header["host"])} </td>
</tr>
<tr>
<td>\${header["accept"]}</td>
<td>${fn:escapeXml(header["accept"])} </td>
</tr>
<tr>
<td>\${header["user-agent"]}</td>
<td>${fn:escapeXml(header["user-agent"])} </td>
</tr>
</table>
</code>
</blockquote>
</body>
</html>
JSP功能
如果您熟悉HTML,那么清单2应该看起来很熟悉。 您具有预期HTML <td>
元素,然后是清单1中引入的${ }
JSP表达式语法。但是请注意param.foo
的值 : <td>${fn:escapeXml(param["foo"])} </td>
。 “ fn:escapeXML()
”是一个JSP函数。
JSP函数封装了许多可重用的功能。 在这种情况下,功能是转义XML。 JSP提供了多种功能,您也可以自己创建功能。 要使用功能,请将其库导入JSP页面,然后调用该功能。
在清单2中,该行包括了escapeXML
函数:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
语法非常清楚:它导入所需的函数并为它们分配一个前缀(在本例中为“ fn”),该前缀可在所有以下表达式中使用。
JSP标准标记库(JSTL)
清单2中的import
行调用taglib
,它是标记库 (或本例中的JSP标准标记库(JSTL))的缩写。 标记库定义了JSP功能的可重用位。 JSTL是标准标记库,包含每个Servlet和JSP实现(包括Tomcat)附带的标记库的集合。
“功能”库只是JSTL附带的taglib之一。 另一个常见的taglib是core
库,您可以通过调用以下代码导入:
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>
像“ fn”一样,“ c”是常规名称,您会在大多数JSP页面中看到它。
保护JSP页面
核心库中的示例标签是
<c:out value = "${'<div>'}"/>
它将输出<div>
标记,其中XML已经转义。 此功能很重要,因为通过${variable}
将内容直接输出到网页为脚本注入攻击打开了大门。 此简单功能用于保护网页免受此类攻击。
核心库还包括用于迭代和流控制(如IF / ELSE处理)的各种标签。
JSTL标签分类
JSTL中包含五组标签,每组标签都是针对Web应用程序功能的特定领域而设计的:
- JSTL核心:处理逻辑和执行流程; 常规标签:“
c
” - JSTL格式:处理格式(如日期)和国际化; 常规标签:“
fmt
”。 - JSTL SQL:处理查询SQL数据库(通常在视图层中不建议这样做); 常规标记:“
sql
”。 - JSTL XML:处理XML文档; 常规标签:“
x
”。 - JSTL函数:主要处理String操作; 常规标签:“
fn
”。
在JSP页面中调用taglib
现在您已经掌握了JSP基础知识,现在让我们对示例应用程序进行更改。 首先,在Tomcat安装中找到“隐式对象”应用程序。 路径是: apache-tomcat-8.5.33/webapps/examples/jsp/jsp2/el
。
打开此文件并找到以下functions
:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
在此行下方,添加新行:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
点击Return并添加另一行:
<c:out value = "${'This is a test of the JSTL Core Library'}"/>
现在,通过http:// localhost:8080 / examples / jsp / jsp2 / el / implicit-objects.jsp?foo = bar重新加载页面。
您应该看到更新反映在输出中。
翻译自: https://www.infoworld.com/article/3336161/what-is-jsp-introduction-to-javaserver-pages.html
javaserver