JSP 2を使用して、JSPファイルでJavaコードを回避するにはどうすればよいですか?

1695
chmoelders 2010-07-05 21:24.

私はJavaEEを初めて使用し、次の3行のようなものを知っています。

<%= x+1 %>
<%= request.getParameter("name") %>
<%! counter++; %>

は昔ながらのコーディング方法であり、JSPバージョン2には、JSPファイルでJavaコードを回避する方法があります。代替のJSP2行とは何ですか?この手法は何と呼ばれますか?

30 answers

1987
BalusC 2010-07-06 04:19.

使用スクリプトレット(それらの<% %>中のもの)JSPは、確かに非常にの誕生以来推奨されてタグライブラリ(のようなJSTL)とEL(式言語、それらの${}2001年のもの)ウェイ・バック。

スクリプトレットの主な欠点は次のとおりです。

  1. 再利用性:スクリプトレットを再利用することはできません。
  2. 置換可能性:スクリプトレットを抽象化することはできません。
  3. OO能力:継承/構成を利用することはできません。
  4. デバッグ可能性:スクリプトレットが途中で例外をスローした場合、表示されるのは空白のページだけです。
  5. テスト容易性:スクリプトレットはユニットテスト可能ではありません。
  6. 保守性: 1サルドあたり、混ざり合った/雑然とした/重複したコードロジックを維持するためにより多くの時間が必要です。

また、Sun Oracle自体は、JSPコーディング規則で、(タグ)クラスによって同じ機能が可能な場合は常にスクリプトレットの使用を避けることを推奨しています。関連性のいくつかの引用があります:

JSP 1.2仕様から、JSP標準タグライブラリ(JSTL)をWebアプリケーションで使用して、ページでのJSPスクリプトレットの必要性を減らすことを強くお勧めします。JSTLを使用するページは、一般に、読みやすく、保守しやすいものです。

..。

タグライブラリが同等の機能を提供する場合は、可能な限り、JSPスクリプトレットを避けてください。これにより、ページの読み取りと保守が容易になり、ビジネスロジックをプレゼンテーションロジックから分離し、ページをJSP 2.0スタイルのページに簡単に進化させることができます(JSP 2.0仕様では、スクリプトレットの使用はサポートされていますが、強調されていません)。

..。

モデルビューコントローラー(MVC)デザインパターンを採用して、ビジネスロジックからのプレゼンテーション層間の結合を減らすという精神で、JSPスクリプトレットをビジネスロジックの記述に使用ないでください。むしろ、必要に応じて、JSPスクリプトレットを使用して、クライアントの要求の処理から返されたデータ(「値オブジェクト」とも呼ばれます)を適切なクライアント対応形式に変換します。それでも、これはフロントコントローラーサーブレットまたはカスタムタグを使用して行う方が適切です。


