一、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" ]
%>

2.1、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.*" %>

2.2、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>

<error-page>
<exception-type>com.sun.jersey.api.container.ContainerException:</exception-type>
<location>/errorr.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/notFound.jsp</location>
</error-page>

假设设置了某个JSP页面的errorPage属性,那么在web.xml文件里设置的错误处理将不正确该页面起作用。

2.3、使用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>

执行结果例如以下:

  

2.4、在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>

当訪问一个不存在的web资源时。就会跳转到在web.xml中配置的404错误处理页面404Error.jsp。例如以下图所看到的:

  

2.5、关于在web.xml中使用<error-page>标签为整个web应用设置错误处理页面在IE下无法跳转的解决的方法

  这里须要注意的是,假设错误页面比較小,那么当訪问server上不存在的web资源或者訪问server出错时在IE浏览器下是无法跳转到错误页面的,显示的是ie自己的错误页面,而在火狐和google浏览器下(其他浏览器没有測试过)是不存在注意的问题的。

我们能够通过以下的实验来证明

  在web.xml中配置500错误时的错误友好提示页面

 <!-- 针对500错误的处理页面 -->
<error-page>
<error-code>500</error-code>
<location>/ErrorPage/500Error.jsp</location>
</error-page>

500Error.jsp页面的代码例如以下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>500(server错误)错误友好提示页面</title>
<!-- 3秒钟后自己主动跳转回首页 -->
<meta http-equiv="refresh" content="3;url=${pageContext.request.contextPath}/index.jsp">
</head>
<body>
<img alt="对不起,server出错!"
src="${pageContext.request.contextPath}/img/500Error.png"/><br/>
3秒钟后自己主动跳转回首页,假设没有跳转。请点击<a href="${pageContext.request.contextPath}/index.jsp">这里</a>
</body>
</html>

500Error.jsp页面的字节大小

在IE8浏览器下的执行结果:

  在IE下訪问Test.jsp出现500错误后,显示的是ie自己的错误页面,而不是我们定制的那个500错误页面,而在google和火狐下却是能够正常跳转到我们自己定制的那个500错误页面的。例如以下图所看到的:



非常多人遇到这个问题,而解决问题的办法有两种:

1、改动IE浏览器的设置(不推荐)

  操作步骤:在IE【工具】->【Internet选项】->【高级】中勾掉【显示友好http错误提示】

  

  经过这种设置之后,訪问server出错后就能够直接跳转到我们定制的500错误页面了。例如以下图所看到的:

  

  这种做法须要改动client浏览器的配置,不推荐这种方式。

2.不改动IE浏览器的设置下确保定制的错误页面的大小>1024字节

  改动500Error.jsp,多加入一些内容,让页面的字节数大一些,改动后的500Error.jsp的代码例如以下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>500(server错误)错误友好提示页面</title>
<!-- 3秒钟后自己主动跳转回首页 -->
<meta http-equiv="refresh" content="3;url=${pageContext.request.contextPath}/index.jsp">
</head>
<body>
<img alt="对不起,server出错了,请联系管理员解决!"
src="${pageContext.request.contextPath}/img/500Error.png"/><br/>
3秒钟后自己主动跳转回首页,假设没有跳转,请点击<a href="${pageContext.request.contextPath}/index.jsp">这里</a>
</body>
</html>

  也就多加了几个中文,让500Error.jsp多了几个字节。500Error.jsp如今的字节数例如以下:

  

  在IE下訪问。当server出错时,就能够正常跳转到500Error.jsp这个定制的错误页面了,例如以下图所看到的:

  

  经过測试。当定制的错误页面的size=617bytes时,在IE8下已经能够跳转到定制的错误页面了。其他版本号的IE浏览器没有经过測试。只是为了保险起见。定制的错误页面的size最好超过1024bytes。

2.6、使用page指令的的isErrorPage属性显式声明页面为错误页面

  假设某一个jsp页面是作为系统的错误处理页面,那么建议将page指令的isErrorPage属性(默觉得false)设置为”true”来显式声明这个Jsp页面是一个错误处理页面。

