如何从JSP <%输出HTML! ...%>阻止?

时间:2020-03-06 14:46:46  来源:igfitidea点击:

我刚刚开始学习JSP技术,并且碰壁。

我们如何从<%中的方法输出HTML! ...%> JSP声明块?

这不起作用:

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

服务器说没有问题。

U:我确实知道如何使用此方法返回字符串来重写代码,但是有一种方法可以在<%之内! void(){}%>吗?尽管它可能不是最佳选择,但它仍然很有趣。

解决方案

我们不能在指令内部使用'out'变量(也不能使用其他任何"预先声明的" scriptlet变量)。

Web服务器将JSP页面转换为Java servlet。例如,在tomcat内部,scriptlet(以" <%"开头)中的所有内容以及所有静态HTML都被翻译成一个巨型Java方法,该方法逐行地将页面写入名为" out"的JspWriter实例。这就是为什么我们可以直接在scriptlet中使用" 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";
    }
}

我想这会有所帮助:

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

无论如何,在视图中包含代码不是一个好主意。

我们需要做的就是将JspWriter对象作为参数传递给方法,即

void someOutput(JspWriter stream)

然后通过以下方式调用:

<% someOutput(out) %>

writer对象是_jspService内部的局部变量,因此我们需要将其传递到实用程序方法中。对于所有其他内置引用(例如,请求,响应,会话),同样适用。

查看发生了什么的一个很好的方法是使用Tomcat作为服务器,并深入到从" jsp"页面生成的" .java"文件的"工作"目录。另外,在weblogic中,我们可以使用" weblogic.jspc"页面编译器来查看请求页面时将生成的Java。