现在已经不提倡在JSP页面中嵌写脚本元素,应尽量多的使用JSTL。
v 脚本元素
共有3类脚本元素
i) 用于要被执行的代码块的小脚本(scriptlet)
ii) 用于要被执行的单个语句的表达式(expression)
iii) 用于声明变量和方法的声明(declaration)
Ø 使用page指令的脚本属性
<%@ page language=”java” import=”java.util.*”%>
ª language属性指定了页面使用的脚本语言,默认是Java
ª 当java做脚本语言时,java.lang.javax.servlet、javax.servlet.jsp和javax.servlet.http程序包
中的类都默认可用于脚本元素。如果你使用的是程序包中除这些类之外的其他类,则可
以用import属性倒入那些类。这样就可以在脚本元素中使用简短的类名。
ª 导入多个程序包
<%@ page import=”java.util.*,com.ora.jsp.util.*”%>
等同于
<%@ page import=”java.util.*”%>
<%@ page import=”com.ora.jsp.util.*”%>
如果没有程序包名,则必须导入具体的类名
<%@ page imort=”MyNoPackageClass”%>
Ø 隐式的JSP脚本对象
脚本元素可以使用预定义的变量,容器会把这些变量作为参考分配给隐式对象
ª JSP隐式对象
变量名 java类型
Application java.servlet.ServletContext 代表应用程序
Config java.servlet.Servletconfig
Exception java.servlet.Throwable 包含了关于运行时错误的信息,只在错误处理页面中可
以得到
Out java.servlet..JspWriter 向应答消息中加入文本
Page java.servlet.Object
pageContext java.servlet.PageContext 提供一些访问其他所有对象和属性的引用
request java.servlet. http.HttpServletRequest 得到关于当前请求的信息
response java.servlet. http.HttpServletResponse 包含了当前应答消息对象的引用
session java.servlet.http.HttpSession 访问服务器管理的客户端的会话数据
Ø 使用小脚本
<%
String userAgent = request.getHeader("User-Agent");
if(userAgent.indexOf("MSIE") != -1)
{%}
mircrosoft IE
<%}
else if(userAgent.indexOf("Mozilla") != -1)
{%>
Netscape"
<%}%>
单独的小脚本并不是有效的Java语句,JSP容器会把小脚本中的代码段和向应答主体中写入的模板文本组合在一起,以形成有效的语句。
Ø 使用表达式
<%=userInfo.getUserName()%>
JSP的表达式元素用来把脚本代码表达式的结果插入到应答中。
需要注意的是:和小脚本中的语句不同,表达式中的代码不必以分号结尾,这是因为在翻译阶段会生成
Out.println(userInfo.getUserName());
Ø使用声明
<!%
Int globalCounter = 0;
%>
建议:不要使用声明元素声明变量,而是应该使用会话作用域和应用程序作用域的对象来保
存全局对象。
原因: ª Jsp页面运行时要被翻译为servlet,Jsp声明元素声明的变量在生成的servlet中作
为实例变量,而不是某个方法的局部变量。
ª 在服务器中每个用户被赋予一个线程,每个线程都执行JSP对象中的同一个方
法,当有多个用户访问Jsp声明元素声明的变量时就会出现线程安区问题,所有的
用户都共享这个实例变量,如果一个线程改变了它的值,那么所有的用户都可以看
到新的值,并都使用这个新的值。
Public class SomeClass
{
//实例变量:在所有方法体外声明的变量,值可以在类中的任何一个方法中访问。
//当有方法对其进行了设定,方法返回后,其值仍然保持不变
Private String anInstanceVariable;
Public void doSomething()
{
//局部变量:只能从声明它的那个方法访问,当这个方法返回时,局部变量就消
//失了
String aLocalVariable;
}
}
ª 当你在小脚本中,而不是在JSP声明块中声明一个变量时,在生成servlet的请求处
理方法中,该变量将被处理成一个局部变量,每个线程都会有它自己的局部变量副
本,所以当有多个线程执行同一代码时,局部变量不会造成任何问题。如果某个局
部变量的值被改变了,也不会影响到其他的线程。
ª 用JSP声明元素声明一个方法不会造成线程安全问题,但使得JSP页面包含了太多
的代码,使得应用程序的维护极为困难,因此也应该尽量避免使用,建议使用
JavaBeans和自定义行为。
v 处理脚本语法错误
使用脚本元素时,必须准备好处理一种新的语法错误。脚本代码几乎是原封不动地插入到servlet代码中,而servlet代码是在翻译阶段根据JSP页面生成的,因此,脚本元素中的语法错误会导致编译程序无法灵敏的报告错误。脚本元素中的语法错误在读取JSP页面时不会被发现,但在编译生成的servlet时会发现这些错误,编译器根据其在生成servlet代码中的位置(而不是JSP页面中的位置)来报告错误,但这种错误信息对JSP页面设计师来说不总是有意义。
指令和行为元素则没有这个问题,容器读取JSP页面,并通过生成适当的结果代码来替换所有的JSP指令和行为元素,容器需要详细的分析这些元素的类型,容器可以轻易的指出那个元素不正确,所以在替换过程中发生的错误,容器能比较准确的报告错误原因和位置。
报告脚本语法错误会出现误导性和令人困惑的出错消息,而且这种问题很难得到圆满的解决。因为当脚本代码和其他生成代码混合在一起的时候,容器很难查明真正的问题,所以尽量避免使用脚本代码。