目次

1. 概要

JavaServer Pages(JSP)を使用すると、JavaおよびJavaサーブレットを使用して静的コンテンツに動的コンテンツを挿入できます。 Javaサーブレットにリクエストを送信し、関連するロジックを実行し、特定のビューをサーバー側でレンダリングしてクライアント側で使用することができます。 この記事では、Java8およびJave7EEを使用したJavaServerPagesの概要を説明します。

まず、JSPに関連するいくつかの重要な概念、つまり、dynamicstaticの内容の違い、JSPライフサイクル、JSP構文、およびディレクティブと暗黙の概念について説明します。コンパイル時に作成されたオブジェクト!

2. JavaServerPages

JavaServer Pages(JSP)により、Java固有のデータを.jspビューに渡したり、.jspビュー内に配置したりして、クライアント側で使用できるようになりました。

JSPファイルは基本的に.htmlファイルであり、いくつかの追加の構文と、いくつかの小さな初期の違いがあります。

  1. .html サフィックスは.jsp(.jspファイルタイプと見なされます)に置き換えられ、
  2. 次のタグが.htmlマークアップ要素の先頭に追加されます。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

JSPの重要な概念のいくつかを見ていきましょう。

2.1. JSP構文

Javaコードを.jspに追加する方法は2つあります。 まず、Javaコードブロックを2つのScriptletタグ内に配置することを含む基本的なJavaScriptlet構文を使用できます。

<% Java code here %>

2番目の方法はXMLに固有です。

<jsp:scriptlet>
    Java code here
</jsp:scriptlet>

重要なのは、 if then 、および else 句を使用し、マークアップの関連ブロックをこれらの角かっこで囲むことにより、JSPで条件付きロジッククライアント側を使用できることです。

<% if (doodad) {%>
    <div>Doodad!</div>
<% } else { %>
    <p>Hello!</p>
<% } %>

たとえば、 doodad がtrueの場合、最初の div 要素を表示します。それ以外の場合は、2番目のp要素を表示します。

2.2. 静的および動的コンテンツ

Static Webコンテンツは、RESTful、SOAP、HTTP、HTTPS要求、またはその他のユーザーが送信した情報とは無関係に消費される固定資産です。

ただし、 Static のコンテンツは固定されており、ユーザー入力によって変更されることはありません。 Dynamic Webコンテンツは、ユーザーのアクションや情報に応じて応答、変更、または変更されるアセットです。

JSPテクノロジにより、動的コンテンツと静的コンテンツの間で責任を明確に分離できます。

サーバー(servlet)は dynamic コンテンツを管理し、クライアント(実際の.jspページ)は動的コンテンツが挿入されるstaticコンテキストです。

JSPによって作成され、JSP関連のデータサーバー側にアクセスできる暗黙オブジェクトを見てみましょう。

2.3. 暗黙のオブジェクト

暗黙オブジェクトは、コンパイル中にJSPエンジンによって自動的に生成されます。

暗黙オブジェクトには、HttpRequestおよびHttpResponseオブジェクトが含まれ、サーブレットで使用したり、.jspと対話したりするためのさまざまなサーバーサイド機能を公開します。 作成される暗黙オブジェクトのリストは次のとおりです。

request requestはクラスjavax.servlet.http.HttpServletRequestに属しています。 request オブジェクトは、すべてのユーザー入力データを公開し、サーバーサイドで利用できるようにします。

response response は、クラス javax.servlet.http.HttpServletResponse に属し、requestが行われた後にクライアント側に返されるものを決定します。

requestおよびresponse暗黙オブジェクトは最も重要で頻繁に使用されるオブジェクトであるため、これらを詳しく見てみましょう。

以下の例は、GETリクエストを処理するための非常に単純で不完全なサーブレットメソッドを示しています。 requestおよびresponseオブジェクトの使用方法に集中できるように、詳細のほとんどを省略しました。

protected void doGet(HttpServletRequest request, 
  HttpServletResponse response) throws ServletException, IOException {
    String message = request.getParameter("message");
    response.setContentType("text/html");
    . . .
}

まず、requestおよびresponseオブジェクトがパラメーターとしてメソッドに渡され、スコープ内で使用できるようになっていることがわかります。

.getParameter()関数を使用してリクエストパラメーターにアクセスできます。 上記では、 message パラメーターを取得し、文字列変数を初期化して、サーバー側のロジックで使用できるようにします。 ビューに渡されるデータが何でどのようになるかを決定するresponseオブジェクトにアクセスすることもできます。

