質問
私はJavaEEに初めてです、そして私は次の3行のようなものを知っています
<%= x+1 %>
<%= request.getParameter("name") %>
<%! counter++; %>
古い学校のコーディングの方法であり、JSPバージョン2には、JSPファイルのJavaコードを避ける方法が存在します。誰かが代替のJSP 2行を教えてもらえますか?この手法は何と呼ばれていますか?
解決
の用法 スクリプトレット (それらの <% %>
物事) jsp 誕生以来、確かに非常に落胆しています タグリブ (お気に入り JSTL) と エル (表現言語, 、 それらの ${}
物事)2001年に戻って。
の主要な欠点 スクリプトレット それは:
- 再利用性: スクリプトレットを再利用することはできません。
- 交換可能性: Scriptlets Abstractを作成することはできません。
- oo-ability: 継承/構成を利用することはできません。
- デバッグ性: Scriptletが途中で例外をスローする場合、あなたが得るのは空白のページだけです。
- テスト可能性: スクリプトレットはユニットテスト可能ではありません。
- 保守性: SALDOごとに、混ざり合った/乱雑/重複コードロジックを維持するために、より多くの時間が必要です。
太陽 Oracle自体もで推奨しています JSPコーディング規則 の使用を避けるため スクリプトレット (タグ)クラスで同じ機能が可能な場合。関連性のいくつかの引用は次のとおりです。
JSP 1.2仕様から、JSP Standard Tag Library(JSTL)をWebアプリケーションで使用して支援することを強くお勧めします。 JSPスクリプトレットの必要性を減らします あなたのページで。 JSTLを使用するページは、一般に、読みやすくなり、メンテナンスが容易です。
...
可能であれば、 JSPスクリプトレットを避けてください タグライブラリが同等の機能を提供するたびに。これにより、ページが読みやすくなり、プレゼンテーションロジックからビジネスロジックを分離するのに役立ち、ページがJSP 2.0スタイルのページに進化しやすくなります(JSP 2.0仕様はサポートされますが、スクリプトレットの使用を強調しません)。
...
Model-View-Controller(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>
の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}
の エル)、または成功した場合に目的のターゲットページに移動するだけです。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); } }
または、ようなMVCフレームワークを採用するだけです JSF, スプリングMVC, ウィケット, など、カスタムサーブレットを必要とせずにJSP/フェイスレットのページとJavabeanクラスだけになります。
Javaコードを呼び出したい場合 流れを制御します JSPページ内では、(既存の)フロー制御タグリブを取得する必要があります 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>
の フェイスレット, 、JAVA EEの一部であるJSPの後継者がMVCフレームワークを提供しました JSF, 、それはすでにです いいえ 使用することができます スクリプトレット. 。これにより、自動的に「正しい方法」をすることを余儀なくされています。
Javaコードを呼び出したい場合 アクセスと表示 JSPページ内の「バックエンド」データ、次にEL(式言語)を使用する必要があります。
${}
もの。たとえば、送信された入力値の再表示:<input type="text" name="foo" value="${param.foo}" />
${param.foo}
の結果を表示しますrequest.getParameter("foo")
.あなたがいくつかを呼び出したいなら 効用 JSPページのJavaコード(通常)
public static
方法)、次に、それらをEL関数として定義する必要があります。標準があります 機能しますタグリブ JSTLで、しかし また、自分で機能を簡単に作成することもできます. 。これがJSTLの例ですfn:escapeXml
予防するのに役立ちます 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の後継者フェイスレットはすでに暗黙のHTMLが逃げているので、フェイステレットのXSSホールを心配する必要はありません。
参照:
他のヒント
セーフガードとして:スクリプトレットを永久に無効にします
として 別の質問 議論している、あなたはあなたのスクリプトレットを無効にすることができ、そして常に 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>
JSTL 条件、ループ、セット、取得などのタグを提供します。たとえば
<c:if test="${someAttribute == 'something'}">
...
</c:if>
JSTLはリクエスト属性を使用して動作します - ほとんどの場合、これらはサーブレットによってリクエストに設定されます。 フォワード JSPへ。
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>
次のようなコンポーネントベースのフレームワークもあります ウィケット それはあなたのために多くのHTMLを生成します。 HTMLで終わるタグは非常に基本的であり、実質的に混合されるロジックはありません。結果は、典型的なHTML要素を備えたほとんど空のようなHTMLページです。欠点は、に多くのコンポーネントがあることです ウィケット APIを学習し、それらの制約の下でいくつかのことを達成するのは難しい場合があります。
MVCアーキテクチャパターンでは、JSPはビューレイヤーを表します。 JSPSにJavaコードを埋め込むことは、悪い実践と見なされます。使用できます JSTL, Freemarker, 速度 JSPを「テンプレートエンジン」として。それらのタグのデータプロバイダー フレームワークに依存します あなたが扱っていること。 Struts 2
と webwork
MVCパターンの実装として使用されます ognl 「豆の特性をJSPにさらすための非常に興味深いテクニック」。
経験によると、JSPにはいくつかの欠点があり、そのうちの1つはマークアップと実際のコードの混合を避けるのが難しいことが示されています。
可能であれば、必要なことに専門的なテクノロジーを使用することを検討してください。 Java EE 6にはJSF 2.0があります。これは、Java BeansとJSFページを介して接着するなど、多くの素晴らしい機能を提供します。 #{bean.method(argument)}
アプローチ。
JSPでJavaコーディングの欠点を避けたい場合は、Scripletsを使用してもそうすることができます。 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 forwaring 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>
JSTLを使用して独自のタグをカスタマイズして書き込むことを学ぶ
エルはそうです 悪の (ランタイムの例外、リファクタリング)
ウィケットも悪である可能性があります(パフォーマンス、小さなアプリやシンプルなビューティアのために苦労します)
の例 Java2s,
これは、Webアプリケーションのweb.xmlに追加する必要があります
<taglib>
<taglib-uri>/java2s</taglib-uri>
<taglib-location>/WEB-INF/java2s.tld</taglib-location>
</taglib>
ファイルの作成: /web-inf /in the web-inf /
<!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>
Wicketは、JavaをHTMLから完全に分離する代替手段でもあるため、デザイナーとプログラマーは、お互いをほとんど理解しないさまざまなコードセットで協力できます。
ウィケットを見てください。
あなたは良い質問をしました、そしてあなたは良い答えを得ましたが、私はあなたがJSPを取り除くことを提案するでしょう。最終的に死ぬのは時代遅れの技術です。テンプレートエンジンのような最新のアプローチを使用します。ビジネスとプレゼンテーションのレイヤーの非常に明確な分離があり、テンプレート内のJavaコードは確かにありません。そのため、ほとんどの場合、WysiWygを活用するWebプレゼンテーション編集ソフトウェアから直接テンプレートを生成できます。
そして、確かにフィルターとプレおよび後処理を避けてください。そうしないと、変数がどこで値を取得するかわからないため、サポート/デバッグの困難に対処することができます。
JSPファイルでJavaコードを回避するためにJavaがJSTLのようなタグライブラリを提供するようになりました。JavaはJSFを作成し、タグの形ですべてのプログラミング構造を作成できる
どんなに避けようとしても、他の開発者と協力するとき、それらのいくつかはまだScriptletを好み、邪悪なコードをプロジェクトに挿入します。したがって、Scriptletコードを本当に削減したい場合、最初のサインでプロジェクトを設定することは非常に重要です。これを乗り越えるためのいくつかの手法(他の人が言及したいくつかのフレームワークを含む)があります。ただし、純粋なJSPウェイを好む場合は、JSTLタグファイルを使用します。これについての良いところは、プロジェクトのマスターページを設定できることです。他のページはマスターページを継承できることです
次のコンテンツを使用して、web-inf/タグの下に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>
使用するマスターページを指定するために使用されます(この時点でベース.tagです)。タグ内のすべてのコンテンツ <jsp:body>
ここに置き換えます <jsp:doBody/>
マスターページで。子供のページには任意のタグLIBも含めることができ、他の言及されたものと同じように通常使用できます。ただし、ここでスクリプトレットコードを使用する場合(<%= request.getParameter("name") %>
...)そして、このページを実行してみてください、あなたは JasperException because Scripting elements ( <%!, <jsp:declaration, <%=, <jsp:expression, <%, <jsp:scriptlet ) are disallowed here
. 。したがって、他の人がjspファイルに邪悪なコードを含めることができる方法はありません
コントローラーからこのページを呼び出す:
コントローラーからchild.jspファイルを簡単に呼び出すことができます。これは、Strutsフレームワークでもうまく機能します
使用する JSTL Tag libraries
JSPでは、それは完璧に機能します。
JSTLタグとEL式を使用するだけです。
誰かが本当に1つ以上の言語でプログラミングに反対している場合, 、GWTを理論的には、すべてのJSおよびHTML要素を回避できることをお勧めします。GoogleToolkitはすべてのクライアントと共有コードをJSに変換するため、問題が発生しないため、他の言語でコーディングせずにWebサービスがあります。拡張機能(SmartGWTまたはVaadin)で与えられている場合、どこかからデフォルトのCSSを使用できます。数十の注釈を学ぶ必要はありません。
もちろん、必要に応じて、コードの深さに自分自身をハッキングしてJSを注入してHTMLページを濃縮することができますが、必要に応じて避けることができます。私は試してみる価値があると言います、そして、基本的なGWTは十分に文書化されています。
そしてもちろん、多くの仲間のプログラマーは、ここで他のいくつかのソリューションを説明または推奨しています。 GWTは、Webパーツに本当に対処したくない、またはそれを最小化したくない人向けです。
Pythonの世界からのきちんとしたアイデアがあります テンプレート属性言語; TALはZope(したがって、「Zope Page Templates」、ZPT)によって導入され、PHP、XSLT、Javaの実装も標準です(Python/ZopeとPHPの化身を使用しました)。このクラスのテンプレート言語では、上記の例が次のようになります。
<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ネームスペースにいくつかの特別な属性のように見えます。ブラウザで表示し、デザイナーが安全に調整できます。マクロとI18Nのサポートもあります。
<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の実装, 、 けれど。
JSPでスクリプトレットを使用することは、良い習慣ではありません。
代わりに、使用できます。
- JSTLタグ
- エル表現
- カスタムタグ - 使用する独自のタグを定義できます。
参照してください:
確かに、交換してください <%! counter++; %>
イベントプロデューサー - 消費者アーキテクチャにより、ビジネスレイヤーにカウンターを増やす必要性について通知されます。それに応じて反応し、プレゼンターにビューを更新するように通知します。多くのデータベーストランザクションが関与しています。将来的には、カウンターの新しい価値と古い価値を知る必要があるため、それを増やし、どのような目的を念頭に置いているかを知る必要があります。レイヤーは完全に分離されているため、明らかにシリアル化が含まれます。 RMI、IIOP、SOAPを介してカウンターを増やすことができます。ただし、HTMLのみが必要です。これは実装していません。これは、そのような平凡なケースであるためです。あなたの新しい目標は、新しい光沢のあるE7、64GB RAMサーバーで250分の1秒に達することです。
私はプログラミングに20年以上ありますが、ほとんどのプロジェクトは、セクセットの前に失敗します。再利用可能性交換性のデバッグ性のテスト可能性の保守性は必要です。機能を気にかけている人々によって運営されている他のプロジェクトは、非常に成功しました。また、プロジェクトで早すぎる実装された硬いオブジェクト構造により、コードは仕様の劇的な変化(別名アジャイル)に適応できなくなります。
したがって、私は先延ばしとして、プロジェクトの初期または具体的に必要とされていない場合、「レイヤー」または冗長データ構造を定義する活動を考えます。
技術的には、JSPはすべてランタイム中にサーブレットに変換されます. 。 JSPは、MVCパターンに従って、ビジネスロジックと設計ロジックを分離する目的で最初に作成されました。したがって、JSPは技術的にはランタイム中のすべてのJavaコードです。ただし、質問に答えるために、タグライブラリは通常、JSPページにロジック(Javaコードの削除)を適用するために使用されます。
Java Webアプリケーションで次のことを使用すると、JSPの前景からJavaコードを排除できます。
WebアプリケーションにはMVCアーキテクチャを使用します
JSPタグを使用します
a。標準タグ
b。カスタムタグ
表現言語
JSPファイルでJavaコードを避ける方法は?
次のようなタブライブラリタグを使用できます JSTL 表現言語に加えて(エル)。しかし、エルはJSPでうまく機能しません。したがって、JSPを完全にドロップして使用する方がおそらく良いことです フェイスレット.
フェイスレット のために設計された最初の非JSPページ宣言言語です JSF(Java Server Faces) JSPと比較して、JSF開発者によりシンプルで強力なプログラミングモデルを提供しました。 Webアプリケーション開発のためにJSPで発生するさまざまな問題を解決します。
スクリプトレットを使用することは非常に古い方法であり、推奨されません。 JSPページに直接何かを出力したい場合は、使用するだけです 表現言語(EL) 一緒に JSTL .
Velocity、Freemarker、Thymeleafなどのテンプレートエンジンを使用するなど、他のオプションもありますが、ELとJSTLでプレーンJSPを使用することは、ほとんどの場合私の目的に役立ち、初心者にとっても最も簡単なようです。
また、ビューレイヤーでビジネスロジックを実行することはベストプラクティスではないことに注意してください。サービスレイヤーでビジネスロジックを実行し、コントローラーを介して出力結果をビューに渡す必要があります。
それはもう私の友人ではありません。私のアドバイスは、サーバーからビュー(CSS、HTML、JavaScriptなど)を切り離すことです。
私の場合、Angularでビューを処理するシステムを実行し、必要なデータはRESTサービスを使用してサーバーからもたらされます。
私を信じて、これはあなたが設計する方法を変えるでしょう
UI設計にはAngularのようなJavaScriptフレームワークのバックボーンを使用し、REST APIを使用してデータを取得します。これにより、UIからJava依存関係が完全に削除されます。
JSP 2.0には、呼ばれる機能があります 「タグファイル」, 、外部なしでタグを書くことができます java
コードと tld
. 。あなたはaを作成する必要があります .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
, 、 アクセス session
, request
, 、...タグファイルにも。
タグファイル JSPファイルのように、サーバーを変更するときにサーバーを再起動する必要がないため、非常に簡単に開発されています。これにより、開発が簡単になります。
多くの優れたタグがあるStruts 2のようなフレームワークを使用している場合でも、独自のタグを持つことでコードを大幅に削減できることがわかります。タグパラメーターをストラットに渡すことができます。この方法で、フレームワークタグをカスタマイズします。
タグを使用してJavaを回避するだけでなく、HTMLコードを最小限に抑えることもできます。私自身は、コードの複製が私のページで開始されるのを見るとすぐに、HTMLコードを確認し、タグを大きくビルドしようとします。
(JSPコードでJavaを使用することになっても、タグでそのコードをカプセル化できることを願っています)
多くの回答が示すように、JSTLを使用するか、独自のカスタムタグを作成します。 ここ カスタムタグの作成に関する良い説明です
- サーブレットクラス内で値とパラメーターを作成します
- jstl/taglibを使用して、JSP内のこれらの値とパラメーターを取得します
このアプローチの良いところは、コードもHTMLのようなコードであることです!
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" %>