首先,我们要了解jsp运行原理。JSP的本质就是一个Servlet,JSP的运行之前会先被Tomcat服务器翻译为.java文件,然后在将.java文本编译
为.class文件,而我们在访问jsp时,处理请求的就是那个翻译后的类。
- <% %>叫做
脚本片段
,其中写的内容会翻译在Servlet的Service方法中,显然我们可以在Service方法中定义局部变量或者调用其他方法. - <%!%>称作
声明
,其中写的内容将来会直接翻译在Servlet类中,因为我们可以在类中定义方法
和属性
以及全局变量
,所以我们可以在<%!%>中声
明方法、属性、全局变量。 - <%=%>称作
jsp表达式
,用于将已经声明的变量或者表达式输出到网页上面。
总结
- 因为JSP中的变量与内置对象的代码都写在在Service中(脚本片段),而与用来定义方法与全局变量(声明)相关的代码都写在Servlet里面,也就是与Service是同级的,因此在<%! %>中是不能调用内置对象的,比如application,response,request等。
- 如果想在<%! %>中使用application对象可以利用ServletContext来间接获取applicaiton中的属性。顺便在这里提一下ServletContext与applicaiton的关系与区别。
ServletContext applicaiton = getSerVletContext();
ServletContext与applicaiton的关系与区别。
- servletcontext主要用在servlet中,当然也可以在jsp中使用;
- application只在jsp页面中使用;
- application和servletcontext都保存容器的全局信息;
- application是对servletcontext在jsp中应用的包装,因此它们其实表示的是同一个对象,用application保存的属性可以用servletcontext来读取,反之亦同;
- 在jsp中可以直接使用application,也可以用getServletContext()方法来获得servletcontext对象,此对象的使用和application完全一样;
不懂之处:
在<%! %>中不能使用applicaiton,却可以使用ServletContext。