スクリプトレットを置き換える方法は、コード/ロジックの唯一の目的によって異なります。多くの場合、このコードは十分に価値のあるJavaクラスに配置されます。

  • ユーザーがログインしているかどうかを確認するなど、要求されたページに関係なく、すべての要求で同じJavaコードを呼び出したい場合は、フィルターを実装し、それに応じてメソッドにコードを記述します。例えば:doFilter()

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        if (((HttpServletRequest) request).getSession().getAttribute("user") == null) {
            ((HttpServletResponse) response).sendRedirect("login"); // Not logged in, redirect to login page.
        } else {
            chain.doFilter(request, response); // Logged in, just continue request.
        }
    }
    

    <url-pattern>対象のJSPページをカバーする適切な場所にマップすると、JSPページ全体で同じコードをコピーアンドペーストする必要はありません。


  • リクエストを前処理するためにJavaコードを呼び出す場合、たとえば、データベースからリストをプリロードしてテーブルに表示する場合は、必要に応じてクエリパラメータに基づいて、サーブレットを実装し、それに応じてdoGet()メソッドにコードを記述します。例えば:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            List<Product> products = productService.list(); // Obtain all products.
            request.setAttribute("products", products); // Store products in request scope.
            request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response); // Forward to JSP page to display them in a HTML table.
        } catch (SQLException e) {
            throw new ServletException("Retrieving products failed!", e);
        }
    }
    

    この方法で例外を処理する方が簡単です。DBは、JSPレンダリングの最中ではなく、JSPが表示されるずっと前にアクセスされます。DBアクセスが例外をスローするたびに、応答を変更する可能性があります。上記の例では、デフォルトのエラー500ページが表示されますが、とにかく<error-page>inでカスタマイズできますweb.xml


  • フォーム送信の処理など、Javaコードを呼び出してリクエストを後処理する場合は、サーブレットを実装し、それに応じてdoPost()メソッドにコードを記述します。例えば:

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        User user = userService.find(username, password);
    
        if (user != null) {
            request.getSession().setAttribute("user", user); // Login user.
            response.sendRedirect("home"); // Redirect to home page.
        } else {
            request.setAttribute("message", "Unknown username/password. Please retry."); // Store error message in request scope.
            request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to JSP page to redisplay login form with error.
        }
    }
    

    このようにして、さまざまな結果ページの宛先を処理するのが簡単になります。エラーが発生した場合に検証エラーのあるフォームを再表示するか(この特定の例では${message}、ELで使用して再表示できます)、成功した場合は目的のターゲットページに移動します。


  • 実行プランや要求と応答の宛先を制御するためにJavaコードを呼び出す場合は、MVCのフロントコントローラーパターンに従ってサーブレットを実装します。例えば:

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            Action action = ActionFactory.getAction(request);
            String view = action.execute(request, response);
    
            if (view.equals(request.getPathInfo().substring(1)) {
                request.getRequestDispatcher("/WEB-INF/" + view + ".jsp").forward(request, response);
            } else {
                response.sendRedirect(view);
            }
        } catch (Exception e) {
            throw new ServletException("Executing action failed.", e);
        }
    }
    

    または、JSF、Spring MVC、WicketなどのMVCフレームワークを採用するだけで、カスタムサーブレットを必要とせずにJSP / FaceletsページとJavaBeanクラスだけを作成できます。


  • あなたがするためにいくつかのJavaコードを呼び出したい場合は、フローを制御するJSPページ内で、その後、次のような(既存の)フロー制御のtaglib取得する必要がありJSTLコアを。例List<Product>:テーブルに表示する:

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    ...
    <table>
        <c:forEach items="${products}" var="product"> <tr> <td>${product.name}</td>
                <td>${product.description}</td> <td>${product.price}</td>
            </tr>
        </c:forEach>
    </table>
    

    すべてのHTMLにうまく適合するXMLスタイルのタグを使用すると、コードは、さまざまな開始および終了中括弧(「この終了中括弧はどこに属するのですか?」)を含む一連のスクリプトレットよりも読みやすく(したがって保守しやすく)なります。簡単な方法は、スクリプトレットがまだ使用されている場合は常に例外をスローするようにWebアプリケーションを構成して、次の部分を追加することweb.xmlです。

    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <scripting-invalid>true</scripting-invalid>
        </jsp-property-group>
    </jsp-config>
    

    Facelets、ジャワEEの一部であるJSPの後継は、MVCフレームワーク提供JSFを、すでに、しない使用することができるスクリプトレットを。このようにして、あなたは自動的に「正しい方法」で物事を行うことを余儀なくされます。


  • Javaコードを呼び出して、JSPページ内の「バックエンド」データにアクセスして表示する場合は、EL(式言語)を使用する必要があります${}。例:送信された入力値の再表示:

    <input type="text" name="foo" value="${param.foo}" />
    

    ${param.foo}結果を表示しますrequest.getParameter("foo")


  • いくつかのユーティリティJavaコードをJSPページ(通常はpublic staticメソッド)で直接呼び出す場合は、それらをEL関数として定義する必要があります。JSTLには標準関数taglibがありますが、自分で関数を簡単に作成することもできます。これfn:escapeXmlは、JSTLがXSS 攻撃を防ぐのにどのように役立つかの例です。

    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
    ...
    <input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />
    

    XSSの感度は、Java / JSP / JSTL / ELなどに特に関連しているわけではないことに注意してください。この問題は、開発するすべてのWebアプリケーションで考慮する必要があります。スクリプトレットの問題は、少なくとも標準のJava APIを使用しない限り、組み込みの防止方法が提供されないことです。JSPの後継のFaceletsにはすでに暗黙的なHTMLエスケープが含まれているため、FaceletsのXSSホールについて心配する必要はありません。

参照:

  • JSP、サーブレット、JSFの違いは何ですか?
  • サーブレット、サーブレットコンテキスト、HttpSession、およびHttpServletRequest / Responseはどのように機能しますか?
  • JSP、サーブレット、JDBCを使用した基本的なMVCの例
  • JavaWebアプリケーションのデザインパターン
  • JSP /サーブレットの隠し機能
