JavaServer Pagesガイド(JSP)

1概要

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

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

2 JavaServer Pages

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

  • JSPファイルは基本的に.htmlファイルであり、いくつかの追加構文があります。

    1. .html という接尾辞は、.jspに置き換えられます(これは、.jspと見なされます).

filetype)と 。次のタグが.htmlマークアップ要素の先頭に追加されます。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

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

2.1. JSPの構文

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

<% 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. 静的 動的__コンテンツ

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

ただし、静的コンテンツは固定されており、ユーザー入力によって変更されることはありません。

動的なWebコンテンツは、ユーザーの行動や情報に応じて反応したり、変更されたり、変更されたりする資産です。

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

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

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 に属し、初期化時に設定された、またはアプリケーション全体にアクセスする必要があるアプリケーション全体のパラメータを格納します。

  • exception ** + exception はクラス javax.servlet.jsp.JspException に属し、タグ <%@ page isErrorPage =” true”%> を持つJSPページにエラーメッセージを表示するために使用されます。

  • page ** page はクラス java.lang.Object に属し、現在のサーブレット情報にアクセスまたは参照することを可能にします。

  • pageContext ** pageContext はクラス javax.servlet.jsp.PageContext に属しています。デフォルトは page スコープですが、 request application 、および session attributes にアクセスするために使用できます。

  • config ** + config はクラス javax.servletに属します。ServletConfig は、サーブレットコンテキスト、名前、および設定パラメータを取得するためのサーブレット設定オブジェクトです。

JSPで提供されている 暗黙オブジェクト をカバーしたので、ここで、.jspページが(間接的に)これらのオブジェクトのいくつかにアクセスできるようにする ディレクティブ を見てみましょう。

2.5. 指令

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

ディレクティブタグを使用して参照できる3種類のディレクティブは <%@ page …​%> です。使用するインポートまたはファイル、およびページで使用するカスタムアクションを定義するタグライブラリを指定する <%@ taglib …​%> を指定します。

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

そして、次のようにXMLを使用してそれを行うことができます。 <jsp:directive.page attribute =” value”/>

2.6. ページ指示属性

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

  • autoFlush _ <%@ page autoFlush =” false”%> _ **

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

  • buffer _ <%@ page buffer =” 19kb”%> _ **

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

  • errorPage _ <%@ page errorPage =” errHandler.jsp”%> _ **

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

  • extends _ <%@ page extends =” org.apache.jasper.runtime.HttpJspBase”%> _ **

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

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

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

  • isELIgnored ** <%@ページisELIgnored =” true”%>

isELIgnored は、ページがJSPの 式言語 (EL)を無視するかどうかを示します。 ELはプレゼンテーション層がJavaマネージドBeanと通信することを可能にし、それを $ \ {…​} 構文を使用して通信します。サンプルJSPアプリケーションを作成する isELIgnored のデフォルト値は false です。

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

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

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

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

  • language ** <%@ page language =” java”%>

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

  • session ** <%@ page session =” value”%>

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

  • trimDirectiveWhitespaces ** <%@ page trimDirectiveWhitespaces =” true”%>

trimDirectiveWhitespaces は、JSPページ内の空白を削除して、コンパイル時にコードをよりコンパクトなブロックに圧縮します。この値を true に設定すると、JSPコードのサイズを減らすのに役立ちます。デフォルト値は false です。

3 3つの例

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

Javaを.jspにインジェクトするには、主に3つの方法があります。Java8およびJava EEのネイティブ機能を使用して、以下の各方法を検討します。

まず、マークアップサーバー側をクライアント側に表示します。

次に、 javax.servlet.http s request および response オブジェクトとは無関係に、Javaコードを.jspファイルに直接追加する方法について説明します。

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

Tomcatでホストされる File/New/Project/Web/Dynamic web project/ タイプを使用して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

Tomcat 8の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 オブジェクトを確認しました。

上記の代わりに、 response オブジェクトに直接書き込む PrintWriter オブジェクトを使用しました。

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 にリダイレクトします。

したがって、私たちは本当に動的な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タグを切り替えたことに気付くでしょう。 setパラメータ( $ \ {text} としてバインドされています)をレンダリングするためにExpression Language(前述)を使用しています。

3.4. やってみよう!

これで、アプリケーションを.warにエクスポートして、Tomcat 8で起動してホストします。 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にアクセスできます。作業コピーを次の場所で受け取ります。

おめでとうございます。

4. 結論

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

これでJSPの紹介は終わりです。しっかりとコードを書く