JSP学习笔记二:JSP语法之编译器指令

  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中都要用,那么静态导入就方便一点。如果不是这样,那么可以尽量使用动态导入,这样更安全,更灵活。

原文地址:https://www.cnblogs.com/AEIOU19994/p/5455269.html