228
Stefan Schubert-Peters 2011-08-15 11:59.

セーフガードとして:スクリプトレットを永久に無効にする

別の質問を検討している、あなたは、常に自分の中でスクリプトレットを無効にする必要がありますすることができweb.xml、Webアプリケーション記述子。

開発者がスクリプトレットを追加するのを防ぐために、特に遅かれ早かれ概要が失われる大企業では、常にそうします。web.xml設定は次のようになります。

<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
     <scripting-invalid>true</scripting-invalid>
  </jsp-property-group>
</jsp-config>
109
Bozho 2010-07-05 21:28.

JSTLは、条件、ループ、セット、取得などのタグを提供します。例:

<c:if test="${someAttribute == 'something'}">
   ...
</c:if>

JSTLはリクエスト属性を処理します。ほとんどの場合、これらはサーブレットによってリクエストに設定され、サーブレットはJSPに転送します。

61
tzim 2010-07-05 21:29.

これが正しいかどうかはわかりません。

MVCについて何か読む必要があります。SpringMVCとStruts2は、最も一般的な2つのソリューションです。

54
βξhrαng 2010-07-05 22:45.

JSTLタグをEL式と一緒に使用して、JavaコードとHTMLコードの混合を回避できます。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
    <head>
    </head>
    <body>

        <c:out value="${x + 1}" /> <c:out value="${param.name}" />
        // and so on

    </body>
</html>
34
tsand 2011-03-23 08:24.

Wicketなどのコンポーネントベースのフレームワークもあり、多くのHTMLを生成します。

最終的にHTMLになるタグは非常に基本的であり、混合されるロジックは事実上ありません。結果はほとんど空になります-典型的なHTML要素を持つHTMLページのように。欠点は、Wicket APIには学習するコンポーネントがたくさんあり、それらの制約の下で達成するのが難しい場合があることです。

33
Sami Jmii 2011-02-05 00:41.

MVCアーキテクチャパターンでは、JSPはビューレイヤーを表します。JavaコードをJSPに埋め込むことは、悪い習慣と見なされます。

JSTL、freeMarker、velocityをJSPで「テンプレートエンジン」として使用できます。

これらのタグのデータプロバイダーは、処理しているフレームワークによって異なります。支柱2とWebWorkのMVCパターンの実装としては、使用OGNL「JSPに豆のプロパティを公開するための非常に興味深い技術」。

27
Thorbjørn Ravn Andersen 2010-07-05 22:30.

経験によれば、JSPにはいくつかの欠点があり、そのうちの1つはマークアップと実際のコードの混合を避けるのが難しいことです。

可能であれば、必要な作業に特化したテクノロジーの使用を検討してください。Java EE6にはJSF2.0があり、この#{bean.method(argument)}アプローチを通じてJavaBeanをJSFページに接着するなどの多くの優れた機能を提供します。

26
dipu 2012-05-12 06:45.

JSPでのJavaコーディングの欠点を単に回避したい場合は、スクリプトレットを使用しても回避できます。いくつかの規律に従って、JSPでJavaを最小限に抑え、JSPページで計算とロジックをほとんど使用しないようにします。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<% // Instantiate a JSP controller
MyController clr = new MyController(request, response);

// Process action, if any
clr.process(request);

// Process page forwarding, if necessary

// Do all variable assignment here
String showMe = clr.getShowMe();%>

<html>
    <head>
    </head>
    <body>
        <form name="frm1">
            <p><%= showMe %>
            <p><% for(String str : clr.listOfStrings()) { %>
            <p><%= str %><% } %>

            // And so on   
        </form>
    </body>
</html>
26
tomasb 2011-08-18 10:02.

JSTLを使用して独自のタグをカスタマイズおよび作成する方法を学ぶ

ELはEviL(実行時例外とリファクタリング)であることに注意してください。

Wicketも悪かったかもしれません(小さなアプリケーションや単純なビュー層ではパフォーマンスと面倒です)。

java2sからの例

これは、Webアプリケーションのweb.xmlに追加する必要があります

<taglib>
    <taglib-uri>/java2s</taglib-uri>
    <taglib-location>/WEB-INF/java2s.tld</taglib-location>
</taglib>

/ WEB-INF /にファイルjava2s.tldを作成します