比如:将error.jsp页面显式声明为错误处理页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isErrorPage="true"%>
<html>
<head>
<title>错误信息友好提示页面</title>
</head> <body>
对不起。出错了,请联系管理员解决。
</body>
</html>

  将error.jsp页面显式声明为错误处理页面后,有什么优点呢。优点就是Jsp引擎在将jsp页面翻译成Servlet的时候。在Servlet的 _jspService方法中会声明一个exception对象,然后将执行jsp出错的异常信息存储到exception对象中。例如以下所看到的:

  

  由于Servlet的_jspService方法中声明了exception对象。那么就能够在error.jsp页面中使用exception对象,这样就能够在Jsp页面中拿到出错的异常信息了。例如以下:

  

  假设没有设置isErrorPage="true",那么在jsp页面中是无法使用exception对象的。由于在Servlet的_jspService方法中不会声明一个exception对象,例如以下所看到的:

  

  

  Jsp有9大内置对象,而普通情况下exception对象在Jsp页面中是获取不到的。仅仅有设置page指令的isErrorPage属性为”true”来显式声明Jsp页面是一个错误处理页面之后才干够在Jsp页面中使用exception对象。

三、include指令

  在JSP中对于包括有两种语句形式:

  • @include指令 –静态包括。编译时包括,全部文件编译成一个Servlet;
  • <jsp:include>指令–动态包括,执行时包括。每一个文件单独编译成一个.class文件。

3.1、@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"%>
<h1 style="color:red;">网页头部</h1>

foot.jspf代码:

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<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标签引入引入其他JSP页面--%>
<%@include file="/jspfragments/head.jspf" %>
<h1>网页主体内容</h1>
<%@include file="/jspfragments/foot.jspf" %>
</body>
</html>

执行结果例如以下:

  

  我们查看一下jsp引擎将IncludeTagTest.jsp翻译成IncludeTagTest_jsp类之后的源码,找到Tomcatserver的work\Catalina\localhost\JavaWeb_Jsp_Study_20140603\org\apache\jsp文件夹下找到IncludeTagTest_jsp.java,例如以下图所看到的:

  

打开IncludeTagTest_jsp.java。里面的代码例如以下所看到的:

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
import java.util.*;
import java.util.*; public final class IncludeTagTest_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent { private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory(); private static java.util.List _jspx_dependants; static {
_jspx_dependants = new java.util.ArrayList(2);
_jspx_dependants.add("/jspfragments/head.jspf");
_jspx_dependants.add("/jspfragments/foot.jspf");
} private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.AnnotationProcessor _jsp_annotationprocessor; public Object getDependants() {
return _jspx_dependants;
} public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
} public void _jspDestroy() {
} public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException { PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null; try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out; out.write("\r\n");
out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
out.write("<html>\r\n");
out.write(" <head>\r\n");
out.write(" \r\n");
out.write(" <title>jsp的Include指令測试</title>\r\n");
out.write(" \r\n");
out.write(" </head>\r\n");
out.write(" \r\n");
out.write(" <body>\r\n");
out.write(" ");
out.write("\r\n");
out.write("<h1 style=\"color:red;\">网页头部</h1>\r\n");
out.write("\r\n");
out.write(" <h1>网页主体内容</h1>\r\n");
out.write(" ");
out.write("\r\n");
out.write("<h1 style=\"color:blue;\">网页尾部</h1>\r\n");
out.write("\r\n");
out.write(" </body>\r\n");
out.write("</html>\r\n");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}

  能够看到,head.jspffoot.jspf页面的内容都使用out.write输出到浏览器显示了。

3.2、总结@include指令

  使用@include能够包括随意的内容,文件的后缀是什么都无所谓。

这种把别的文件内容包括到自身页面的@include语句就叫作静态包括,作用仅仅是把别的页面内容包括进来,属于静态包括。

3.3、<jsp:include>指令

  jsp:include指令为动态包括,假设被包括的页面是JSP,则先处理之后再将结果包括,而假设包括的是非*.jsp文件,则仅仅是把文件内容静态包括进来,功能与@include相似。后面再详细介绍

