web-dev-qa-db-ja.com

JSPからHTMLを出力する方法<%! ...%>ブロック?

私はJSPテクノロジーを学び始めたばかりで、壁にぶつかりました。

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

これは機能しません:

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

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

文字列を返すこのメソッドでコードを書き換える方法は知っていますが、これを<%内で行う方法はあります! void(){}%>?最適ではないかもしれませんが、それでも面白いです。

35
ansgri

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

JSPページはWebサーバーによってJavaサーブレットに変換されます。たとえば、Tomcat内では、スクリプトレット(「<%」で始まる)内のすべてが、すべての静的HTMLとともに、 1つの巨大なJavaメソッドは、「out」と呼ばれるJspWriterインスタンスにページを1行ずつ書き込む。これが、スクリプトレットで「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";
    }
}
29
Ashley Mercer
<%!
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);
%>

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

13
Dave

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

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

とにかく、ビューにコードを含めることは得策ではありません。

9
paradoja

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

void someOutput(JspWriter stream)

次に、それを経由して呼び出します:

<% someOutput(out) %>

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

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

9
Garth Gilmour

簡単な代替手段は次のとおりです。

<%!
    String myVariable = "Test";
    pageContext.setAttribute("myVariable", myVariable);
%>

<c:out value="myVariable"/>
<h1>${myVariable}</h1>

Jspコード内で任意の方法で変数を単純に使用できます

6
Jer Yango

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

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

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

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

3
Martin Carney

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

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

       }
     }

%>
1
Alaa Abuzaghleh