<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<!-- A tab library descriptor -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>Java2s Simple Tags</short-name>

    <!-- This tag manipulates its body content by converting it to upper case
    -->
    <tag>
        <name>bodyContentTag</name>
        <tag-class>com.java2s.BodyContentTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
          <name>howMany</name>
        </attribute>
    </tag>
</taglib>

次のコードをWEB-INF \ classes \ com \ java2sにコンパイルします

package com.java2s;

import java.io.IOException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class BodyContentTag extends BodyTagSupport{
    private int iterations, howMany;

    public void setHowMany(int i){
        this.howMany = i;
    }

    public void setBodyContent(BodyContent bc){
        super.setBodyContent(bc);
        System.out.println("BodyContent = '" + bc.getString() + "'");
    }

    public int doAfterBody(){
        try{
            BodyContent bodyContent = super.getBodyContent();
            String bodyString  = bodyContent.getString();
            JspWriter out = bodyContent.getEnclosingWriter();

            if ( iterations % 2 == 0 )
                out.print(bodyString.toLowerCase());
            else
                out.print(bodyString.toUpperCase());

            iterations++;
            bodyContent.clear(); // empty buffer for next evaluation
        }
        catch (IOException e) {
            System.out.println("Error in BodyContentTag.doAfterBody()" + e.getMessage());
            e.printStackTrace();
        } // End of catch

        int retValue = SKIP_BODY;

        if ( iterations < howMany )
            retValue = EVAL_BODY_AGAIN;

        return retValue;
    }
}

サーバーを起動し、ブラウザにbodyContent.jspファイルをロードします。

<%@ taglib uri="/java2s" prefix="java2s" %>
<html>
    <head>
        <title>A custom tag: body content</title>
    </head>
    <body>
        This page uses a custom tag manipulates its body content.Here is its output:
        <ol>
            <java2s:bodyContentTag howMany="3">
            <li>java2s.com</li>
            </java2s:bodyContentTag>
        </ol>
    </body>
</html>
25
msj121 2011-05-21 10:42.

Wicketは、JavaをHTMLから完全に分離する代替手段でもあるため、デザイナーとプログラマーは、お互いをほとんど理解していなくても、さまざまなコードセットで共同作業を行うことができます。

ウィケットを見てください。

23
Dmitriy R 2011-07-13 10:20.

あなたは良い質問をしました、そしてあなたは良い答えを得ましたが、私はあなたがJSPを取り除くことを提案します。最終的に死ぬのは時代遅れの技術です。テンプレートエンジンのような最新のアプローチを使用します。ビジネスレイヤーとプレゼンテーションレイヤーが非常に明確に分離され、テンプレートにJavaコードが含まれないため、ほとんどの場合WYSIWYGを利用してWebプレゼンテーション編集ソフトウェアから直接テンプレートを生成できます。

また、フィルターや前処理と後処理は避けてください。そうしないと、変数が値を取得する場所が常にわからないため、サポート/デバッグの問題に対処する可能性があります。

21
Thai Tran 2013-01-27 08:07.

どれだけ避けようとしても、他の開発者と協力する場合、一部の開発者はスクリプトレットを好み、プロジェクトに邪悪なコードを挿入します。したがって、スクリプトレットコードを本当に削減したい場合は、最初のサインでプロジェクトを設定することが非常に重要です。これを克服するためのいくつかのテクニックがあります(他の人が言及したいくつかのフレームワークを含む)。ただし、純粋なJSP方式を使用する場合は、JSTLタグファイルを使用してください。これの良いところは、プロジェクトのマスターページを設定して、他のページがマスターページを継承できることです。

次のコンテンツを使用して、WEB-INF / tagsの下にbase.tagというマスターページを作成します。

<%@tag description="Overall Page template" pageEncoding="UTF-8"%>

<%@attribute name="title" fragment="true" %>

<html>
  <head>
    <title>  
       <jsp:invoke fragment="title"></jsp:invoke>
    </title>

  </head>
  <body>
    <div id="page-header">
       ....
    </div>
    <div id="page-body">
      <jsp:doBody/>
    </div>
    <div id="page-footer">
      .....
    </div>
  </body>
</html>

この母ページで、「タイトル」というフラグメントを作成しました。これにより、子ページで、マスターページのこの場所にさらにコードを挿入できるようになりました。また、タグ<jsp:doBody/>は子ページのコンテンツに置き換えられます

