JSP 中 <%%> 和 <%!%>的区别

先来看一道题,猜猜它的输出:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<% int x=5; %>
<%! int x=7; %>
<%! int getX(){return x;}%>
<%=x%><br/>
<%=getX()%>
</body>
</html>

结果是:
在这里插入图片描述


jsp在编译后会被解析成java文件,比如这个test.jsp就会被解析成test_jsp.java,我把关键代码贴出来就一目了然了:

public final class test_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

 int x=7; 
 int getX(){return x;}
 
 /*忽略与这个例子无关的代码*/
 
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {
      
     /*忽略与这个例子无关的代码*/
      
      out.write("\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("    <title>Title</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
 int x=5; 
      out.write('\r');
      out.write('\n');
      out.write('\r');
      out.write('\n');
      out.write('\r');
      out.write('\n');
      out.print(x);
      out.write("<br/>\r\n");
      out.print(getX());
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>\r\n");
      
      /*忽略与这个例子无关的代码*/
      
  }
}

可以看到,值为7xgetX()方法都属于test_jsp类的 成员变量/方法,而值为5x则是_jspService方法的一个临时变量

<%=x%><%=getX()%>都是在_jspService中进行输出,因此这里的x为临时变量x(5),而类方法getX()输出的就当然是类变量x(7)


总结

<%%><%!%>都是JSP的声明脚本,但是由于JSP编译后的页面内容都会写入对应的Java文件的_jspService()(类似于Servletservice())方法中,所以<%%>中声明的变量是_jspService()的临时变量,而<%!%>中声明的变量是Java类的成员变量。因此方法必须写入<%!%>中,因为方法中不能再次定义方法。而输出/调用语句都是在_jspService()方法中,因此输出的变量是取就近原则,调用的方法则是正常调用。


  • <%%>的变量优先输出
  • <%!%>的方法只会涉及<%!%>中的变量,与<%%>没有任何关系

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值