JSP系列:(2)JSP基础-Page指令详解

3.2、page指令


作用: 告诉tomcat服务器如何翻译jsp文件

<%@ page

language="java"   --告诉服务器使用什么动态语言来翻译jsp文件

import="java.util.*" --告诉服务器java文件使用什么包(导入包),

                多个包之间用逗号分割

pageEncoding="utf-8"  --告诉服务器使用什么编码翻译jsp文件(成java文件)

contentType="text/html; charset=utf-8" --服务器发送浏览器的数据类型和内容编码。

                          注意:在开发工具中,以后只需要

                         设置pageEncoding即可解决中文乱码问题

errorPage="error.jsp" --指定当前jsp页面的错误处理页面。

isErrorPage="false"   --指定当前页面是否为错误处理页面。

              false,不是错误处理页面,则不能使用exception内置对象;

              true,是错误处理页面,可以使用exception内置对象。

buffer="8kb"        --jsp页面的缓存区大小。

session="true"      --是否开启session功能。false,不能用session内置对象;

               true,可以使用session内置对象。

isELIgnored="false"   --是否忽略EL表达式。

%>

 


【1】language="java"是固定写法

【2】import="java.util.*"是引入package,多个包之间用","分隔,例如:


jsp文件编码问题


【3】pageEncoding和contentType都涉及到编码的问题,但两者影响的是不同的阶段。

我们需要搞清楚,这里面哪些地方涉及到了编码。

(1)jsp文件存储时,需要编码。

jsp文件最终会以“字节(byte)”的形式存储在磁盘上,

所以需要将内存中的字符串参照某一个码表,转换为字节流输出。

(2)由jsp文件向java文件转换的时候需要两次转码。

第一次,将jsp文件读取到内存,是将字节流转换为字符流,需要转码;

第二次是将内存中的字符流转换为java文件的字节流,需要转码。

不过,这两次转码,都是参照pageEncoding指定的编码进行。

(3)由java文件向class文件转换,也需要两次转码。两次转码都是使用pageEncoding指定的编码。

(4)当用户访问jsp文件时,由class文件输出内容,需要两次转码。

第一次是从class文件读取出字符串的时,用到的是pageEncoding编码;

第二次是当Tomcat服务器向浏览器发送数据时,使用的是contentType中指定的编码。

(5)在浏览器中,也可以指定接收Tomcat服务器时的字符编码方式

JSP系列:(2)JSP基础-Page指令详解_第1张图片

技巧:如果我们在使用myEclipse的时候,只指定pageEncoding="utf-8",而省略contentType属性,    那么(1)(2)(3)(4)的涉及到的编码都会用pageEncoding指定的编码格式,从而解决中文乱码的问题。


异常错误相关的:


【4】errorPage是指定当前jsp页面的错误处理页面。

【5】isErorrPage是指定当前页面是否为错误处理页面。

false,不是错误处理页面,则不能使用exception内置对象;

true,是错误处理页面,可以使用exception内置对象。

示例:pageDemo.jsp,用errorPage指定错误页

<%@ page 
		language="java" 
		pageEncoding="utf-8"
		errorPage="common/errorPage.jsp"
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>page命令</title>
  </head>
  
  <body>
  	<%
  		//String name = null;
  		//int len = name.length();
  		
  		int a = 2;
  		int b = 0;
  		int c = a / b;
  	 %>
    这是我的测试<br>
  </body>
</html>

示例:errorPage.jsp,用isErrorPage="true"标识自身是错误页。

<%@ page 
	language="java" 
	import="java.util.*" 
	pageEncoding="utf-8"
	isErrorPage="true"
	%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>出现错误啦!!!</title>
  </head>
  
  <body>
    你访问的网页出错啦!!!网站管理员正在修复中。。。<br>
    错误原因:<%=exception.getMessage() %>
  </body>
</html>




配置全局的错误处理页面,需要在web.xml中配置:

  <!-- 全局错误处理页面配置 -->
  <error-page>
  	<error-code>404</error-code>
  	<location>/common/404.jsp</location>
  </error-page>
  <error-page>
  	<error-code>500</error-code>
  	<location>/common/500.jsp</location>
  </error-page>

 完整的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">
  <display-name></display-name>	
  
  <!-- 全局错误处理页面配置 -->
  <error-page>
  	<error-code>404</error-code>
  	<location>/common/404.jsp</location>
  </error-page>
  <error-page>
  	<error-code>500</error-code>
  	<location>/common/500.jsp</location>
  </error-page>
  
</web-app>

也可以按照错误的类型来跳转到相关的页面

  <error-page>
  	<exception-type>java.lang.NullPointerException</exception-type>
  	<location>/common/NullPointer.jsp</location>
  </error-page>
  <error-page>
  	<exception-type>java.io.IOException</exception-type>
  	<location>/common/IOExceptionPage.jsp</location>
  </error-page>




其它:

【6】session:是否开启session功能,可能通过查看由jsp转换成的java文件来验证这一点。

false,不能用session内置对象;

true,可以使用session内置对象。

【7】buffer:jsp页面的缓存区大小。默认的buffer的值是8kb。

JSP中有九大内置对象,其中一个是out对象,它的类型是JspWriter,具有缓冲功能,它的缓冲区的大小就是由buffer来指定的。

示例:我们可以将buffer设置为1kb进行测试,测验的目的是检验缓冲区的机制。out对象是JspWriter类型,具有缓冲区;而response.getWriter()得到的对象是PrintWriter类型,不具有缓冲区,会直接输出的内容,我们根据这两者的不同来检验缓冲区的机制。

<%@ page 
		language="java" 
		import="java.util.*" 
		pageEncoding="utf-8"
		buffer="1kb"
		%><%
	System.out.println("for之前查看缓存区大小:" + out.getBufferSize());//查看缓存区大小
	System.out.println("for之前查看剩余缓存区大小:" + out.getRemaining());//查看缓存区剩余大小
	
	//如果count取值为1023,那么1023个a占用1023个字节(byte)小于1KB,会稍后输出;
	//如果count取值为1024,正好占用1KB缓冲区空间,会先输出
	int count = 1023; 
	for(int i=0;i<count;i++)
	{
		out.write("a");
	}
	//out.flush();//刷新缓存
	System.out.println("for之后查看缓存区大小:" + out.getBufferSize());//查看缓存区大小
	System.out.println("for之后查看剩余缓存区大小:" + out.getRemaining());//查看缓存区剩余大小
	response.getWriter().write("hello");//response.getWriter()不带有缓冲区,会直接输出。
	out.write("a");
	System.out.println("最后查看缓存区大小:" + out.getBufferSize());//查看缓存区大小
	System.out.println("最后查看剩余缓存区大小:" + out.getRemaining());//查看缓存区剩余大小
 %>


【8】isELIgnore: 是否忽略EL表达式。



你可能感兴趣的:(jsp)