JSP语法分为三种不同的类型,分别是编译器指令,脚本语法和动作语法。
1.编译器指令包括page,include和taglib。
1-1 page:
page属性包括import、contentType、pageEncoding、session、isELIgnored(只限 JSP 2.0)、buffer、autoFlush、info、errorPage、isErrorPage、isThreadSafe、language 和 extends。
在page中设置属性,会在转译后的.java中有相应显示。
比如,<%@ page contentType="text/html; charset=gbk" %>对应的.java代码为:response.setContentType("text/html; charset=gbk");
比如,<%@ page import="java.awt.*"%>声明后,.java文件会声明相应的包。
比如,<%@ errorPage="error.jsp"%>会使所在的JSP页面发生错误时,跳转到error.jsp。
...
1-2 include即为导入,包括静态导入和动态导入。我们创建一个例子来理解一下。
①静态导入:首先,创建项目02Test(包含默认的JSP,index.jsp),另外新建一个JSP文件,included.jsp。输入代码如下:
<% int a = 10; int b = 15; %> <b>ssssss</b>
然后在index.jsp中,输入代码:
<%@include file="included.jsp" %>
<%= a+b%>
客户端显示如下:
也就是说,index.jsp调用了included.jsp中的代码。我们可以查看一下转译之后的index.java文件,其中多了这些代码:
int a = 10; int b = 15; out.write(" "); out.write(" "); out.write("<b>ssssss</b>"); out.write(" "); out.write(" "); out.print( a+b);
所以,当我们在index.jsp中再次声明a,b变量时,会提示错误,即是因为在included.jsp中已经声明。同样,我们把include语句和输出a+b的语句顺序颠倒,同样出错,因为尚未声明a,b。
②动态导入:同样使用上面的项目文件,不过将导入方式不同,动态导入代码如下:
<jsp:include page="included.jsp"></jsp:include>
我们在客户端同样能看到included.jsp中的代码效果:
但是,我们在index.jsp中不能使用a,b变量。那么,为什么呢?
下面,我们打开转译文件index.java,可以看到,在文件中只是增多了一行代码:
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "included.jsp", out, false);
这种调用方式就类似于一个类调用另一个类。
③几点说明:首先,我想说明一下静态导入和动态导入的区别。
a) 在静态导入中,是不生成转译文件的。然而在动态导入会生成,比如上面的例子,就会生成included.java文件。也就是说,静态导入是将两个类合并成一个类,而动态导入是在一个类中调用另一个类。
b) 静态导入之后,included.jsp中声明的变量是可以用的,动态导入则不能。
c) 那么,这两种导入分别在什么情况下使用呢?那就要看你的变量需求了。如果你的变量在两个jsp中都要用,那么静态导入就方便一点。如果不是这样,那么可以尽量使用动态导入,这样更安全,更灵活。