上記では、コンテンツタイプを設定しました。 レンダリング時にJSPページにペイロードを表示するために、responseオブジェクトを返す必要はありません。

out out は、クラス javax.servlet.jsp.JspWriter に属し、クライアントにコンテンツを書き込むために使用されます。

JSPページに印刷する方法は少なくとも2つあり、ここで両方について説明する価値があります。 out は自動的に作成され、メモリに書き込んでからresponseオブジェクトに書き込むことができます。

out.print(“hello”);
out.println(“world”);

それでおしまい!

2番目のアプローチでは、 response オブジェクトに直接書き込むことができるため、パフォーマンスが向上する可能性があります。 ここでは、PrintWriterを使用します。

PrintWriter out = response.getWriter();
out.println("Hello World");

2.4. その他の暗黙のオブジェクト

他にも知っておくと便利な暗黙のオブジェクトがいくつかあります。

session session は、クラス javax.servlet.http.HttpSession に属し、セッションの間、ユーザーデータを維持します。

application application は、クラス javax.servlet.ServletContext に属し、初期化時に設定された、またはアプリケーション全体でアクセスする必要のあるアプリケーション全体のパラメーターを格納します。

例外例外クラスに属する javax.servlet.jsp.JspException タグのあるJSPページにエラーメッセージを表示するために使用されます <%@ page isErrorPage =” true”%>

page pageはクラスjava.lang.Objectに属しており、現在のサーブレット情報にアクセスまたは参照できます。

pageContext pageContextはクラスjavax.servlet.jsp.PageContextに属し、デフォルトは page スコープですが、へのアクセスに使用できます。 request application 、およびsession属性

config configはクラスjavax.servlet.ServletConfigに属し、サーブレットコンテキスト、名前、および構成パラメーターを取得できるようにするサーブレット構成オブジェクトです。

JSPによって提供される暗黙オブジェクトについて説明したので、次に、.jspページがこれらのオブジェクトの一部に(間接的に)アクセスできるようにするディレクティブに目を向けましょう。

2.5. ディレクティブ

JSPは、JSPファイルのコア機能を指定するために使用できるすぐに使用できるディレクティブを提供します。 JSPディレクティブには、(1)ディレクティブ自体と、(2)値が割り当てられているそのディレクティブの属性の2つの部分があります。

ディレクティブタグを使用して参照できる3種類のディレクティブは次のとおりです。 <%@ページ…%> これは、JSPの依存関係と属性を定義します。 コンテンツタイプ言語 <%@ include…%> 使用するインポートまたはファイルを指定し、 <%@ taglib…%> これは、ページで使用されるカスタムアクションを定義するタグライブラリを指定します。

したがって、例として、ページディレクティブは次のようにJSPタグを使用して指定されます。 <%@ page attribute =” value”%>

そして、次のようにXMLを使用してそれを行うことができます。

2.6. ページディレクティブ属性

ページディレクティブ内で宣言できる属性はたくさんあります。

autoFlush <%@ page autoFlush =” false”%>

autoFlush はバッファー出力を制御し、バッファーサイズに達するとそれをクリアします。 デフォルト値はtrueです。

バッファ <%@ page buffer =” 19kb”%>

buffer は、JSPページで使用されるバッファーのサイズを設定します。 デフォルト値は8kbです。

errorPage <%@ page errorPage =” errHandler.jsp”%>

errorPage は、JSPページをエラーページとして指定します。

拡張します <%@ page extends =” org.apache.jasper.runtime.HttpJspBase”%>

extends は、対応するサーブレットコードのスーパークラスを指定します。

情報 <%@ page info =”これは私のJSPです!” %>

info は、JSPのテキストベースの説明を設定するために使用されます。

isELIgnored <%@ page isELIgnored =” true”%>

isELIgnored は、ページがJSPの Expression Language (EL)を無視するかどうかを示します。 ELを使用すると、プレゼンテーション層がJavaマネージドBeanと通信できるようになり、 ${…}構文を使用して通信できるようになります。ここでは、ELの本質については説明しませんが、以下にいくつかの例を示します。サンプルのJSPアプリを作成するにはこれで十分です。 isELIgnoredのデフォルト値はfalseです。

isErrorPage <%@ page isErrorPage =” true”%>

