3

デバッグ可能性に関するBalusC の回答を理解しようとしてきましたが、jstl タグがスクリプトレットよりも簡単にデバッグされる方法を正確に把握することはできません。

デバッグについて考えるとき、コードをステップ実行して、任意の時点でどの変数がメモリにロードされているかを判断し、それらの内容を確認する機能について考えます。jstl では、どのような種類のブレークポイントも設定できず、ブレークポイントの一部が壊れると、作業中のフォームの一部が失われます。空白のページか半分しか読み込まれていないページか、どちらが悪いかはわかりません。jstl が失敗したときに、影響する部分だけでなく、フォームのその他の部分が失われる状況を見てきました。どちらの場合でも、問題が何であるかを実際に確認することは不可能です。

スクリプトレットを使用すると、ブレークポイントを配置して、必要なポイントを IDE で確認できます。そのような機能を使用していない場合でも、手順の任意の部分をコンソールに出力して、後で調べることができます。ページが失敗して空白のページが表示された場合は、面倒かもしれませんが、少なくともステップスルーして、失敗した行を正確に見つけることができます。

jstl では、私は完全に暗闇の中にいます。コレクションを反復することは、実際にステップを踏んでそれが起こるのを見ることができるというよりも、すべてがうまくいくことを願うブラックボックスのように感じます. 無力感を感じさせます。

確かに、jstl の方がクリーンで、より直感的に見えますが、私が抱えている 1 つの明白な問題は、ページ上の何もデバッグできないことです。ここで私は完全に間違っていますか?何が起こっているのかをデバッグするための素敵な幸せな方法が欠けているだけですか? または、デバッグへの私のアプローチは正しくなく、再考する必要がありますか?

私はこの問題をグーグルで検索しましたが、直接的な答えを思いつくことができないようです...誰かがこれについて洞察を持っているなら、それは本当に役に立ちます. スクリプトレットの代わりに jstl を使用したいのですが、これが 1 つの明白な原因です。

4

2 に答える 2

1

JSTL タグ自体は、 JSP/EL 仕様およびJSTL ドキュメントに準拠して使用する場合、デバッグする必要はありません。あなたが見つけた答えでは、「デバッグ可能性」は、サーブレット、フィルター、エンティティ、EJBなどのJavaクラスに置き換える必要があるビジネスロジックのJavaコードのコンテキストでのみ意味され、必要なプレゼンテーションロジックのJavaコードではありませんif/elseブロック、forループ、HTML エスケープ、日付/数値の書式設定、文字列操作関数などのJSTL タグに置き換えられます。

ただし、根本原因を明らかに JSTL タグに突き止めた問題に直面した場合は、適切に使用されていればJSTL ドキュメントを読み直してください。次のテンプレートを使用して、関心のある EL 変数のダンプを実行することもできます。

<h2>Request headers</h2>
<dl>
    <c:forEach items="${headerValues}" var="entry">
        <dt><c:out value="${entry.key}" /></dt>
        <dd>
            <c:forEach items="${entry.value}" var="headerValue" varStatus="loop">
                <c:out value="${headerValue}" />${not loop.last ? ', ' : ''}
            </c:forEach>
        </dd>
    </c:forEach>
</dl>

<h2>Request params</h2>
<dl>
    <c:forEach items="${paramValues}" var="entry">
        <dt><c:out value="${entry.key}" /></dt>
        <dd>
            <c:forEach items="${entry.value}" var="paramValue" varStatus="loop">
                <c:out value="${paramValue}" />${not loop.last ? ', ' : ''}
            </c:forEach>
        </dd>
    </c:forEach>
</dl>

<h2>Request scope</h2>
<dl>
    <c:forEach items="${requestScope}" var="entry">
        <dt><c:out value="${entry.key}" /></dt>
        <dd><c:out value="${entry.value}" /></dd>
    </c:forEach>
</dl>

<h2>Session scope</h2>
<dl>
    <c:forEach items="${sessionScope}" var="entry">
        <dt><c:out value="${entry.key}" /></dt>
        <dd><c:out value="${entry.value}" /></dd>
    </c:forEach>
</dl>

<h2>Application scope</h2>
<dl>
    <c:forEach items="${applicationScope}" var="entry">
        <dt><c:out value="${entry.key}" /></dt>
        <dd><c:out value="${entry.value}" /></dd>
    </c:forEach>
</dl>

必要に応じて、アクセス キーを介して開かれ、開発モード中にのみレンダリングされるポップアップ パネルにラップすることができます (Java EE の MVC フレームワーク JSF には、 のフレーバーで非常に類似したものがあります<ui:debug>)。

無駄な場合は、問題を可能な限り最小の JSP ファイルに絞り込み、コピーして貼り付けて実行するだけで問題全体を再現できます (このような例では、必要なビジネス ロジックや、スクリプトレットrequest.setAttribute()行などを入れることができます。 JSP ファイルの最上部に配置されます。このようなプロトタイピングは、スクリプトレットの正当な使用例の 1 つです)。

その SSCCE に基づいてそれでもわからない場合は、Stack Overflow に質問として投稿してください。適切に入力すると、1 日以内に回答が得られる可能性があります。単純なタイプミスや構文/論理エラーに要約されることが多い場合でも、驚かないでください。

于 2013-03-28T16:57:30.207 に答える