この質問 でブラウスCの驚くべき答えのいくつかの点を誰かに説明して欲しい。
彼は、スクリプトレットには次のようないくつかの欠点があると述べました。
再利用性:スクリプトレットを再利用することはできません。私の質問:JSTLコードをどのように再利用できますか?
置き換え可能性:スクリプトレットを抽象化することはできません。アブストラクトとはどういう意味ですか?
OO:継承/合成を利用することはできません。 JSTLでOOパラダイムをどのように使用できますか?
デバッグ:スクリプトレットが途中で例外をスローした場合、得られるのは空白ページだけです。
テスト容易性:スクリプトレットは単体テストできません。それはどういう意味ですか、JSTLはどのように単体テストできますか?
保守性:サルドごとに、混合/雑然とした/重複したコードロジックを維持するためにより多くの時間が必要です。これは何を意味するのでしょうか?
最後に、彼がOracleの推奨事項から引用したものです。
JSPスクリプトレットは、ビジネスロジックの記述には使用しないでください。
MVCパターンでは、プレゼンテーション層でのみスクリプトレットを使用します。ここで彼はどういう意味ですか?
if
、for
およびswitch
ステートメントとout.print()
などを使用する場合と同様に、スクリプトレットのプレゼンテーションとフロー制御部分のみに集中しているようです。スクリプトレットを1:1とJSTLで比較しているようです。これは間違っています。私はフロー制御部分(実際にJSTLに置き換えられる)だけを話しているのではなく、Raw Javaコードを一般的に書き込むことについて話していました。リクエストパラメータの収集、検証、変換値、データベースやその他の相互作用Javaクラス/メソッドなど)。サーブレットまたはフィルタで通常(間接的に)行うすべてのこと。
not JSPにスクリプトレットコードを含める必要があります。 100%JSTLとゼロスクリプトレットコードをお勧めします。
JSPは純粋にプレゼンテーションでなければなりません。これは、JSTLのみを使用してJSPを作成することの隠れた利点です。なぜなら、動的データはすべて別の場所で取得されるためです。サービス層にビジネスロジックを持たせ、JSPが必要とするデータを決定します。
これはあなたのユニットテストの質問にも答えます。 JSPを単体テストする必要はありません。それらはSeleniumのようなUIテストになります。ロジックがサービス層にある場合、それをテストする方法は明らかです。
JSPは継承しないでください。もちろん、SiteMeshなどを使用してそれらを一緒に構成することもできますが、継承はJSPには関係ありません。サーブレットから継承したら、チェーンを終了する必要があります。
その上、それは誤った代替手段です。どちらも、再利用、継承、ユニットテストを必要としません。しかし、それは明確な勝者がいないという意味ではありません。それはJSTLです。非常にまれなワンライナーを除いて、JSPでスクリプトレットを使用するべきではありません。スクリプトレットは問題を求めています。
最近では、JSPよりも、JavaのWeb UIテンプレートソリューションとしてVelocityを好みます。ただ私の意見です。
私はBalusCについて話すことはできませんが、一般的に私は彼がこれらの種類のことはあなたの通常のJavaコード(全体のMVCに戻ります)。
個々のレベルでJSPタグを文字通り再利用することはできませんが、それらが呼び出すクラスを再利用することはできます。
JSTLを抽象化することはできませんが、通常のJavaコード(おそらくJSTLから呼び出すことができます))は抽象化できます。
繰り返しになりますが、jstlではオブジェクトを有効に作成できませんが、呼び出されるすべてのクラスでは作成できます。
JSTL自体は単体テストできません。しかし、それを介して呼び出すクラスとメソッドはそうです。
使用しているパターンによって異なります。 [〜#〜] mvc [〜#〜](spring、struts、...)純粋なXHTMLタグを含むビューを表すため、JSPでのスクリプトレットの使用は避けてください。 [〜#〜] jstl [〜#〜] はある種のXMLである宣言型言語ですが、スクリプトレットはそうではありません。
特に、JSTLをAJAXと組み合わせて prototype を使用して、別のパターンを実装する必要なくRIAを生成しました。最近、このようなプログラミングを ExtJS および [〜#〜] dwr [〜#〜] で見ました。私の場合、可能な場合は常にJSTLを優先するJSTLとスクリプトレットの両方を組み合わせる必要があることがわかりました。
<!-- simple controller, each action is called by means of AJAX -->
<% String signExt="jpg"; %>
<% int r=0, iMaxRows=0, iMaxCols=0;%>
<c:choose>
<c:when test="${param.action == 'get_chrequest_profile_table_by_family_and_date'}">
<sql:query var="dataset">
CALL GetProfilesView('<c:out value="${param.family_name}" />', '<c:out value="${param.reg_date}" />')
</sql:query>
<c:set var="strElements"><c:out value="${dataset.rowCount}" /></c:set>
<%
String strElements = pageContext.getAttribute("strElements").toString();
int iElements = (int)Integer.valueOf(strElements).intValue();
String to = "";
%>
<table class="tb_profiles" id="tb_profiles" iElements="<%=iElements%>"
width="100%" frame=void border="0" cellPadding="0" cellSpacing="0" style="border-top: 3px solid gray; border-left: 1px solid gray">
<%for(int i=1, j=0, col=0; i<100; i++){%>
<tr>
<%for(j=0; j<4; j++, col++){%>
<c:set var="c" scope="page"><%=col%></c:set>
<td name='<c:out value="${dataset.rows[c].chreqprofile_id}" />' >
<table width="100%" frame="below" cellPadding="0" cellSpacing="0"style="border-right: 1px solid gray;">
<%if( col < iElements){%>
<tr style="height:10mm">
<td class="td_function" style="cursor:default;">
<c:out value="${dataset.rows[c].description}" />
</td>
</tr>
.................
<tr style="height:14mm">
<td class="td_signature" align="center" vAlign="middle">
<img class="img_signature"
src='../xdata/signatures/<c:out value="${dataset.rows[c].responsible_name}"/>.<%=signExt%>'
alt='<c:out value="${dataset.rows[c].email}" />'
/>
</td>
</tr>
.................
<c:set var="sMail"><c:out value="${dataset.rows[c].email}"/></c:set>
<% if( col < iElements-1){
to = to + pageContext.getAttribute("sMail").toString() + ",";
}else{
to = to + pageContext.getAttribute("sMail").toString();
}
%>
<%}else{%>
<tr style="height:10mm">
<td class="td_function" style="cursor:default;">x</td>
.............
</tr>
<%}%>
</table>
</td>
<%}%>
</tr>
<%
if( col >= iElements){break;}
}%>
</table>
<span id="span_mail_to" style="display:none;"><%=to%></span>
</c:when>
<c:when test="${param.action == 'functions_form_insert'}">
.............
</c:when>
</c:choose>
設計パターンに従っている場合、スクリプトレットが特に悪いとは思いません。私は春のMVCに多く取り組んでおり、JSPでモデルデータをスクリプトライトで取得するだけです。シンプルなJava HTMLのコード。JSTLよりも自由度が高いと感じています。
次の表は、どこかで誰かに役立つ可能性のあるJSPとFaceletsを比較したものです。