WebContentフォルダーに子ページ(child.jsp)を作成します。

<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:base>
    <jsp:attribute name="title"> 
        <bean:message key="hello.world" />
    </jsp:attribute>

    <jsp:body>
    [Put your content of the child here]
    </jsp:body>   
</t:base>

<t:base>使用するマスターページ(現時点ではbase.tag)を指定するために使用されます。<jsp:body>ここのタグ内のすべてのコンテンツ<jsp:doBody/>は、マスターページのを置き換えます。子ページには任意のタグlibを含めることもでき、他の前述のように通常どおりに使用できます。ただし、ここ(<%= request.getParameter("name") %>...)でスクリプトレットコードを使用してこのページを実行しようとすると、が表示されますJasperException because Scripting elements ( &lt;%!, &lt;jsp:declaration, &lt;%=, &lt;jsp:expression, &lt;%, &lt;jsp:scriptlet ) are disallowed here。したがって、他の人がjspファイルに邪悪なコードを含めることができる方法はありません

コントローラからこのページを呼び出す:

コントローラからchild.jspファイルを簡単に呼び出すことができます。これはStrutsフレームワークでもうまく機能します

21
mahesh 2011-02-23 20:14.

JSPファイルでJavaコードを回避するために、JavaはJSTLなどのタグライブラリを提供するようになりました。

また、Javaは、すべてのプログラミング構造をタグの形式で書き込むことができるJSFを考案しました。

19
Chandra Sekhar 2011-06-05 18:23.

JSPでJSTLタグライブラリを使用します。それは完全に機能します。

18
tanglei 2011-07-11 20:59.

JSTLタグとEL式を使用するだけです。

17
CsBalazsHungary 2013-01-22 06:04.

誰かが複数の言語でのプログラミングに本当に反対しているのなら、GWTをお勧めします。理論的には、Google Toolkitがすべてのクライアントと共有コードをJavaScriptに変換するため、すべてのJavaScript要素とHTML要素を回避できます。それらに問題はないので、他の言語でコーディングしなくてもWebサービスを利用できます。拡張機能(smartGWTまたはVaadin)によって提供されるデフォルトのCSSをどこかから使用することもできます。何十もの注釈を学ぶ必要はありません。

もちろん、必要に応じて、コードの奥深くにハッキングしてJavaScriptを挿入し、HTMLページを充実させることもできますが、実際には必要に応じて回避することができ、他のフレームワークで記述されたとおりの結果が得られます。 。私は試してみる価値があると言っています、そして基本的なGWTは十分に文書化されています。

そしてもちろん、多くの仲間のプログラマーがここにいくつかの他の解決策を説明または推奨しました。GWTは、Webパーツを実際に扱いたくない、またはWebパーツを最小限に抑えたくない人向けです。

16
Tobias 2012-05-21 21:51.

Pythonの世界からの素晴らしいアイデアは、テンプレート属性言語です。TALはZope(したがって、別名「Zopeページテンプレート」、ZPT)によって導入され、PHP、XSLT、およびJavaでも実装された標準です(私はPython / ZopeおよびPHPの化身を使用しました)。このクラスのテンプレート言語では、上記の例の1つは次のようになります。

<table>
    <tr tal:repeat="product products">
        <td tal:content="product/name">Example product</td>
        <td tal:content="product/description">A nice description</td>
        <td tal:content="product/price">1.23</td>
    </tr>
</table>

コードは、通常のHTML(またはXHTML)に加えて、XML名前空間のいくつかの特別な属性のように見えます。ブラウザで表示でき、設計者が安全に調整できます。

マクロと国際化およびローカリゼーションもサポートされています。

<h1 i18n:translate="">Our special offers</h1>
<table>
    <tr tal:repeat="product products">
        <td tal:content="product/name"
            i18n:translate="">Example product</td>
        <td tal:content="product/description"
            i18n:translate="">A nice description</td>
        <td tal:content="product/price">1.23</td>
    </tr>
</table>

コンテンツの翻訳が利用可能な場合は、それらが使用されます。

ただし、Javaの実装についてはよくわかりません。

15
kapil das 2013-07-22 19:59.

JSPでスクリプトレットを使用することは良い習慣ではありません。

代わりに、次を使用できます。

  1. JSTLタグ
  2. EL式
  3. カスタムタグ-使用する独自のタグを定義できます。

以下を参照してください。

  1. http://docs.oracle.com/javaee/1.4/tutorial/doc/JSTL3.html
  2. EL
