JSP程序设计之JSP指令
1、JSP指令概念与分类
(1)概念
JSP指令相当于在编译期间的命令,用来设置与整个JSP页面相关的属性,它并不直接产生任何可见的输出,用来设置全局变量、声明类、要实现的方法和输出内容的类型等。在JSP文件被解析为Java文件时,Web容器会将它们翻译为对应的Java代码,在JSP页面转Servlet类过程中起作用,影响由JSP页面生成的Servlet类的整体结构。例如,通过page指令可以设置JSP的脚本语言、设置JSP的编码格式、在JSP中引入其他的Java类或者Java包,通过include指令引入其他的Java代码段等
(2)分类
JSP中主要包含3种指令,分别为page指令、include指令和taglib指令,如图所示。
JSP 指令的语法如下。
写法一:
<%@ 指令名称 属性1=“属性值1” 属性2=“属性值2” … 属性n=“属性值n”%>
写法二:
<%@ 指令名称 属性1=“属性值1”%> <%@ 指令名称 属性2=“属性值2”%><%@ 指令名称 属性n=“属性值n”%>
说明:属性值两边的双引号可以替换为单引号,但引号标记不能完全省略。如果要在属性值中使用引号,则要在它们之前添加反斜杠,即“\”符号。
2、page指令
(1)page指令概念
page指令即页面指令,用来定义整个JSP页面的一些属性和这些属性的值。page指令的属性可以定义MIME类型、定义需要导入的包、错误页的指定、页面编码、脚本语言等。page指令格式如下。
用一个page指令指定多个属性的值。
<%@ page 属性1= “属性1的值” 属性2= “属性2的值” ……%>
用多个page指令为每个属性指定值。
<%@ page 属性1= “属性1的值” %>
<%@ page 属性2= “属性2的值” %>
……
<%@ page 属性n= “属性n的值” %>
page指令的作用对整个JSP页面有效,与其书写位置无关,可以放在文档中的任何地方,但通常把page指令写在JSP页面的最前面。
page 指令中除import属性外,其他属性只能在指令中出现一次。page指令有如下属性(大小写敏感),每个属性完成的功能不同。
按照使用的频率列出:import、contentType、pageEncoding、session、isELIgnored(只限JSP 2.0)、buffer、autoFlush、info、errorPage、isErrorPage、isThreadSafe、language 和 extends。
page指令每个属性的作用和默认取值如图所示。
属性名 | 作用 | 举例说明 | 默认值 |
---|---|---|---|
import | 该属性的作用是为 JSP 页面引入 Java 核心包中的类,可以为该属性指定多个值,值以逗号分隔,就像在通常的 Java 代码中所使用的 import 语句 | <%@ page import="java.util.*, cn.foooldfat.*" %> | 无 |
contentType | 定义 JSP 的字符编码方式和 JSP 页面响应的 MIME 类型 | <%@ page contentType="application/vnd.ms-excel" %> | text/html;charset=iso-8859-1 |
pageEncoding | JSP 页面的字符编码 | <%@ page pageEncoding="GBK" %> | "iso-8859-1" |
session | 控制页面是否参与 HTTP 会话 | <%@ page session="true" %> | "true" |
isELIgnored | 忽略(true)JSP 2.0 表达式语言(EL),还是进行正常的求值(false) | <%@ page isELIgnored="true" %> | true 或 false(依赖于 Web 应用的 web.xml 版本) |
buffer | 指定 out 变量(类型为 JspWriter)使用的缓冲区的大小 | <%@ page buffer="none" %> | "8KB" |
autoFlush | 设置页面缓存满时是否自动刷新缓存(默认 true;false 时抛异常) | <%@ page autoFlush="true" %> | "true" |
info | 定义可在 servlet 中通过 getServletInfo 方法获取的字符串 | <%@ page info="Some Message" %> | 无 |
errorPage | 指定处理当前页面未捕获异常的 JSP 页面(异常类型为 Throwable) | <%@ page errorPage="Relative URL" %> | 无 |
isErrorPage | 表示当前页是否可作为其他 JSP 页面的错误页面 | <%@ page isErrorPage="false" %> | false |
isThreadSafe | 控制 JSP 生成的 servlet 是并行访问(默认)还是单线程访问 | <%@ page isThreadSafe="true" %> | true |
extends | 指定 JSP 生成的 servlet 的超类 | <%@ page extends="package.class" %> | 无 |
language | 指定页面使用的脚本语言 | <%@ page language="java" %> | java |
(2)实例:page指令应用
(1)实例一:在登录login.jsp页面中,首行代码如下,请思考其作用。
<%@ page language="java" pageEncoding="UTF-8"%>
通过page指令来设定JSP页面的脚本语言为Java,页面的编码格式为“UTF-8”。
(2)实例二:在某个JSP页面中,首行代码如下,请思考import属性的作用和用法。
<%@ page language="java" import="java.util.*,com.inspur.vo.person" pageEncoding="UTF-8"%>
通过page指令的import属性来引入java.util包和com.inspur.vo.person类,在该JSP页面中可以直接使用java.util包和所有的类或者接口,以及com.inspur.vo.person类。
当然,上面的代码也可以修改为:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page import="java.util.*,com.inspur.vo.person"%>
或者
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<%@ page import="com.inspur.vo.person"%>
3、include指令
(1)include 指令概念
include 指令用于在JSP页面静态插入一个文件,被插入的文件可以是JSP页面、HTML页面、文本文件或一段Java代码。使用了include指令的JSP页面在转换成Java文件时,将被插入的文件在当前JSP页面该指令的位置做整体的插入,合并成一个新的JSP页面,然后JSP引擎再将这个新的JSP页面转译成Java文件。因此,必须保证插入文件后形成的新的JSP页面符合JSP语法和逻辑规则。include指令格式如下。
<%@ include file = "文件名"%>
include指令特点如下。
include 指令称为静态包含(在编译之前已经做了处理),即先将要包含的文件信息嵌入相应的JSP页面,再统一转换成一个servlet类。
include指令不能传参数。
使用include指令时,包含页面和被包含页面访问的是同一个request内嵌对象。
(2)实例:include指令应用
在界面includeDemo02.jsp中,利用include指令引入top.jsp和bottom.jsp。
includeDemo02.jsp如下。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>案例</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><%@ include file="top.jsp" %><br>主界面<br><%@ include file="bottom.jsp" %><br></body>
</html>
4、taglib指令
taglib 指令的作用是在JSP页面中,将标签描述符文件(tld文件)引入该页面中,设置前缀,并利用标签的前缀去使用标签描述符文件(tld文件)中的标签。
其中,tld文件是一个符合规范的XML文件,它描述一个或者更多标签和它们的属性。将这个文件放置在WEB-INF目录中,放置该文件的目的是指定关于标签处理程序的类名和标签允许的属性,可以提供标签库中类和JSP中对标签引用的映射关系。
taglib指令格式如下。
<%@taglib uri=“标签描述符文件” prefix=“前缀名” %>
其中,uri 属性用来指定标签库的存放位置,prefix 属性用来指定该标签库使用的前缀。当把某个标签库引入JSP文件时,<%@ taglib prefix=“c” uri=“myjstl”%>中的uri有两种写法。
(1)自定义
自定义可以为uri属性值设定一个有个性的名字,但这样做的后果就是编译器会找不到所用的标签描述符文件,从而找不到这个标签的功能支持类,导致标签无法正常工作。
如果使用了自定义uri的话,就需要在该工程的web.xml下加入如下信息,这样编译器就能通过这座“桥”找到对应的tld文件了。
<jsp-config><taglib> <taglib-uri>myjstl</taglib-uri> <taglib-location>/WEB-INF/tld/c.tld</taglib-location> </taglib>
</jsp-config>
(2)标准定义
标准定义设定的uri值需要和标签描述符文件中uri节点的文本信息一致。当打开一个标签描述符文件时,在文件的头部会有一个节点,里面的内容即为uri的标准定义。使用标准定义的优点在于不用在web.xml中加入上面的代码。假如在JSP页面中使用JSTL中的核心标签库,则需要在JSP页面中使用taglib指令引入标签描述符文件(c.tld),下面的代码uri是标准定义。
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
(3)实例:taglib指令应用
JSP标准标签库(JSP Standard Tag Library,JSTL)中核心标签库out标签的使用案例。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>My JSP 'outDemo01.jsp' starting page</title></head><body><c:out value="Hello JSP 2.0 !! " /> <br/></body>
</html>