39

JSP技術を学び始めたばかりで、壁にぶつかりました。

<%! のメソッドから HTML をどのように出力しますか? ... %> JSP 宣言ブロック?

これは機能しません:

<%! 
void someOutput() {
    out.println("Some Output");
}
%>
...
<% someOutput(); %>

サーバーは、「アウト」はないと言っています。

U:文字列を返すこのメソッドでコードを書き直す方法は知っていますが、<%! 内でこれを行う方法はありますか? ボイド () { } %> ? 最適ではないかもしれませんが、それでも興味深いものです。

4

8 に答える 8

33

ディレクティブ内で「out」変数 (および他の「事前宣言された」スクリプトレット変数) を使用することはできません。

JSP ページは、Web サーバーによって Java サーブレットに変換されます。たとえば、Tomcat の内部では、すべての静的 HTML とともに、スクリプトレット (「<%」で始まる) 内のすべてが、「out」と呼ばれる JspWriter インスタンスに行ごとにページを書き込む 1 つの巨大な Java メソッドに変換されます。これが、スクリプトレットで「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";
    }
}
于 2008-09-26T12:09:28.870 に答える
14
<%!
private void myFunc(String Bits, javax.servlet.jsp.JspWriter myOut)
{  
  try{ myOut.println("<div>"+Bits+"</div>"); } 
  catch(Exception eek) { }
}
%>
...
<%
  myFunc("more difficult than it should be",out);
%>

これを試してみてください、それは私のために働いた!

于 2012-06-12T12:17:25.423 に答える
11

私はこれが役立つと思います:

<%! 
   String someOutput() {
     return "Some Output";
  }
%>
...
<%= someOutput() %>

とにかく、ビューにコードを含めるのは良い考えではありません。

于 2008-09-26T12:19:05.727 に答える
10

あなたがする必要があるのは、パラメータとしてJspWriterオブジェクトをメソッドに渡すことです。

void someOutput(JspWriter stream)

次に、次の方法で呼び出します。

<% someOutput(out) %>

ライターオブジェクトは_jspService内のローカル変数であるため、ユーティリティメソッドに渡す必要があります。同じことが他のすべての組み込み参照(要求、応答、セッションなど)にも当てはまります。

何が起こっているかを確認するための優れた方法は、Tomcatをサーバーとして使用し、「jsp」ページから生成された「.java」ファイルの「work」ディレクトリにドリルダウンすることです。または、weblogicでは、「weblogic.jspc」ページコンパイラを使用して、ページが要求されたときに生成されるJavaを表示できます。

于 2008-09-26T16:57:05.697 に答える
3

次のようなことができます。

<%!
String myMethod(String input) {
    return "test " + input;
}
%>

<%= myMethod("1 2 3") %>

これにより、ページに出力test 1 2 3されます。

于 2014-03-03T23:17:04.603 に答える
2

それに答えるには遅すぎるが、これは他の人を助ける

<%! 
     public void printChild(Categories cat, HttpServletResponse res ){
       try{
          if(cat.getCategoriesSet().size() >0){
              res.getWriter().write("") ; 
          }
       }catch(Exception exp){

       }
     }

%>
于 2015-08-28T04:24:02.390 に答える
-1

次のようなことができます。

<%

out.print("<p>Hey!</p>");    
out.print("<p>How are you?</p>");

%>
于 2013-07-15T19:06:53.523 に答える