14
Razvan 2014-03-16 07:17.

確かに、<%! counter++; %>イベントのプロデューサー-コンシューマーアーキテクチャに置き換えてください。ビジネスレイヤーは、カウンターをインクリメントする必要があることを通知され、それに応じて反応し、プレゼンターにビューを更新するように通知します。将来的には、カウンターの新旧の値、それをインクリメントした人、およびその目的を念頭に置いて知る必要があるため、多くのデータベーストランザクションが関係しています。レイヤーが完全に分離されているため、明らかにシリアル化が必要です。RMI、IIOP、SOAPを介してカウンターをインクリメントすることができます。しかし、HTMLだけが必要であり、それは非常にありふれたケースであるため、実装しません。新しい目標は、新しい光沢のあるE7、64GBRAMサーバーで1秒あたり250インクリメントに到達することです。

私はプログラミングに20年以上携わっていますが、ほとんどのプロジェクトは6つ組の前に失敗します。再利用性の置き換え可能性OO機能デバッグ可能性テスト可能性保守性も必要です。機能性だけを気にする人々によって実行された他のプロジェクトは、非常に成功しました。また、プロジェクトの初期段階で実装されたオブジェクト構造が硬いため、仕様の大幅な変更(アジャイル)にコードを適応させることができません。

したがって、私は先延ばしとして、プロジェクトの初期または特に必要とされないときに、「レイヤー」または冗長データ構造を定義するアクティビティを検討します。  

11
mel3kings 2013-06-14 23:31.

技術的には、JSPは実行時にすべてサーブレットに変換されます

JSPは当初、MVCパターンに従って、ビジネスロジックとデザインロジックを分離する目的で作成されました。したがって、JSPは技術的には実行時のすべてのJavaコードです。

しかし、質問に答えるために、タグライブラリは通常、JSPページにロジックを適用する(Javaコードを削除する)ために使用されます。

8
Yster 2015-12-25 01:47.

JSPファイルでJavaコードを回避するにはどうすればよいですか?

式言語(EL)に加えて、JSTLなどのタブライブラリタグを使用できます。ただし、ELはJSPではうまく機能しません。したがって、JSPを完全に削除して、Faceletsを使用することをお勧めします。

Faceletsは、JSF(Java Server Faces)用に設計された最初の非JSPページ宣言言語であり、JSPと比較してJSF開発者にシンプルで強力なプログラミングモデルを提供しました。Webアプリケーション開発用のJSPで発生するさまざまな問題を解決します。

ソース

8
Ajay Takur 2012-04-03 03:52.

Java Webアプリケーションで次のものを使用すると、JSPファイルのフォアグラウンドからJavaコードを削除できます。

  1. WebアプリケーションにMVCアーキテクチャを使用する

  2. JSPタグを使用する

a。標準タグ

b。カスタムタグ

  1. 表現言語
4
adn.911 2017-12-01 05:59.

スクリプトレットの使用は非常に古い方法でありお勧めしません。JSPページに何かを直接出力する場合は、JSTLとともに式言語(EL)を使用するだけです。

Velocity、Freemarker、Thymeleafなどのテンプレートエンジンを使用するなど、他のオプションもあります。ただし、ELとJSTLでプレーンJSPを使用することは、ほとんどの場合私の目的に役立ち、初心者にとっても最も簡単なようです。

また、ビューレイヤーでビジネスロジックを実行することはベストプラクティスではないことに注意してください。サービス層でビジネスロジックを実行し、出力結果をコントローラーを介してビューに渡す必要があります。

3
Sumesh TG 2018-06-21 03:49.

UIデザインにBackbone.jsまたはAngularJSのようなJavaScriptフレームワークを使用し、RESTAPIを使用してデータをフェッチします。これにより、Javaの依存関係がUIから完全に削除されます。

3
Eduardo 2017-12-13 09:45.

私の友人、それはもう使われていません。私のアドバイスは、ビュー(CSS、HTML、JavaScriptなど)をサーバーから切り離すことです。

私の場合、Angularでビューを処理するシステムを実行し、必要なデータはすべて、RESTサービスを使用してサーバーから取得されます。

私を信じてください、これはあなたがデザインする方法を変えるでしょう。

3
Alireza Fattahi 2016-04-13 04:55.

