JSPとは何ですか?JavaServerPagesの概要

JavaServer Pages(JSP)は、JavaWebアプリケーション用の動的なデータ駆動型ページを作成できるようにするJava標準テクノロジです。JSPは、Javaサーブレット仕様に基づいて構築されています。2つのテクノロジーは通常、特に古いJavaWebアプリケーションで連携して機能します。コーディングの観点から見ると、両者の最も明らかな違いは、サーブレットではJavaコードを記述してから、クライアント側のマークアップ(HTMLなど)をそのコードに埋め込むのに対し、JSPではクライアント側のスクリプトまたはマークアップから始めてから埋め込むことです。ページをJavaバックエンドに接続するためのJSPタグ。

JSPは、MVC(model-view-controller)Webアプリケーションを構築するためのJava仕様であるJSF(JavaServer Faces)とも密接に関連しています。 JSPは、Eclipse Mojarra、MyFaces、PrimeFacesなどのJavaWebフレームワークの標準であるJSFよりも比較的単純で古いテクノロジーです。古いJSFアプリケーションのフロントエンドとしてJSPが使用されることは珍しくありませんが、Faceletsは最新のJSF実装に推奨されるビューテクノロジです。

JSPは、動的Webページを構築するための最初の選択肢ではないかもしれませんが、コアJavaWebテクノロジーです。JSPページは比較的迅速かつ簡単に作成でき、Tomcatなどのサーブレットコンテナ内のJavaサーブレットとシームレスに対話します。古いJavaWebアプリケーションでJSPに遭遇することがあり、単純で動的なJavaWebページを構築するのに役立つ場合があります。Java開発者は、少なくともJSPに精通している必要があります。

この記事では、JSP標準タグライブラリ(JSTL)を含むJavaServerPagesの概要を説明します。例では、単純なHTMLページを作成し、JSPタグを埋め込んでJavaサーブレットに接続し、ページをサーブレットコンテナで実行する方法を示しています。

JavaサーブレットとJavaServerFacesの詳細については、このシリーズの以前の記事を参照してください。

JakartaEEのJSP

Java EE 8のリリース後、オラクルはJava Enterprise Edition(Java EE)のスチュワードシップをEclipseFoundationに移しました。今後、JavaエンタープライズプラットフォームはJakartaEEとしてブランド名が変更されました。JSPは、JavaサーブレットおよびJSF仕様とともに、JakartaEEの継続的なサポートおよびアップグレードに含まれるJavaWebテクノロジーの1つです。

JSPページの作成

単純なJSPページ(.jsp)は、JSPタグが埋め込まれたHTMLマークアップで構成されています。ファイルがサーバーで処理されると、HTMLはアプリケーションビュー(Webページ)としてレンダリングされます。埋め込まれたJSPタグは、サーバー側のコードとデータを呼び出すために使用されます。図1の図は、HTML、JSP、およびWebアプリケーションサーバー間の相互作用を示しています。

マシュータイソン

リスト1は単純なJSPページを示しています。

リスト1.単純なJSPページ

${2 * 2} should equal 4

リスト1に、Expression Language(EL)を使用して記述されたJavaサーバーへの命令であるJSP式を含むHTMLのブロックを示します。式「${2 * 2}」では、「${}」はコードをHTMLに補間するためのJSP構文です。実行されると、JSPは式内にあるものを実行した結果を出力します。この場合、出力は数値4になります。

サーブレットコンテナ内のJSP

JSPページは、Javaサーブレットコンテナ内にデプロイする必要があります。JSPとサーブレットに基づいてJavaWebアプリケーションをデプロイするには、.jspファイル、Javaコード、およびアプリケーションメタデータを.warファイルにパッケージ化します。これは、Webアプリケーションの従来の構造を持つ単純な.zipファイルです。

JSPをサーブレットコンテナにロードすると、JSPはサーブレットにコンパイルされます。JSPとJavaサーブレットは、リクエストオブジェクトにアクセスして応答する機能など、同様の特性を共有しています。Apache Tomcat 9xは、サーブレット4.0およびJSP2.3仕様のリファレンス実装です。(JSP 2.2と2.3の間の更新は比較的マイナーであることに注意してください。)

サーブレットコンテナとアプリケーションサーバー

Javaの世界では、Webサーバーとも呼ばれるサーブレットコンテナは、アプリケーションサーバーのライト(ビール)バージョンのようなものです。サーブレットコンテナは、要求と応答の相互作用を処理し、それらの相互作用がWebアプリケーションのJavaエンタープライズ機能のサブセットとインターフェイスできるようにします。Javaアプリケーションサーバーには、EJB、JPA、JMSなどを含む完全なJavaエンタープライズスタックの一部としてサーブレットコンテナが含まれています。

JSP用のサンプルアプリ

Tomcatのサンプルアプリケーションを使用して、JavaServerPagesの使用を開始します。Tomcatをまだインストールしていない場合は、Tomcatダウンロードページを参照して、オペレーティングシステムのTomcatインストールを選択します。この記事の執筆時点では、Tomcat 9が現在のリリースであり、サーブレット4.0およびJSP2.3と互換性があります。

TomcatをWindowsサービスとしてインストールするか、コマンドラインからまたはを使用して実行/bin/catalina.sh startでき/bin/catalina.batます。いずれの場合も、Tomcatを起動してlocalhost:8080から、図2に示すTomcatのウェルカムページを参照してください。

マシュータイソン

Tomcatの暗黙のオブジェクト

