JSP页面page指令

来源:互联网 发布:兄弟标牌打印机软件 编辑:程序博客网 时间:2024/06/08 20:01

1 前言

JSP页面有三大指令:page、include、taglib,都是为了方便操作jsp页面而创建了,先来学习page指令。page指令总共含有如下属性:

<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="utf-8"%><%@ page autoFlush="true" buffer="8kb" deferredSyntaxAllowedAsLiteral="false"%><%@ page errorPage="" extends="jsp.MyHttpJspBase" info="调用getServletInfo方法" %><%@ page isErrorPage="false" isThreadSafe="true" isELIgnored="false" session="true" %><%@ page import="java.util.*" trimDirectiveWhitespaces="false"%>

我们一个一个来了解每个属性的具体含义。

2 language

language用于指定jsp使用的语言,属性值必须为“java”,不定义则默认language=”java”,其他所有的情况都会导致页面报错,language属性肯定是为了以后扩展JSP而设定的,如用其他语言PHP来解析JSP。

3 contentType

contentType用于设置页面媒体类型和页面编码格式,默认值为:text/html; charset=ISO-8859-1,通常修改为text/html; charset=utf-8或者text/html; charset=gbk用于支持中文。

4 pageEncoding

pageEncoding用于设定页面编码格式,效果同contentType内容中charset部分,如果两者均设置,则以contentType内容中的charset为准。

5 autoFlush 和buffer

这是一对共同使用的属性,有如下规则:
①autoFlush 可选值为:true和false,默认为true,即自动刷新,这里的刷新值缓存区内容;buffer默认为8kb,且单位只能为kb,即最多缓存8kb则需要自动刷新或者手动刷新。
②当buffer设置为“none”时,autoFlush必须设置为“true”,不然jsp页面会抛出异常。
③当buffer设置为其他值时,如buffer=“16kb”,autoFlush可以设置为“true”或者“false”。设置为“false”时,在jsp页面的输出内容填满buffer之前,应该使用手动方式刷新,即out.flush()方法,不然页面会抛出异常。
④不管使用了哪一种刷新,只要页面刷新了,就不能再使用重定向操作将页面跳转到其他页面了或者调用out.print()方法,不然就会抛出异常。原因分析:刷新了之后,页面的头信息就已经发送出去了,这时再重定向到其他页面,头信息对应不上,自然就抛出异常了。

6 deferredSyntaxAllowedAsLiteral

作用:控制页面是否能使用延迟操作符#{}来获取数据,默认为false。
当设置为false时,如果页面调用#{name},则会引起页面错误:#{…} is not allowed in template text;
当设置为true时,则可以调用#{name},且效果同${name}。

7 extends

作用:改变当前jsp继承类,默认继承org.apache.jasper.runtime.HttpJspBase,可定义新类继承该类,重写_jspService方法,然后设定extends=”新类全限定名称”,一般不建议这样做,可能会改变JSP解析执行性能或者引起服务器崩溃。

8 info

作用:重写父类(org.apache.jasper.runtime.HttpJspBase)的getServletInfo方法实现,页面上指定调用getServletInfo()获取返回值,Java Servlet代码中可通过Servlet.getServletInfo()获取返回值。

9 isErrorPage和errorPage

作用:isErrorPage设置该页面是否为错误处理页面,默认为false,当值为true时,可使用exception隐含对象;
errorPage设置当前页面如果发生异常跳转的页面。
示例如下:

正常页面index.jsp如果不设置errorPage<%@ page isErrorPage="false" %><body>    这是我的第一个JSP页面,JSP首页!<br/>    <%     // 执行语句肯定会发生异常     int i = 0;     int j = 5/i;    %></body>访问index.jsp页面,页面报错如下

这里写图片描述

如果指定错误页面error.jsp

index.jsp 设置如下<%@ page isErrorPage="false" errorPage="error.jsp" %>error.jsp 设置如下<%@ page isErrorPage="true"%><body>    This is my error.jsp<br/>    我可以获取错误信息:<br/>    <%=exception.fillInStackTrace()%><br></body>再次访问index.jsp页面,结果如下:This is my error.jsp我可以获取错误信息:java.lang.ArithmeticException: / by zero

10 isThreadSafe

作用:isThreadSafe表示该页面访问是否线程安全,默认为true。

isThreadSafe=false模式表示它是以Singleton模式运行。     该模式implements了接口javax.servlet.SingleThreadModel,     该模式同一时刻只有一个实例,不会出现信息同步与否的概念。     若多个用户同时访问一个这种模式的页面,     那么先访问者完全执行完该页面后,后访问者才开始执行。isThreadSafe=true模式表示它以多线程方式运行。    该模式的信息同步,需访问同步方法(用synchronized标记的)来实现。    一般格式如下:    public synchronized void method(...){      if(...) {         wait();      }      notifyAll();    }

11 isELIgnored

作用:设置页面是否禁用EL表达式,默认为false,即可用使用EL表达式,如果设置为true,则禁用EL表达式,${name}方式获取值则会默认当做字符串“${name}”输出。

12 session

作用:设置页面是否可以使用session隐含对象,默认为true。如果设置为false,则使用session对象是会页面报错,因为解析的java中没有默认初始化session对象,如session.setAttribute(“age”, “18”);则页面报错。
注意:session=”false”,只是没有了session隐含对象,但是可以自己创建session对象做其他操作,代码如下:

这是我的第一个JSP页面,JSP首页!<br/>    <%        request.setAttribute("name", "request");        HttpSession session = request.getSession();        session.setAttribute("age", "18");    %>    测试session的作用:<br/>    ${name}    <!-- 这里的session为自己在上面创建的对象,不是session隐含对象,可换成其他变量名称mySession -->    <%=session.getAttribute("age") %>**页面可正常获取域值:18**

14 trimDirectiveWhitespaces

作用:设置是否去除生成的页面中大量的空白行,默认为false,即不去除。设置为true,则去除大量的html空白行输出,效果如下:
页面输出代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Insert title here</title></head><body>    这是我的第一个JSP页面,JSP首页!<br/></body></html>

情况一:trimDirectiveWhitespaces默认为false的时候

      out.write("\r\n");      out.write("\r\n");      out.write("\r\n");      out.write("\r\n");      out.write("\r\n");      out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");      out.write("<html>\r\n");      out.write("<head>\r\n");      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n");      out.write("<title>Insert title here</title>\r\n");      out.write("</head>\r\n");      out.write("<body>\r\n");      out.write("\t这是我的第一个JSP页面,JSP首页!<br/>\r\n");      out.write("</body>\r\n");      out.write("</html>");

情况二:trimDirectiveWhitespaces=”true”的时候

out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");      out.write("<html>\r\n");      out.write("<head>\r\n");      out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n");      out.write("<title>Insert title here</title>\r\n");      out.write("</head>\r\n");      out.write("<body>\r\n");      out.write("\t这是我的第一个JSP页面,JSP首页!<br/>\r\n");      out.write("</body>\r\n");      out.write("</html>");

15 import

作用:引入其他类供调用,JSP页面默认引入了以下类,其他的需要自己引入。

import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;

<%@ page import="java.util.*"
则java.util下的所有类都可以在该JSP页面使用,没有引入则调用会报错:找不到该类。

16 总结

以上即使JSP中page指令的全部知识,更多的详情可以自己研究源码来查看。

0 0