JSP 2.0には「タグファイル」と呼ばれる機能があり、外部Javaコードやを使用せずにタグを記述できますtld.tagファイルを作成してに入れる必要がありますWEB-INF\tags。タグをパッケージ化するためのディレクトリ構造を作成することもできます。

例えば:

/WEB-INF/tags/html/label.tag

<%@tag description="Rensders a label with required css class" pageEncoding="UTF-8"%>
<%@attribute name="name" required="true" description="The label"%>

<label class="control-label control-default"  id="${name}Label">${name}</label>

次のように使用します

<%@ taglib prefix="h" tagdir="/WEB-INF/tags/html"%>
<h:label  name="customer name" />

また、タグ本体を簡単に読み取ることができます。

/WEB-INF/tags/html/bold.tag
<%@tag description="Bold tag" pageEncoding="UTF-8"%>
<b>
  <jsp:doBody/>
</b>

これを使って:

<%@ taglib prefix="h" tagdir="/WEB-INF/tags/bold"%>
<h:bold>Make me bold</h:bold>

サンプルは非常に単純ですが、ここでは多くの複雑なタスクを実行できます。:あなたが(例えば他のタグを使用することができますご検討くださいJSTLこれは次のようにタグを制御しているif/forEcah/chosenテキストなどの操作format/contains/uppercase、あるいはSQLタグselect/update例えば、すべての種類のパラメータを渡す、) Hashmap、アクセスをsessionrequest、...あなたのタグファイルにすぎ。

タグファイルは、JSPファイルのように、変更時にサーバーを再起動する必要がないため、開発が非常に簡単です。これにより、開発が容易になります。

優れたタグがたくさんあるStruts2のようなフレームワークを使用している場合でも、独自のタグを使用するとコードを大幅に削減できる場合があります。タグパラメータを支柱に渡すことができ、この方法でフレームワークタグをカスタマイズできます。

タグを使用して、Javaを回避するだけでなく、HTMLコードを最小限に抑えることもできます。私自身、ページでコードの重複が始まるのを確認したらすぐに、HTMLコードを確認してタグを作成しようとしています。

(JSPコードでJavaを使用することになったとしても、そのコードをタグにカプセル化することができます。)

1
Mehdi 2018-12-02 06:04.
  1. サーブレットクラス内に値とパラメータを作成します
  2. JSTL / Taglibを使用して、JSP内でこれらの値とパラメーターをフェッチします

このアプローチの良いところは、コードもHTMLのようなコードであるということです。

1
Code_Mode 2017-07-08 10:24.

多くの回答が言うように、JSTLを使用するか、独自のカスタムタグを作成します。ここでは、カスタムタグの作成についての良い説明があります。

0
bhanwar rathore 2016-07-15 19:48.

JSTLタグをEL式と一緒に使用することで、これを回避できます。JSPページに次のものを配置します。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

Related questions

MORE COOL STUFF

「水曜日」シーズン1の中心には大きなミステリーがあります

「水曜日」シーズン1の中心には大きなミステリーがあります

Netflixの「水曜日」は、典型的な10代のドラマ以上のものであり、実際、シーズン1にはその中心に大きなミステリーがあります.

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ボディーランゲージの専門家は、州訪問中にカミラ・パーカー・ボウルズが輝くことを可能にした微妙なケイト・ミドルトンの動きを指摘しています

ケイト・ミドルトンは、州の夕食会と州の訪問中にカミラ・パーカー・ボウルズからスポットライトを奪いたくなかった、と専門家は言う.

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンがハリー・スタイルズとオリビア・ワイルドの「非常に友好的な」休憩が永続的であることを望んでいる理由

一部のファンが、オリビア・ワイルドが彼女とハリー・スタイルズとの間の「難しい」が「非常に友好的」な分割を恒久的にすることを望んでいる理由を見つけてください.

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする 

エリザベス女王の死後、ケイト・ミドルトンはまだ「非常に困難な時期」を過ごしている、と王室の専門家が明らかにする&nbsp;

エリザベス女王の死後、ケイト・ミドルトンが舞台裏で「非常に困難な時期」を過ごしていたと伝えられている理由を調べてください.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

Total War:Warhammer:Kotakuレビュー

Total War:Warhammer:Kotakuレビュー

私はこのゲームを嫌う準備ができていました。先週の前に、Total War:Warhammerについての私の考えがありました:それでもここに私は、私の手にある完成品であり、私は変わった男です。

涙の道:軍事化された帝国主義勢力がスタンディングロックキャンプを占領

