如何从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。