1736

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

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

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

4

31 に答える 31

2005

2001年にtaglibsJSTLなど)やEL式言語など)が誕生して以来、 JSPでスクリプトレット(これらのもの<% %>)を使用することは実際には非常に推奨されていません。${}

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

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

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.
          }
      }
    

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


  • GETリクエストを処理するために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アクセスが例外をスローするたびに、応答を変更する可能性があります。<error-page>上記の例では、デフォルトのエラー500ページが表示されますが、とにかくinでカスタマイズできますweb.xml


  • 送信されたHTMLフォームからデータを収集し、それを使用してビジネス処理(変換、検証、DBへの保存など)を行うなど、POSTリクエストを処理するために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.
          }
      }
    

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


  • 実行プランや要求と応答の宛先を制御するために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);
          }
      }
    

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


  • いくつかのJavaコードを呼び出してJSPページ内のフローを制御する場合は、JSTLコアのような(既存の)フロー制御taglibを取得する必要があります。例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>
    

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


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

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

    ${param.foo}結果が表示されますrequest.getParameter("foo")


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

      <%@ 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ホールについて心配する必要はありません。

参照:

于 2010-07-05T14:19:35.120 に答える
229

安全策として:スクリプトレットを永久に無効にする

別の質問で議論されているように、 web.xmlWebアプリケーション記述子でスクリプトレットを無効にすることができます。

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

<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
     <scripting-invalid>true</scripting-invalid>
  </jsp-property-group>
</jsp-config>
于 2011-08-14T21:59:10.597 に答える
109

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

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

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

于 2010-07-05T07:28:47.983 に答える
54

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>
于 2010-07-05T08:45:54.933 に答える
34

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

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

于 2011-03-22T18:24:53.407 に答える
33

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

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

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

于 2011-02-04T10:41:38.837 に答える
27

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

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

于 2010-07-05T08:30:06.097 に答える
27

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>
于 2012-05-11T16:45:52.760 に答える
26

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>
于 2011-08-17T20:02:58.747 に答える
25

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

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

于 2011-05-20T20:42:34.617 に答える
23

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

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

于 2011-07-12T20:20:17.437 に答える
20

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

また、Javaは、すべてのプログラミング構造をタグの形式で記述できるJSFを考案しました。

于 2011-02-23T06:14:50.880 に答える
20

どれだけ避けようとしても、他の開発者と協力する場合、一部の開発者はスクリプトレットを好み、プロジェクトに邪悪なコードを挿入します。したがって、スクリプトレットコードを本当に削減したい場合は、最初のサインでプロジェクトを設定することが非常に重要です。これを克服するためのいくつかのテクニックがあります(他の人が言及したいくつかのフレームワークを含む)。ただし、純粋な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フレームワークでもうまく機能します

于 2013-01-26T18:07:56.160 に答える
18

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

于 2011-06-05T04:23:50.763 に答える
17

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

于 2011-07-11T06:59:59.267 に答える
17

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

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

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

于 2013-01-21T16:04:32.957 に答える
16

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の実装についてはよくわかりません。

于 2012-05-21T07:51:33.883 に答える
15

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

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

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

参照してください:

  1. http://docs.oracle.com/javaee/1.4/tutorial/doc/JSTL3.html
  2. EL
于 2013-07-22T05:59:20.137 に答える
14

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

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

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

于 2014-03-15T17:17:18.900 に答える
11

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

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

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

于 2013-06-14T09:31:31.143 に答える
9

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

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

  2. JSPタグを使用する

a。標準タグ

b。カスタムタグ

  1. 表現言語
于 2012-04-02T13:52:04.100 に答える
8

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

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

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

ここに画像の説明を入力してください

ソース

于 2015-12-24T11:47:27.400 に答える
4

スクリプトレットの使用は非常に古い方法であり、お勧めしません。JSPページに何かを直接出力したい場合は、 JSTL と一緒にExpression Language(EL)を使用してください。

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

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

于 2017-11-30T15:59:33.900 に答える
3

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な制御タグやSQLタグなど)を使用して、タグファイルにaccess 、、...などのすべての種類のパラメータを渡すことができることを考慮してください。if/forEcah/chosenformat/contains/uppercaseselect/updateHashmapsessionrequest

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

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

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

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

