jsp脚本元素

元素与模板数据

JSP页面内容可以分为两种类型,一种是能够被容器识别的标记单元,
如<%out.println(“hello”);%>,它要求容器在翻译时要进行特殊的处理,称这类标记单元为元素(elements);
另外一种就是类似“<html>”这样的,对容器没有特殊意义的内容,叫做模板数据(Template Data)
在JSP页面中,共有3种类型的元素,
即指示元素(Directive Elements)、行为元素(Action Elements)和脚本元素(Scripting Elements)

脚本元素

脚本元素的作用就是在JSP页面中嵌入脚本语言代码,向容器声明要将什么样的Java语句添加到servlet类中
JSP的脚本语言是Java
脚本元素分为3种类型:
1声明
2表达式
3脚本片断(scriptlet)

在把JSP页面翻译成页面servlet的时候,根据脚本元素的不同类型,它们在页面servlet中的位置是不同的。
下面的代码说明了这个位置情况:
public class JspPageServlet extends HttpJspBase{
//声明被插入在这个地方

public void _jspService(…)…{
//表达式和脚本片断被插入在这个地方
}
}


声明    

语法:
<%!   Java声明语句   %>
说明:
声明用来定义实例变量、类变量以及自定义方法。这些实例变量、类变量和方法在整个JSP页面的任何地方都可以访问
可以在一对声明标记中嵌入多条声明语句,语句与语句之间用分号隔开。例如:
<%! float farenheit=32.0; String tempScale=“F”; %>
声明并不产生可见的输出,它们经常与表达式和脚本片断结合使用

再看一个声明的例子:
<%! static private int hitCount=1;
          static private Data start=new Date();
          private int getHitCount(){
return hitCount++;
}
%>
分析
hitCount和start变量被声明为static。在典型的servlet环境下,实例变量和类变量的作用是一样的,可以互换。这是由于:
按照规范要求,JSP容器只能创建不实现SingleThreadModel接口的任何servlet的一个实例。因此,
由于所有的请求由同一个servlet实例处理,所以类变量和实例变量的作用是相同的


接上页)但是,当servlet实现了SingleThreadModel接口的时候,JSP容器会创建一个servlet实例池来为并行的请求服务。
在JSP中,当JSP页面中包含<%@ page isThreadSafe=“false” %>时,这种情况就会出现。因此,
为了确保hitCount和start变量能跨所有类实例被共享,必须要使用static

声明标记的另一个重要作用是重写两个JSP生存期方法。和servlet类似,JSP定义了两个具有生存期的方法:jspInit()和 jspDestory()。当页面servlet被实例化时,但在它处理第一个请求之前,JSP容器调用jspInit()方法。在页面servlet被 卸载之前, JSP容器调用jspDestory()方法
如下声明重写了两个JSP生存期方法:
<%! public void jspInit(){
// 在这里写你的代码            
          }
          public void jspDestory(){
//在这里写你的代码
          }
%>


表达式     表达式     表达式     表达式     表达式    


语法:
<%=   Java表达式   %>
说明:
表达式用于求值计算,其结果将被显示在客户端浏览器中
表达式不用分号结束。例如:
<%= new java.util.Date() %>
当JSP页面被翻译成页面servlet时,表达式被放到_jspService()方法的out.print()语句中,从而来产生输出。例如,对上面的表达式,将生成如下代码:
out. print(new java.util.Date());


示例(ShowDate.jsp):
<%@ page contentType=“text/html;charset=GBK” import=“java.util.*” %>
<html>
<body bgcolor=“#ffffff”>
<%
Calendar currTime=new GregorianCalendar();
int year=currTime.get(currTime.YEAR);
int month=currTime.get(currTime.MONTH);
int day=currTime.get(currTime.DAY_OF_MONTH);
int hour=currTime.get(currTime.HOUR_OF_DAY);
%>
<h1>
今天是<%=year%>年<%=month%>月<%=day%>日
</h1>
现在是<%=hour%>点
</body>
</html>


记录页面被访问次数的JSP,程序代码详见hitcount.jsp
记录页面被访问次数的JSP,使用三元运算符生成有条件的输出。程序代码详见hitcount2.jsp


脚本片断     脚本片断     脚本片断     脚本片断     脚本片断    


语法:
<%   Java语句片断   %>
说明:
可以在脚本片断中嵌入任何合法的Java语句,这些语句在翻译成JSP页面实现类后,按照脚本片断在页面中出现的顺序,都将被直接添加到_jspService()方法中
在脚本片断中不能再定义新的方法,因为Java语法规定,不能在一个方法中定义另一个方法
在<%和%>组成的标记对中,只能出现Java语句,其它东西都是非法的
与表达式不同的是,脚本片断不自动生成返回给客户的输出。如果希望的话,可以使用out隐含对象生成输出


使用示例(hello.jsp):
<%@ page contentType=“text/html;charset=GBK” import=“java.util.*” %>
<html>
<head><title>问候</title></head>
<body bgcolor=“#ffffff”>
<%
String greetTime=“早上好!”;
Calendar currTime=new GregorianCalendar();
if(currTime.get(currTime.HOUR_OF_DAY)>18){
greetTime=“晚上好!”;
}
else if(currTime.get(currTime.HOUR_OF_DAY)>12){
greetTime=“下午好!”;
}
%>
<h1><% out.println(greetTime); %><br></h1>
</body></html>

如下的脚本片断从请求中得到一个温度数字,把它从Farenheit(华氏的)转换为Celsius(摄氏的),并把结果返回给客户端:
<%
float farenheit=Integer.parseInt(request.getParameter(“temp”));
float celsius=(farenheit-32)*5/9;
out.println(farenheit+” farenheit=”+celsius+”celsius”);
%>
为了删去脚本片断中的静态文本,通过把脚本片断和表达式结合起来改进这个例子,如下所示:


<%
float farenheit=Integer.parseInt(request.getParameter(“temp”));
float celsius=(farenheit-32)*5/9;
%>
<%=farenheit %> farenheit=<%=celsius%> celsius
与表达式不同的是,脚本片断包含的代码块有时必须和其它代码块相结合才有效。在Java中,一个合法的代码块以“{”开始,以“}”结束。如果代码块没有结束,代码就是无效的,并且当页面servlet被编译时,将导致一个编译错误


程序conversion.jsp示范了如何使用表达式来删去脚本片断中的静态文本以及多个脚本片断之间的结合以形成一个有效的代码段
使用如下URL调用它:
http://localhost:8080/conversion.jsp?temp=212


注释     注释     注释     注释     注释     注释     注释     注释     注释     注释     注释     注释     注释     注释    


在JSP页面中可以使用4种注释
标准的JSP注释语法如下:
<%-- 注释内容 --%>
这种注释不会返回给客户端,只能在JSP页面中可以看见。这是因为这种注释不会被加入到JSP页面servlet的_jspService()方法中去
可以在声明、表达式和脚本片断中使用Java语言的注释:
/* 注释 */   和   //注释
这种注释会被作为源代码注释加入到JSP页面servlet中去,但是不会被增加到输出流中返回给客户端


HTML和XML的标准注释语法如下:
<!--   注释内容   -->
这种注释会被增加到输出流中返回给客户端,它们在页面的源代码中可以被看到

猜你喜欢

转载自fhuan123.iteye.com/blog/1328584