1. JSP指令元素
1.1. page指令
page指令是JSP页面中最常用的指令,用来声明JSP页面的属性等信息。一个page指令允许定义多个属性;也可以一个page指令定义一个属性,定义多个page指令。
<!-- 一个page指令,设置多个属性 --> <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!-- 一个page指令,设置一个属性.配置多个page指令 --> <%@ page import="java.util.*"%> <%@ page pageEncoding="UTF-8"%>
但是需要注意的是:
- page指令设置的属性只能出现一次,除import属性以外。
- 属性名称区分大小写。
page指令允许的属性如下:
属性名称 |
取值范围 |
描述 |
language |
java |
指明该JSP文件采用的语言。 |
extends |
任何类的全名 |
指明该JSP文件继承于哪个类。JSP为Servlet,因此当指明继承普通类时需要实现Servlet的init()、destroy()等方法。 |
import |
任何包名、类名 |
引入该JSP中用到的类、包等。import是唯一可以声明多次的page指令属性。一个import属性可以引用多个类,中间用英文逗号隔开。 JSP中下面四个包里的类可以直接使用:java.lang.*,javax.servlet.*,javax.servlet.jsp.*,javax.servlet.http.*。 |
session |
true,false |
指明该JSP内是否内置Session对象。如果为true,则内置Session对象,可直接使用。否则不内置Session对象。默认为true |
autoFlush |
true,false |
是否运行缓存。如果为true,则使用out.println()等方法输出的字符串并不是立刻到达服务器端的,而是暂时存在缓存里,缓存满或者程序执行完毕或者执行out.flush()操作时才到客户端。默认为true |
buffer |
none、数字+KB |
指定缓存大小,当autoFlush设为true时有效,默认值为8KB。 |
isThreadSafe |
true,false |
指定是否线程安全。如果为true,则运行多个线程同时运行该JSP程序,否则只运行一个线程运行,其余线程等待。默认为false |
isErrorPage |
true,false |
指定该页面是否为错误处理页面。如果为true,则该JSP内置Exception对象,可直接使用,否则没有。默认为false |
errorPage |
某个JSP页面的相对路径 |
指明一个错误显示页面,如果该JSP程序抛出一个未捕捉的异常,则转到errorPage指定的页面。errorPage指定的页面通常isErrorPage属性为true,且内置Exception对象为未捕捉的异常。 |
contentType |
有效的文档类型 |
客户端浏览器根据该属性判断文档类型。 |
info |
任意字符串 |
指明该JSP的信息,该信息可以通过Servlet.getServletInfo()方法获取。 |
trimDirective |
true,false |
是否去掉指令前后的空白字符。默认为false |
isELIgnored |
true,false |
指明当前页面是否忽略EL表达式。默认为false,表示不忽略。 |
- pageEncoding和contentType属性
- pageEncoding属性:指明当前JSP页面使用的编码格式。pageEncoding属性的值要与JSP页面的真实编码保持一致,否则会出现乱码。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
-
- contentType属性:在JSP页面编译成Servlet文件时,对应response.setContentType()方法。
pageEncoding属性与contentType属性只设置其中一个属性时,另一个属性的默认与设置的相同。如果两个属性都不设置的话,两个属性的默认值都为“ISO-8859-1”。一般情况下,至少设置其中一个。
- errorPage和isErrorPage属性
- 创建一个JSP页面,编写代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'page.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> This is my JSP page. <br> <% if(true){ throw new RuntimeException(); } %> </body> </html>
-
- 发布Web工程,并访问http://localhost:8080/jsp/01_directive/page.jsp。
页面访问报错,提示JSP页面的throw new RuntimeException();这句报错。当页面报错时,是不希望用户看到这样的错误页面,而是友好的错误信息。
-
- 创建一个JSP页面,用于页面报错的友好提示信息。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'error.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> this is error page.<br> </body> </html>
-
- 在第一个JSP页面中增加如下代码,设置如果当前页面出现错误,利用error.jsp页面进行错误信息的提示。
<%@ page language="java" pageEncoding="UTF-8" errorPage="error.jsp"%>
-
- 重新发布Web工程,并访问http://localhost:8080/jsp/01_directive/page.jsp。
这时再次访问当前的JSP页面,会发现显示的是error.jsp页面的内容。这样的处理使得报错更好友,但是还存在一个问题,就是通过HttpWatch工具抓取会发现响应状态码为200,并不是错误的状态码。这就说明了虽然页面报错并进行了相关提示,但实际上JSP页面将错误隐藏起来,这样不利于之后的处理。
-
- 在error.jsp页面中增加如下代码,设置如果当前JSP页面错误,响应对应的状态码,以便之后处理。
<%@ page language="java" pageEncoding="UTF-8" isErrorPage="true"%>
-
- 重新发布Web工程,并访问http://localhost:8080/jsp/01_directive/page.jsp。
-
- 在error.jsp页面中,可以使用JSP内置对象exception获取异常信息等功能,该对象只能在错误页面中。
<%@ page language="java" pageEncoding="UTF-8" isErrorPage="true"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'error.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> this is error page.<br> <%=exception.getMessage() %> </body> </html>
-
- 在JSP页面中指定错误页面虽然可以,但是操作繁琐(实际开发要为每一个JSP页面指定)。还可以使用web.xml文件配置错误页面信息。
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 配置对应状态码为404的错误页面 --> <error-page> <!-- 设置对应的状态码 --> <error-code>404</error-code> <!-- 配置错误页面路径 --> <location>/directive/error.jsp</location> </error-page> <!-- 配置对应异常的错误页面 --> <error-page> <!-- 设置对应的异常 --> <exception-type>java.lang.RuntimeException</exception-type> <!-- 配置错误页面路径 --> <location>/directive/error.jsp</location> </error-page> </web-app>
1.2. include指令
include指令用于在JSP页面中静态包含另一个文件,该文件可以是JSP页面、HTML页面、文本文件或一段Java代码。include语法格式如下:
<%@ include file="包含文件的路径" %>
设置包含文件的路径只能是常量,不能是变量。
include.jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'include.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> 欢迎你,现在的时间是: <%@ include file="date.jsp" %> </body> </html>
date.jsp页面
<% out.println(new java.util.Date().toString()); %>
1.3. taglib指令
JSP页面支持标签,使用标签功能可以实现视图代码重用,很少量的代码可以实现很复杂的显示效果。要使用标签功能必须先声明标签库以及标签前缀。taglib指令用于指明JSP页面使用的JSP标签库。taglib指令的语法格式如下:
<%@ taglib prefix="标签前缀" uri="标签库的完整路径" %>
目前使用最多的是如下标签库:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2. JSP动作标签
2.1. <jsp:include>标签
这个动作标签用于在当前页面中包含静态和动态的资源,一旦被包含的页面执行完毕,请求处理将在调用页面中继续进行。这个动作标签与javax.servlet.RequestDispatcher类的include方法一致。
<jsp:include flush="boolean值" page="被包含页面的路径"></jsp:include>
- flush属性:该属性是可选的。默认值为false,表示当前页面输出使用了缓冲区,在包含之前不刷新缓冲区。true表示刷新缓冲区。
- page属性:指定被包含资源的相对路径,该路径是相对于当前JSP页面的URL。
include标签与include指令的区别:
语法 |
相对路径 |
发生时间 |
包含的对象 |
描述 |
<%@ include file=”url”%> |
相对于当前文件 |
转换期间 |
静态 |
包含的内容被JSP容器分析 |
<jsp:include page=”url”> |
相对于当前页面 |
请求处理期间 |
静态和动态 |
包含的内容不进行分析 |
2.2. <jsp:forward>标签
这个动作标签运行在运行时将当前的请求转发给一个静态的资源、JSP页面或者Servlet,请求被转向到的资源必须位于同JSP发送请求相同的上下文环境中。这个动作标签与javax.servlet.RequestDispatcher类的forward()方法的作用相同。
这个动作标签的语法格式如下:
<jsp:forward page="请求转发到页面的路径"></jsp:forward>
具体用法如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'forward.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <h1>forward.jsp</h1> <% System.out.println("forward jsp start..."); %> <jsp:forward page="include.jsp?flag=true"></jsp:forward> <% System.out.println("forward jsp end..."); %> </body> </html>
转换成Servlet后的代码
out.write(" <h1>forward.jsp</h1> "); out.write(" "); System.out.println("forward jsp start..."); out.write(" "); out.write(" "); if (true) { _jspx_page_context.forward("include.jsp?flag=true"); return; } out.write(" "); out.write(" "); System.out.println("forward jsp end...");
2.3. <jsp:param>标签
这个动作标签与<jsp:include>标签、<jsp:forward>标签配合使用,以键值对形式为其他标签提供参数内容。这个动作标签的语法格式如下:
<jsp:param value="参数值" name="参数名称"/>
具体用法参考如下代码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'forward.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <jsp:forward page="include.jsp"> <jsp:param value="true" name="flag"/> </jsp:forward> </body> </html>
3. JSP内置对象
3.1. out输出流对象
内置对象out是javax.servlet.jsp.JspWriter类的实例,与response.getWriter()方法的作用相同,都是服务器端向客户端输出的字符串内容。该对象的常用方法如下:
Method Summary |
|
abstract void |
clear() |
abstract void |
flush() |
int |
getBufferSize() |
abstract int |
getRemaining() |
boolean |
isAutoFlush() |
abstract void |
|
abstract void |
println(String x) |
3.2. pageContext上下文对象
内置对象pageContext是javax.servlet.jsp.PageContext类的实例,该对象是JSP的四大作用域对象之一,pageContext对象代表当前JSP页面编译后的内容,多用于JSP页面之间共享数据内容。
- pageContext对象的常用方法
Method Summary |
|
abstract Object |
getAttribute(String name) |
abstract void |
removeAttribute(String name) |
abstract void |
setAttribute(String name, Object value) |
- pageContext对象获取其他八个内置对象
Method Summary |
|