Tomcatのウェルカムページで、[]リンクをクリックし、[ JSPの例]をクリックします。

次に、Implicit Objects ExecuteWebアプリケーションを開きます。図3は、このアプリケーションの出力を示しています。この出力を調べるために少し時間がかかります。

マシュータイソン

リクエストパラメータ

暗黙的なオブジェクトは、JSPページを介してアクセスできる組み込みオブジェクトです。Webページ開発者は、これらのオブジェクトを使用して、HTTP要求を発行するときにブラウザーから送信されるデータである要求パラメーターなどへのアクセスを作成します。暗黙的なオブジェクトのブラウザURLを検討してください。

 //localhost:8080/examples/jsp/jsp2/el/implicit-objects.jsp?foo=bar 

パラメータは?foo=barであり、Webページの出力に反映されていることがわかります。ここでは、テーブルに「EL式」が表示され、値は「バー」になっています。、このうちをテストするにURLを変更するには//localhost:8080/examples/jsp/jsp2/el/implicit-objects.jsp?foo=zork、ヒット入力して、あなたは出力に反映変更が表示されます。

This example is a very simple introduction to using JSP tags to access server-side request parameters. In this case, the JSP page uses the built-in (implicit) object called param to access the web application's request parameters. The param object is available inside the JSP expression syntax that you saw in Listing 1.

In that example, we used an expression to do some math: ${2 * 2}, which output 4.

In this example, the expression is used to access an object and a field on that object: ${param.foo}.

JSP in a web application

On the Implicit Objects page, click the back arrow, followed by the Source link. This will lead you to the JSP code for the Implicit Objects web app, which is shown in Listing 2.

Listing 2. JSP code for the Implicit Objects web app

     JSP 2.0 Expression Language - Implicit Objects   
    
This example illustrates some of the implicit objects available in the Expression Language. The following implicit objects are available (not all illustrated here):
  • pageContext - the PageContext object
  • pageScope - a Map that maps page-scoped attribute names to their values
  • requestScope - a Map that maps request-scoped attribute names to their values
  • sessionScope - a Map that maps session-scoped attribute names to their values
  • applicationScope - a Map that maps application-scoped attribute names to their values
  • param - a Map that maps parameter names to a single String parameter value
  • paramValues - a Map that maps parameter names to a String[] of all values for that parameter
  • header - a Map that maps header names to a single String header value
  • headerValues - a Map that maps header names to a String[] of all values for that header
  • initParam - a Map that maps context initialization parameter names to their String parameter value
  • cookie - a Map that maps cookie names to a single Cookie object.
Change Parameter foo =

EL Expression Result
\${param.foo} ${fn:escapeXml(param["foo"])}
\${param["foo"]} ${fn:escapeXml(param["foo"])}
\${header["host"]} ${fn:escapeXml(header["host"])}
\${header["accept"]} ${fn:escapeXml(header["accept"])}
\${header["user-agent"]} ${fn:escapeXml(header["user-agent"])}

JSP functions

If you're familiar with HTML, then Listing 2 should look pretty familiar. You have the expected HTML elements, followed by the ${ } JSP expression syntax introduced in Listing 1. But notice the value for param.foo: ${fn:escapeXml(param["foo"])} . The "fn:escapeXML()" is a JSP function.

A JSP function encapsulates a chunk of reusable functionality. In this case, the functionality is to escape XML. JSP offers a variety of functions, and you can also create functions yourself. To use a function, you import its library into your JSP page, then call the function.

In Listing 2, the escapeXML function is included with the line:

The syntax is pretty clear: it imports the required functions and assigns them a prefix (in this case "fn") that can be used in all following expressions.

The JSP Standard Tag Library (JSTL)

The import line in Listing 2 calls taglib, which is short for tag library, or (in this case) JSP Standard Tag Library (JSTL). Tag libraries define reusable bits of functionality for JSP. JSTL is the standard tag library, containing a collection of taglibs that ship with every servlet and JSP implementation, including Tomcat.

The "functions" library is just one of the taglibs included with JSTL. Another common taglib is the core library, which you import by calling:

Like "fn", the "c" designation is conventional, and you will see it across most JSP pages.

Securing JSP pages

An example tag from the core library is


    

which outputs the tag with the XML already escaped. This function is important because outputting content directly to a web page via ${variable} opens the door to script injection attacks. This simple function is used to protect web pages from such attacks.

The core library also includes various tags for iteration and flow control (like IF/ELSE handling).

JSTL tag classifications

There are five sets of tags included in JSTL, each designed for a specific area of web application functionality:

  • JSTL core: Dealing with logic and execution flow; conventional tag: "c"
  • JSTL formatting: Dealing with formatting (like dates) and internationalization; conventional tag: "fmt".
  • JSTL SQL: Dealing with querying SQL databases (this is usually discouraged in the view layer); conventional tag: "sql".
  • JSTL XML: Dealing with working with XML documents; conventional tag: "x".
  • JSTL functions: Dealing primarily with String manipulations; conventional tag: "fn".

Calling taglibs in JSP pages

Now that you've got a handle on JSP basics, let's make a change to the example application. To start, locate the Implicit Object app in your Tomcat installation. The path is: apache-tomcat-8.5.33/webapps/examples/jsp/jsp2/el.

Open this file and locate the functions include:

just below this line, add a new line:

Hit Return and add another new line:

Now reload the page at //localhost:8080/examples/jsp/jsp2/el/implicit-objects.jsp?foo=bar.

更新が出力に反映されていることを確認する必要があります。