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

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

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

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

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

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

グッドジョブ、ESPN

グッドジョブ、ESPN

今日のホワイトハウスの記者会見で、報道官のサラ・ハッカビー・サンダースは、スポーツセンターのホストであるイェメル・ヒルのドナルド・トランプに関する最近のツイートについてコメントするよう求められ、大統領と彼の政策を白人至上主義者として説明した。ヒルは彼女のつぶやきのためにESPNによって公に叱責されました。

アマゾンからのこのレミントンツールセールで髪を整える、スタイルを整える、乾かす、または取り除く

アマゾンからのこのレミントンツールセールで髪を整える、スタイルを整える、乾かす、または取り除く

基本的に頭のあらゆる部分から髪の毛を整えたり、ブロードライしたり、まっすぐにしたり、脱毛したりする必要がある場合は、このレミントンゴールドボックスが最適です。今日だけ、Amazonは、すでに人気のあるShortcut Pro Self-HaircutKitやPearlPro Ceramic Flat Ironのように、グルーミングをはるかに簡単にするヘアツールをマークダウンしています。

カナダの元桂冠詩人が、史上最高の文化の盗用でトゥパックとマヤアンジェロウから盗んだ

カナダの元桂冠詩人が、史上最高の文化の盗用でトゥパックとマヤアンジェロウから盗んだ

トゥパックシャクール(ティムモーゼンフェルダー/ゲッティイメージズ); マヤアンジェロウ(マーティンゴッドウィン/ゲッティイメージズ)移動、テイラースウィフト。ケンドールとカイリーは、必要な数の座席を持っています。

テスラは、ハリケーンイルマによる避難を容易にするために、フロリダでの車両の範囲を拡大しています

テスラは、ハリケーンイルマによる避難を容易にするために、フロリダでの車両の範囲を拡大しています

写真:Tesla Motorsフロリダに住んでいて、Tesla Model S、Model X 60、またはModel 60Dを使用している場合、車の自律性は50 km(約30マイル)高くなります。これは失敗ではなく、ハリケーンイルマによる避難作業を容易にするために会社自身が命じた自治権の一時的な延長です。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language