<p>I just started learning JSP technology, and came across a wall.</p>

<p><em>How do you output HTML from a method in &lt;%! ... %> JSP declaration block?</em></p>

<p>This doesn't work:</p>

<pre><code>&lt;%! 
void someOutput() {
    out.println("Some Output");
}
%&gt;
...
&lt;% someOutput(); %&gt;
</code></pre>

<p>Server says there's no &ldquo;out&rdquo;.</p>

<p><strong>U:</strong> I do know how to rewrite code with this method returning a string, but is there a way to do this inside &lt;%! void () {  } %> ? Though it may be non-optimal, it's still interesting.</p>

You can't use the 'out' variable (nor any of the other "predeclared" scriptlet variables) inside directives.
The JSP page gets translated by your webserver into a Java servlet. Inside tomcats, for instance, everything inside scriptlets (which start "<%"), along with all the static HTML, gets translated into one giant Java method which writes your page, line by line, to a JspWriter instance called "out". This is why you can use the "out" parameter directly in scriptlets. Directives, on the other hand (which start with "<%!") get translated as separate Java methods.
As an example, a very simple page (let's call it foo.jsp):
```
```
<html>
    <head/>
    <body>
        <%!
            String someOutput() {
                return "Some output";
            }
        %>
        <% someOutput(); %>
    </body>
</html>
```
```
would end up looking something like this (with a lot of the detail ignored for clarity):
```
```
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";
    }
}
```
```