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の紹介は終わりです。しっかりとコードを書く