涙の道:軍事化された帝国主義勢力がスタンディングロックキャンプを占領

スタンディングロックスー族のメンバーと水の保護者は、ノースダコタ州のスタンディングロックにあるオセティサコウィンキャンプを去ります。(Twitter経由のCNNスクリーンショット)火と煙がスカイラインを覆い、スタンディングロックスー族のメンバーと水の保護者が、聖なるものを守りながら建てた家、オセティサコウィン(セブンカウンシルファイアーズ)キャンプから行進し、太鼓を打ち、歌い、祈りました。ダコタアクセスパイプラインとしても知られる「ブラックスネーク」からの土地。

シアーズとKマートはイヴァンカ・トランプの商品を自分たちで取り除いています

シアーズとKマートはイヴァンカ・トランプの商品を自分たちで取り除いています

写真:APシアーズとKマートは、イヴァンカ・トランプのトランプホームアイテムのコレクションも、誰も購入したくないために削除しました。シアーズとKマートの両方の親会社であるシアーズホールディングスは、土曜日のABCニュースへの声明で、彼らが気にかけていると辛抱強く説明しましたトランプラインを売り続けるにはお金を稼ぐことについてあまりにも多く。

ポテトチップスでたった10分でスペインのトルティーヤを作る

ポテトチップスでたった10分でスペインのトルティーヤを作る

伝統的なスペインのトルティーヤは通常、オリーブオイルで柔らかくなるまで調理されたポテトから始まります(30分以上かかる場合があります)が、ケトルで調理されたポテトチップスの助けを借りてわずか10分でテーブルに置くことができます。上のビデオはすべてがバラバラにならないように裏返す方法を含め、レシピ全体を説明しますが、必要なのは4〜5個の卵と3カップのケトルチップスだけです。

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、彼らが子供たちと行っているスパイをテーマにした活動を共有しています

ケイト・ミドルトンとウィリアム王子は、子供向けのパズルの本の序文を書き、ジョージ王子、シャーロット王女、ルイ王子と一緒にテキストを読むと述べた.

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

事故で押しつぶされたスイカは、動物を喜ばせ水分補給するために野生生物保護団体に寄付されました

Yak's Produce は、数十個のつぶれたメロンを野生動物のリハビリ専門家であるレスリー グリーンと彼女のルイジアナ州の救助施設で暮らす 42 匹の動物に寄付しました。

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

デミ・ロヴァートは、新しいミュージシャンのボーイフレンドと「幸せで健康的な関係」にあります: ソース

8 枚目のスタジオ アルバムのリリースに向けて準備を進めているデミ ロヴァートは、「スーパー グレート ガイ」と付き合っている、と情報筋は PEOPLE に確認しています。

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

Plathville の Kim と Olivia Plath が数年ぶりに言葉を交わすことへようこそ

イーサン プラスの誕生日のお祝いは、TLC のウェルカム トゥ プラスビルのシーズン 4 のフィナーレで、戦争中の母親のキム プラスと妻のオリビア プラスを結びつけました。

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

仕事の生産性を高める 8 つのシンプルなホーム オフィスのセットアップのアイデア

ホームオフィスのセットアップ術を極めよう!AppExert の開発者は、家族全員が一緒にいる場合でも、在宅勤務の技術を習得しています。祖父や曽祖父が共同家族で暮らしていた頃の記憶がよみがえりました。

2022 年、私たちのデジタル ライフはどこで終わり、「リアル ライフ」はどこから始まるのでしょうか?

20 年前のタイムトラベラーでさえ、日常生活におけるデジタルおよびインターネットベースのサービスの重要性に驚くことでしょう。MySpace、eBay、Napster などのプラットフォームは、高速化に焦点を合わせた世界がどのようなものになるかを示してくれました。

ニューロマーケティングの秘密科学

ニューロマーケティングの秘密科学

マーケティング担当者が人間の欲望を操作するために使用する、最先端の (気味が悪いと言う人もいます) メソッドを探ります。カートをいっぱいにして 3 桁の領収書を持って店を出る前に、ほんの数点の商品を買いに行ったことはありませんか? あなたは一人じゃない。

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

地理情報システムの日: GIS 開発者として学ぶべき最高の技術スタック

私たちが住んでいる世界を確実に理解するには、データが必要です。ただし、空間参照がない場合、このデータは地理的コンテキストがないと役に立たなくなる可能性があります。

Language