isErrorPage は、ページがエラーページであるかどうかを示します。 アプリケーション内でページのエラーハンドラを作成する場合は、エラーページを指定する必要があります。

isThreadSafe <%@ page isThreadSafe =” false”%>

isThreadSafeのデフォルト値はtrueです。 isThreadSafe は、JSPがサーブレットマルチスレッドを使用できるかどうかを決定します。 一般に、その機能をオフにすることは決してありません。

言語 <%@ page language =” java”%>

language は、JSPで使用するスクリプト言語を決定します。 デフォルト値はJavaです。

セッション <%@ page session =” value”%>

session は、HTTPセッションを維持するかどうかを決定します。 デフォルトはtrueで、trueまたはfalseの値を受け入れます。

TrimDirectiveWhitespaces <%@ページtrimDirectiveWhitespaces =” true”%>

trimDirectiveWhitespaces は、コンパイル時にコードをよりコンパクトなブロックに凝縮するJSPページの空白をストライプ化します。 この値をtrueに設定すると、JSPコードのサイズを減らすのに役立つ場合があります。 デフォルト値はfalseです。

3. 3つの例

JSPの中心となる概念を確認したので、これらの概念をいくつかの基本的な例に適用して、最初のJSPサービスサーブレットを起動して実行するのに役立てましょう。

Javaを.jspに挿入する主な方法は3つあり、Java8とJakartaEEのネイティブ機能を使用して以下の各方法を検討します。

まず、マークアップサーバー側をレンダリングしてクライアント側に表示します。 次に、 java x.servlet.httprequestおよびresponseとは関係なく、Javaコードを.jspファイルに直接追加する方法を見ていきます。 オブジェクト。

第3に、 HttpServletRequest を特定の.jspに転送する方法と、サーバー側で処理されたJavaをそれにバインドする方法の両方を示します。

Tomcatでホストされるファイル/新規/プロジェクト/Web/動的Webプロジェクト/タイプを使用して、Eclipseでプロジェクトをセットアップしましょう。 プロジェクトを作成すると、次のように表示されます。

|-project
  |- WebContent
    |- META-INF
      |- MANIFEST.MF
    |- WEB-INF
      |- lib
      |- src

アプリケーション構造にいくつかのファイルを追加して、最終的に次のようにします。

|-project
  |- WebContent
    |- META-INF
      |- MANIFEST.MF
    |- WEB-INF
      |-lib
      *-web.xml
        |- ExampleTree.jsp
        |- ExampleTwo.jsp
        *- index.jsp
      |- src
        |- com
          |- baeldung
            *- ExampleOne.java
            *- ExampleThree.java

Tomcat8でURLコンテキストにアクセスしたときに表示されるindex.jspを設定しましょう。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>JSP Examples</title>
    </head>
    <body>
        <h1>Simple JSP Examples</h1>
        <p>Invoke HTML rendered by Servlet: <a href="ExampleOne" target="_blank">here</a></p>
        <p>Java in static page: <a href="ExampleTwo.jsp" target="_blank">here</a></p>
        <p>Java injected by Servlet: <a href="ExampleThree?message=hello!" target="_blank">here</a></p>
    </body>
</html>

3つのaがあり、それぞれが以下のセクション4.1から4.4で説明する例の1つにリンクしています。

また、web.xmlが設定されていることを確認する必要があります。

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
    <servlet-name>ExampleOne</servlet-name>
    <servlet-class>com.baeldung.ExampleOne</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ExampleOne</servlet-name>
    <url-pattern>/ExampleOne</url-pattern>
</servlet-mapping>

ここでの主な注意点は、各サーブレットを特定のサーブレットマッピングに正しくマッピングする方法です。そうすることで、各サーブレットを、消費可能な特定のエンドポイントに関連付けます。 次に、以下の他の各ファイルについて説明します。

3.1. サーブレットでレンダリングされたHTML

この例では、実際には.jspファイルの作成をスキップします。

代わりに、マークアップの文字列表現を作成し、ExampleOneサーブレットがGETリクエストを受信した後、PrintWriterを使用してGET応答に書き込みます。

public class ExampleOne extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest request, 
    HttpServletResponse response) throws ServletException, IOException {
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();
      out.println(
	"<!DOCTYPE html><html>" +
	"<head>" +
	"<meta charset=\"UTF-8\" />" +
	"<title>HTML Rendered by Servlet</title>" +
	"</head>" +
	"<body>" +
	"<h1>HTML Rendered by Servlet</h1></br>" +
	"<p>This page was rendered by the ExampleOne Servlet!</p>" +
	"</body>" +
	"</html>"
     );
   }
}