深入分析JavaWeb Item13 -- jsp指令具体解释的更多相关文章

  1. javaweb之jsp指令

    1.JSP指令简介 JSP指令是为JSP引擎设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令:page指令,Include指 ...

  2. 深入分析JavaWeb Item23 -- jsp自己定义标签开发入门

    一.自己定义标签的作用 自己定义标签主要用于移除Jsp页面中的java代码. 二.自己定义标签开发和使用 2.1.自己定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 要编写一 ...

  3. javaWEB与JSP指令

    JSP三大指令  一个jsp页面中,可以有0~N个指令的定义!1. page --> 最复杂:<%@page language="java" info="xx ...

  4. JavaWeb学习----JSP脚本元素、指令元素、动作元素

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  5. Javaweb学习笔记——(十二)——————JSP指令:page指令、include指令、taglib指令,JavaBean,内省,EL表达式

    JSP指令JSP指令分类 JSP有三大指令: *page指令 *include指令 *taglib指令 在JSP中没有任何指令是必须的. 但基本上每个JSP都是使用page指令============ ...

  6. IT兄弟连 JavaWeb教程 JSP中的三大指令

    指令标识主要用于设定整个JSP页面范围内都有效的相关信息,它是被服务器解释并执行的,不会产生任何内容输出到网页中.也就是说,指令标识对于客户端浏览器是不接见的.JSP页面的指令标识与我们的身份证类似, ...

  7. javaweb学习总结(十六)——JSP指令

    一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: pa ...

  8. javaWEB总结(15):jsp指令_page指令

    jsp指令 jsp指令是为jsp引擎设计的.他们并不直接产生任何可见输出,而只是告诉引擎如何处理jsp页面的其余部分. 目前定义了page,include和taglib这三种指令. page指令 (1 ...

  9. javaWeb学习总结(8)- jsp指令(3)

    一.JSP指令简介 一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定 ...

随机推荐

  1. solr之windws下搭建solr服务

    安装Solr 首先保证已经正确安装了Java 下载Solr,当前最新版6.1.0 Solr各个版本下载地址 Solr从6.0之后需要Java1.8所以如果使用Solr6.0及其以上版本,请确保Java ...

  2. 【HDU 6008】Worried School(模拟)

    Problem Description You may already know that how the World Finals slots are distributed in EC sub-r ...

  3. [MVC]Ajax辅助方法

    在开始使用Ajax辅助方法前,必须在页面中载入jQuery以及jquery.unobtrusive-ajax.js文件才能正常执行. 为了让网站载入适当的JS函数库,必须先让Layout页面载入适当的 ...

  4. 儿子写日记 : " 夜深了,妈妈在打麻将,爸爸在上网……"

    儿子写日记 : " 夜深了,妈妈在打麻将,爸爸在上网……"              爸爸检查时,很不满意地说 : " 日记源于生活,但要高于生活 !"    ...

  5. 【Codeforces 140A】New Year Table

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 算出来每个盘子要占用多少角度. 然后乘n看看是不是小于等于2π就好 (精度最好定在1e-7) [代码] #include <bits/s ...

  6. zoj 2201 No Brainer

    No Brainer Time Limit: 2 Seconds      Memory Limit: 65536 KB Zombies love to eat brains. Yum. Input ...

  7. NYOJ27水池数目,类似于FZU1008最大黑区域,简单搜索题~~~

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上 ...

  8. 虚拟机(Virtual Machine)和容器(Container)的对比

    目前云计算平台常用的虚拟化技术有虚拟机(Virtual Machine)和容器(Container)两种.虚拟机已经是比较成熟的技术,容器技术作为下一代虚拟化技术,国内的各厂商应用还不广,但似乎其代表 ...

  9. HDU 4597

    题目大意: 两人轮流从两堆牌从抽取最顶端或者最底部的牌,得到的分数加到自己身上,问先拿牌的最多能得多少分 记忆化搜索,2堆牌的底和顶,有四种方法,根据四种方法来找到最优解 #include <c ...

  10. [luoguP2461] [SDOI2008]递归数列(DP + 矩阵优化)

    传送门 本题主要是构造矩阵,我们只需要把那一段式子看成两个前缀和相减, 然后就直接矩阵连乘. 直接对那个k+1阶矩阵快速幂即可,注意初始化矩阵为单位矩阵,即主对角线(左上到右下)都为1其他都为0. 另 ...