原文链接: http://www.cnblogs.com/xdp-gacl/p/3778993.html
JSP指令简介
JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。
在JSP 2.0规范中共定义了三个指令:
- page指令
- include指令
- taglib指令
JSP指令的基本语法格式:<%@ 指令 属性名="值" %>
例如:<%@ page contentType="text/html;charset=gb2312"%>
如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。
例如:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.Date"%>
也可以写作:
<%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>
Page指令
page指令用于定义JSP页面的各种属性。
无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面。
为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。例如:
JSP 2.0规范中定义的page指令的完整语法:
<%@ page
[ language="java" ]
[ extends="package.class" ]
[ import="{package.class | package.*}, ..." ]
[ session="true | false" ]
[ buffer="none | 8kb | sizekb" ]
[ autoFlush="true | false" ]
[ isThreadSafe="true | false" ]
[ info="text" ]
[ errorPage="relative_url" ]
[ isErrorPage="true | false" ]
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
[ pageEncoding="characterSet | ISO-8859-1" ]
[ isELIgnored="true | false" ]
%>
page指令的import属性
在Jsp页面中,Jsp引擎会自动导入下面的包
- java.lang.*
- javax.servlet.*
- javax.servlet.jsp.*
- javax.servlet.http.*
可以在一条page指令的import属性中引入多个类或包,其中的每个包或类之间使用逗号(,)分隔,例如:
<%@ page import="java.util.*,java.io.*,java.sql.*"%>
上面的语句也可以改写为使用多条page指令的import属性来分别引入各个包或类:
<%@ page import="java.util.Date"%>
<%@ page import="java.io.*" %>
<%@ page import="java.sql.*" %>
page指令的errorPage属性
- errorPage属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前Web应用程序的根目录(注意不是站点根目录),否则,表示相对于当前页面。
可以在web.xml文件中使用<error-page>元素为整个Web应用程序设置错误处理页面。 - <error-page>元素有3个子元素:<error-code>、<exception-type>、<location>
- <error-code>子元素指定错误的状态码
例如:<error-code>404</error-code>
- <exception-type>子元素指定异常类的完全限定名
例如:<exception-type>java.lang.ArithmeticException</exception-type>
- <location>子元素指定以“/”开头的错误处理页面的路径,例如:
<location>/ErrorPage/404Error.jsp</location>
- 如果设置了某个JSP页面的errorPage属性,那么在web.xml文件中设置的错误处理将不对该页面起作用。
使用errorPage属性指明出错后跳转的错误页面
比如Test.jsp页面有如下的代码:
<%@ page language="java" import="java.util.*" errorPage="/ErrorPage/error.jsp" pageEncoding="UTF-8"%>
<html>
<head>
<title>测试page指令的errorPage属性</title>
</head>
<body>
<%
//这行代码肯定会出错,因为除数是0,一运行就会抛出异常
int x = 1/0;
%>
</body>
</html>
在Test.jsp中,page指令的errorPage属性指明了出错后跳转到"/ErrorPage/error.jsp",error.jsp页面代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>错误信息友好提示页面</title>
</head>
<body>
对不起,出错了,请联系管理员解决!
</body>
</html>
运行结果如下:
在web.xml中使用<error-page>标签为整个web应用设置错误处理页面
例如:使用<error-page>标签配置针对404错误的处理页面
web.xml的代码下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
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_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 针对404错误的处理页面 -->
<error-page>
<error-code>404</error-code>
<location>/ErrorPage/404Error.jsp</location>
</error-page>
</web-app>
404Error.jsp代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>404错误友好提示页面</title>
<!-- 3秒钟后自动跳转回首页 -->
<meta http-equiv="refresh" content="3;url=${pageContext.request.contextPath}/index.jsp">
</head>
<body>
<img alt="对不起,你要访问的页面没有找到,请联系管理员处理!"
src="${pageContext.request.contextPath}/img/404Error.png"/><br/>
3秒钟后自动跳转回首页,如果没有跳转,请点击<a href="${pageContext.request.contextPath}/index.jsp">这里</a>
</body>
</html>
include指令
在JSP中对于包含有两种语句形式:
-
@include
指令(静态包含) -
<jsp:include>
指令(动态包含 )
@include指令
@include可以包含任意的文件,当然,只是把文件的内容包含进来。
include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。
语法:<%@ include file="relativeURL"%>
,其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用。
include指令细节注意问题:
- 被引入的文件必须遵循JSP语法。
- 被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments(片段))作为静态引入文件的扩展名。
- 由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。
include指令使用范例:
新建head.jspf页面和foot.jspf页面,分别作为jsp页面的头部和尾部,存放于WebRoot下的jspfragments文件夹中,代码如下:
head.jspf代码:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <h1 style="color:red;">网页头部</h1>
foot.jspf代码:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <h1 style="color:blue;">网页尾部</h1>
在WebRoot文件夹下创建一个IncludeTagTest.jsp页面,在IncludeTagTest.jsp页面中使用@include指令引入head.jspf页面和foot.jspf页面,代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>jsp的Include指令测试</title>
</head>
<body>
<%@include file="/jspfragments/head.jspf" %>
<h1>网页主体内容</h1>
<%@include file="/jspfragments/foot.jspf" %>
</body>
</html>
运行结果如下:
jsp:include指令
jsp:include
指令为动态包含,如果被包含的页面是JSP,则先处理之后再将结果包含,而如果包含的是非*.jsp文件,则只是把文件内容静态包含进来,功能与@include类似。
写法:
<jsp:include page= "frangmentURL" />
总结:
<@inlcude file =”header.jsp”/>
此时引入的是静态的jsp文件
它将引入的jsp中的源代码原封不动地附加到当前文件中,最终编译成同一个Servlet,所以在jsp程序中使用这个指令的时候file里面的值(即要导入的文件)不能带多余的标签或是与当前jsp文件重复的东西。例如里面不要包含<html><body>这样的标签,因为是把源代码原封不动的附加过来,所以会与当前的jsp中的这样的标签重复导致出错。
<jsp:include page=”/user/test” flush=”true”/>
此时引入执行页面或生成的应答文本
jsp:include标签导入一个重用文件的时候,这个文件是经过编译的,通俗点说就是附加这个要导入文件经过编译后的效果,所以可以含有与当前jsp程序中重复的内容,因为在附加过来之前就会被解析掉。其中flush 表示在读入包含内容之前是否清空任何现有的缓冲区。
taglib指令
在JSP页面中使用第三方的标签库时,需要使用taglib指令来“导包”。
写法:
<%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
其中prefix表示标签的前缀,这个名称可以随便起。
uri是由第三方标签库定义的,所以你需要知道第三方定义的uri。
例如我们引入JSTL标签库:
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
<c:set var="ctxStatic" value="${pageContext.request.contextPath}/common"/>
<html>
<head>
<meta charset="utf-8">
<title>web-demo</title>
</head>
<body>
<form action="${ctx}/form" method="POST">
名称:<input type="text" name="name">
<br/>
网址:<input type="text" name="url"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
网友评论