ここで行っているのは、サーブレットリクエスト処理を介してマークアップを直接挿入することです。 JSPタグの代わりに、静的JSPを使用せずに、純粋にサーバー側で、挿入するすべてのJava固有のデータとともにHTMLを生成します。

以前、JspWriterの機能であるoutオブジェクトを確認しました。

上記では、代わりに PrintWriter オブジェクトを使用しました。これは、responseオブジェクトに直接書き込みます。

JspWriter は、実際にメモリに書き込まれる文字列をバッファリングし、メモリ内バッファがフラッシュされた後、responseオブジェクトに書き込まれます。

PrintWriterはすでにresponseオブジェクトにアタッチされています。 これらの理由から、上記および以下の例では、responseオブジェクトに直接書き込むことをお勧めします。

3.2. JSP静的コンテンツのJava

ここでは、JSPタグを使用してExampleTwo.jspという名前のJSPファイルを作成します。 上記のように、これによりJavaをマークアップに直接追加できます。 ここでは、 String[]の要素をランダムに出力します。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
    <head>
        <title>Java in Static Page Example</title>
    </head>
    <body>
        <h1>Java in Static Page Example</h1>
	    <% 
              String[] arr = {"What's up?", "Hello", "It's a nice day today!"}; 
	      String greetings = arr[(int)(Math.random() * arr.length)];	
            %>
        <p><%= greetings %></p>
    </body>
</html>

上記では、JSPタグオブジェクト内の変数宣言が表示されます: type variableNameおよびinitialization通常のJavaと同じです。

特定のサーブレットに頼らずに静的ページにJavaを追加する方法を示すために、上記の例を含めました。 ここでは、Javaがページに追加されるだけで、残りはJSPライフサイクルが処理します。

3.3. 転送を伴うJSP

さて、最後の最も複雑な例です! ここでは、ExampleThreeで @WebServlet アノテーションを使用します。これにより、server.xmlでのサーブレットマッピングが不要になります。

@WebServlet(
  name = "ExampleThree",
  description = "JSP Servlet With Annotations",
  urlPatterns = {"/ExampleThree"}
)
public class ExampleThree extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {
      String message = request.getParameter("message");
      request.setAttribute("text", message);
      request.getRequestDispatcher("/ExampleThree.jsp").forward(request, response);
   }
}

ExampleThreeは、 message として渡されたURLパラメーターを受け取り、そのパラメーターを request オブジェクトにバインドしてから、そのrequestオブジェクトをExampleThree.jsp[にリダイレクトします。 X190X]。

したがって、真に動的Web エクスペリエンスを実現しただけでなく、複数の.jspファイルを含むアプリケーション内でも実現しました。

getRequestDispatcher()。forward()は、正しい.jspページが確実にレンダリングされるようにする簡単な方法です。

(.jspファイルの)方法で送信された request オブジェクトにバインドされたすべてのデータが表示されます! 最後の部分の処理方法は次のとおりです。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
    <head>
        <title>Java Binding Example</title>
    </head>
    <body>
        <h1>Bound Value</h1>
	    <p>You said: ${text}</p>
    </body>
</html>

ExampleThree.jspの上部に追加されたJSPタグに注意してください。 ここでJSPタグを切り替えたことに気付くでしょう。 私は式言語(前に述べた)を使用して、設定されたパラメーター( $ {text} としてバインドされている)をレンダリングしています!

3.4. やってみて!

次に、アプリケーションを.warにエクスポートして、Tomcat8で起動およびホストします。 server.xml を見つけて、Contextを次のように更新します。

<Context path="/spring-mvc-xml" docBase="${catalina.home}/webapps/spring-mvc-xml">
</Context>

これにより、 localhost:8080 / spring -mvc-xml / jsp /index.jsp上のサーブレットとJSPにアクセスできるようになります。 GitHubで作業用コピーを入手してください。 おめでとうございます!

4. 結論

かなりの部分をカバーしました! JavaServer Pagesとは何か、達成するために導入されたもの、ライフサイクル、作成方法、そして最後にいくつかの異なる実装方法について学びました。

これで、JSPの概要は終わりです。 元気でコーディングしてください!