1.HTML注释
该注释在客户端可通过查看源文件的方法看到。
JSP语法:<!--可见注释 -->
例1
<!-- 该注释在客户端可通过查看源文件的方法看到-->
在客户端页面源程序中显示为:
<!-- 该注释在客户端可通过查看源文件的方法看到 -->
如图:
例2
<!-页面调用日期为:
<%= (new java.util.Date()).toLocaleString() %> -->
在客户端页面源程序中显示为:
<!-页面调用日期为:
2012-8-20 19:40:40 -->
如图:
描述
可以在注释中使用任何有效的JSP表达式。表达式是动态的,当用户第一次调用该页面或该页面后来被重新调用时,该表达式将被赋值。JSP引擎对HTML注释中的表达式执行完后,其执行的结果将直接插入到表达式显示的地方。然后该结果和HTML注释中的其它内容一起输出到客户端。在客户端可通过查看源文件的方法看到该注释。
2.JSP注释
JSP注释作为JSP页面的文档资料,但是该注释在客户端通过查看源文件的方法是看不到的。即该注释不发送到客户端。
JSP语法:<%-- 注释 --%>
例子
<body>
<h2>注释测试</h2>
<%-- 在页面源代码中,这个注释是看不见的 --%>
</body>
</html>
如图:
描述
JSP引擎对JSP注释不作任何处理。JSP注释既不发送到客户端,也不在客户端的JSP页面中显示。在客户端查看源文件时也看不到。因此,如果你想在JSP页面源程序中写文档说明时,JSP注释是很有用的。
注意:在JSP注释中,不能使用--%>,但是如果你一定要使用的话,可以通过使用--%\>来避开。
3. 声明
在JSP页面脚本语言中声明变量或方法
JSP语法:<%! 声明;[声明;]+…… %>
例子
<%! int a =8; %>
输出语句:
<%= a %>
如图:
描述
在JSP文件中,一次可以声明一个或多个变量和方法,它们之间用分号隔开。在声明时使用JAVA语言时,必须符合JAVA语言规范。
注意:
(i) 变量必须先声明,然后才能使用。
(ii) 声明必须以分号结尾,但是在表达式中则不用。
(iii) 通过page指令导入的包中已声明的变量或方法,可以在主JSP文件中直接使用它们。
(iv) 一般情况下,一个声明的有效范围是本页面。但是,如果JSP源文件用<jsp:include>指令或include指令包含一些静态文件,声明的有效范围将会扩大,也就是说:声明在该静态文件中也有效。但是如果JSP源文件中用<jsp:include>指令包含进来一个动态文件,主JSP文件中的声明在该动态文件中将不起作用。
4. 表达式
在JSP脚本语言中,可以使用任何有效的表达式。
JSP语法:<%= 表达式 %>
例子1:
<%! String s = new String("hello"); %>
<font color="blue"><%=s%></font>
例子2:
随机显示一个数字:
<font color="blue"><%=java.lang.Math.random()%></font>
描述
表达式用于求值,然后其值转化为字符串,而且插入在JSP文件中显示该表达式的地方。而且可以在文本中使用表达式。表达式标签能包含符合JAVA语言规范的任何有效表达式,但是要注意:不能使用分号作为表达式的结尾,然而,在脚本段<%……%>标签中,表达式要求以分号作为结尾。
5. 脚本段
在JSP页面脚本语言中,包含一段有效的代码片段。
JSP语法:<% 代码段 %>
例1:
<%=java.lang.Math.random()%>
<%
for(int i=0;i<8;i++)
{ out.println(i); }
%>
<%
long n=6666;
application.setAttribute("maxNumber",Long.toString(n));
out.println(application.getAttribute("maxNumber"));
%>
描述
在脚本段能声明多个变量和方法。能使用任何有效的表达式。能使用任何JSP隐含的对象或任何用<jsp:useBean>标签声明的对象。能使用页面语言中任何有效的语句,如果使用Java语言,必须符合JAVA语言程序规范。
说明:假如脚本段有输出语句,则输出内容被存储在out对象中,通过out对象输出到JSP页面中。
以上介绍的是JSP的基本语法,有了以上的几条规则,我们就可以方便的书写一般的JSP文件了。比如我们前面测试Resin用的那个例子只有一句话,使用的就是表达式的语法,2+2=<%=2+2%>,前面一部分对应的是需要直接打印的HTML文本,<%,%>对中的是Java语句,加了个等号就表示要返回表达式的值,并打印到客户端。翻译成对应的Servlet语句,大概就是:
out.println("2+2="+(2+2));
这样的一个语句如果改成
System.out.println("2+2="+(2+2));
并在console上运行,那么运行的结果就是2+2=4
备注:
jsp声明和脚本段的区别
当刷新页面后,出现如下结果:a的值减一,b的值不变(如图)
我们再看下test1.jsp文件自动转换成的类文件的代码
文件所在地
TOMCAT安装目录/work/Catalina/localhost/你的工程名称/org/apache/jsp下的test1_jsp.java
代码如下:
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
public final class test1_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
int a =8;
private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
private static java.util.List _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.AnnotationProcessor _jsp_annotationprocessor;
public Object getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
}
public void _jspDestroy() {
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write('\r');
out.write('\n');
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
out.write("\r\n");
out.write("\r\n");
out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
out.write("<html>\r\n");
out.write(" <head>\r\n");
out.write(" <base href=\"");
out.print(basePath);
out.write("\">\r\n");
out.write(" \r\n");
out.write(" <title>My JSP 'test1.jsp' starting page</title>\r\n");
out.write(" \r\n");
out.write("\t<meta http-equiv=\"pragma\" content=\"no-cache\">\r\n");
out.write("\t<meta http-equiv=\"cache-control\" content=\"no-cache\">\r\n");
out.write("\t<meta http-equiv=\"expires\" content=\"0\"> \r\n");
out.write("\t<meta http-equiv=\"keywords\" content=\"keyword1,keyword2,keyword3\">\r\n");
out.write("\t<meta http-equiv=\"description\" content=\"This is my page\">\r\n");
out.write("\t<!--\r\n");
out.write("\t<link rel=\"stylesheet\" type=\"text/css\" href=\"styles.css\">\r\n");
out.write("\t-->\r\n");
out.write("\r\n");
out.write(" </head>\r\n");
out.write(" \r\n");
out.write(" <body>\r\n");
out.write(" This is my JSP page. <br>\r\n");
out.write(" 这是声明:");
out.write("\r\n");
out.write(" ");
out.print( a-- );
out.write(" \r\n");
out.write(" 这是脚本段: ");
int b =8;
out.write("\r\n");
out.write(" ");
out.print( b-- );
out.write("\r\n");
out.write(" \r\n");
out.write(" </body>\r\n");
out.write("</html>\r\n");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
通过观察代码后我们发现,原先声明在<%! %>内的变量和方法是一个类内的变量和方法也就是成员变量和成员方法。声明在<%%>内的变量是一个方法的变量也就是局部变量。
我们学习JAVA的时候就知道成员变量会被多个对象共享,而局部变量单独对象访问。所以count会自动增加,i不对递增。
在这里还有个问题要告诉读者,如果在<% %>内添加一个method()方法那么该程序就会报错,其实原因不难想象,这样声明一个方法等于就是一个类里的方法里又声明了个方法
结果肯定是错误的。