JSPの技術を学び始めたばかりで、壁にぶつかった。
*JSPの宣言ブロックの中にあるメソッドからHTMLを出力するにはどうすればよいですか?... %> JSP宣言ブロックのメソッドからHTMLを出力するには?
これではダメだ'。
<%!
void someOutput() {
out.println("Some Output");
}
%>
...
<% someOutput(); %>
サーバーによると、“out”はないそうです。
U:このメソッドが文字列を返すようにコードを書き換える方法は知っていますが、これを <%! void () { } の中で行う方法はあるのでしょうか?(´・ω・`)?最適とは言えないかもしれませんが、それでも面白いです。
ディレクティブの内部では、変数 'out' (および他のスクリプトレット変数 "predeclared") を使用することはできません。
JSPページは、ウェブサーバーによってJavaサーブレットに変換されます。例えば、tomcatsの内部では、スクリプトレット("<%"で始まる)の中のすべてが、すべての静的HTMLとともに、1つの巨大なJavaメソッドに変換され、行ごとにページを"out"というJspWriterインスタンスに書き込む。これが、スクリプトレットで "out" パラメータを直接使用できる理由です。一方、ディレクティブ("<%!"で始まる)は、別のJavaメソッドとして変換されます。
例として、非常にシンプルなページ(foo.jspとしましょう)を紹介します。
<html>
<head/>
<body>
<%!
String someOutput() {
return "Some output";
}
%>
<% someOutput(); %>
</body>
</html>
は、最終的にこのような形になります(わかりやすくするため、細かい部分は無視しています)。
public final class foo_jsp
{
// This is where the request comes in
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
// JspWriter instance is gotten from a factory
// This is why you can use 'out' directly in scriptlets
JspWriter out = ...;
// Snip
out.write("<html>");
out.write("<head/>");
out.write("<body>");
out.write(someOutput()); // i.e. write the results of the method call
out.write("</body>");
out.write("</html>");
}
// Directive gets translated as separate method - note
// there is no 'out' variable declared in scope
private String someOutput()
{
return "Some output";
}
}
JspWriterオブジェクトをパラメータとしてメソッドに渡すだけでよいのです。
void someOutput(JspWriter stream)
では、経由とします。
<% someOutput(out) %>
ライターオブジェクトは_jspService内のローカル変数なので、それをユーティリティメソッドに渡す必要があります。同じことが、他のすべてのビルトイン参照(例:リクエスト、レスポンス、セッション)にも適用されます。
Tomcatをサーバーとして使用し、 'work'ディレクトリを掘り下げて、 'jsp'ページから生成された '.java' ファイルを確認するのが、何が起こっているかを確認する良い方法となります。また、weblogicでは、 'weblogic.jspc' ページコンパイラを使用して、ページが要求されたときに生成されるJavaを見ることができます。