于 2016-04-12T14:55:51.180 に答える
3

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

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

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

于 2017-12-12T19:45:33.780 に答える
3

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

于 2018-06-20T13:49:13.940 に答える
1

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

于 2017-07-07T20:24:49.520 に答える
1
  1. サーブレットクラス内に値とパラメータを作成します
  2. JSTL / Taglibを使用して、JSP内でこれらの値とパラメーターを取得します

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

于 2018-12-01T16:04:09.383 に答える
1

ここでの答えの多くは、「フレームワークを使用する」ルートです。それには間違いはありません。ただし、フレームワークはJSPを使用する場合と使用しない場合があり、JSPでのJavaの使用を主な目標として削除するように設計されていないため、実際にはあなたの質問に答えるとは思いません。

「JSPでJavaを使用しないようにするにはどうすればよいですか」という質問に対する唯一の良い答えは、できません。

それがJSPの目的です。Javaを使用して動的データ/ロジックでHTMLをレンダリングします。フォローアップの質問は、JSPでどのくらいのJavaを使用する必要があるかということかもしれません。
その質問に答える前に、「Javaを使用してWebコンテンツを構築するためにJSPを使用する必要がありますか?」についても熟考する必要があります。その最後の答えは、いいえです。Javaを使用してWeb向けアプリケーションを開発するには、JSPに代わる多くの方法があります。たとえば、StrutsはJSPの使用を強制しません。誤解しないでください。Strutsを使用でき、多くの実装で使用できますが、絶対に使用する必要はありません。Strutsは、HTMLの使用を強制することさえありません。JSPもそうではありませんが、正直なところ、HTMLを生成しないJSPはちょっと奇妙です。サーブレットは、有名なことに、HTTPを介して好きな種類のコンテンツを動的に提供できるようにします。これらはほとんどすべてのJavaWebの背後にある主要な技術です。JSPは実際にはサーブレット用の単なるHTMLテンプレートです。
したがって、JSPに配置する必要のあるJavaの量に対する答えは、「可能な限り少ない」です。もちろん、JSPにはJavaが含まれていますが、これは、タグライブラリ定義、セッション変数とクライアント変数、およびサーバー側オブジェクトをカプセル化するBeanのみで構成されています。私のHTMLの<%%>タグは、ほとんどがプロパティ呼び出しまたは変数式です。まれな例外には、単一ページに関連する非常に特殊な計算が含まれ、再利用される可能性はほとんどありません。1つのページにのみ適用されるページ固有の問題に起因するバグ修正。範囲が単一ページに制限されている異常な要件に起因する直前の連結と算術。および他の同様のケース。150万行、3000のJSP、5000のクラスのコードセットには、このような一意のスニペットのインスタンスが100個ある可能性があります。クラスやタグライブラリの定義にこれらの変更を加えることはかなり可能でしたが、それぞれのケースの特異性のために非常に複雑であり、書き込みとデバッグに時間がかかり、結果として私のところに到達するまでに時間がかかりました。ユーザー。それは判断の呼びかけです。しかし、間違いなく、「Javaなし」で意味のあるJSPを書くことはできません。この機能には理由があります。

于 2020-08-28T00:03:41.937 に答える
1

Java自体は非常に優れた言語ですが、エンタープライズ環境で頻繁に使用されるため、標準ソリューションは非常に(ばかげて)困難になりました。例:JSTL、JSF、Wicketなど。

Javaでバックエンドを作成するための超軽量のアプローチは次のとおりです。

  • JSP(またはその他のテンプレートエンジン)はまったく使用しないでください。
  • プレーンなHTMLテンプレートを使用します。
  • JSOUPを使用して、HTMLテンプレートをDocumentオブジェクトに解析します。
  • メソッドのような非常に直感的なjQueryを使用してDocumentオブジェクトを変更します。
  • リクエストへの応答としてDocument.toString()を返します。

私はサイドプロジェクトの1つ(ホストされているDigitalocean $ 5ドロップレット、Nginx、Tomcat)に使用しており、非常に高速です。Googlebotによると、平均応答時間は約160ミリ秒です。

于 2022-01-22T19:17:20.633 に答える
0

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" %>
于 2016-07-15T05:48:33.953 に答える