博客目录
1、JSP九大内置对象
2、JSP指令(page指令、include指令)
3、静态联编
一、JSP九大内置对象
1、JSP内置对象特点
- 由JSP规范提供,不由编写者实例化
- 通过Web容器实现和管理
- 所以JSP页面均可使用
- 只有在JSP表达式块和代码块中才可以使用<%= %>,<% %>
2、九大内置对象位置——编译后的Servlet文件中
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
final java.lang.String _jspx_method = request.getMethod();
if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
return;
}
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.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;
在编译页面后,类Servlet一般都会有如上所示的结构,其中内置对象request和response是_jspService()方法的形参,当Tomcat调用该方法是会初始化这两个对象。而page、pageContext、application、config、session、out都是方法_jspService()的局部变量,由该方法完成初始化
3、pageContext对象
pageContext代表JSP页面的上下文,功能是访问JSP之间的所有共享数据。使用pageContext对象可以访问page、request、session、application范围的变量,还可以获取其他内置对象如下
- ServletRequest getRequest():获取request对象
- ServletResponse getResponse():获取response对象
- ServletConfig getServletConfig():获取config对象
- ServletContext getServletContext():获取application对象
- HttpSession getSession():获取session对象
一旦JSP和Servlet编程中获取了pageContext对象,就可以通过它提供的方法来获取其他内置对象
4、request对象
内置对象request是JSP中最重要对象之一,每个request对象封装了一次用户请求,并且所有的请求参数都被封装在request对象中,因此request对象是获取请求参数的重要途径
例(一个表单处理例子)
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form id="form1" method="post" action="request.jsp">
用户名:<br>
<input type="text" name="name"><hr>
性别:<br>
男:<input type="radio" name="gender" value="男">
女:<input type="radio" name="gender" value="女">
<br>
喜欢的颜色:<br>
红:<input type="checkbox" name="color" value="红">
绿:<input type="checkbox" name="color" value="绿">
蓝:<input type="checkbox" name="color" value="蓝">
<br>
来自的国家:<br>
<select name="country">
<option value="AA">AAA</option>
<option value="BB">BBB</option>
<option value="CC">CCC</option>
</select>
<hr>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</body>
</html>
request.jsp
<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
<%
//获取所有请求头的名称
Enumeration<String> headerNames=request.getHeaderNames();
while(headerNames.hasMoreElements())
{
String headerName=headerNames.nextElement();
//获取每个请求及其对应的值
out.println(headerName+"-->"+request.getHeader(headerName)+"<br/>");
}
out.println("<hr>");
//设置解码方式,简体中文使用gb2312解码
request.setCharacterEncoding("utf-8");
//下面依次获取表单域的值
String name=request.getParameter("name");
String gender=request.getParameter("gender");
//如果某个请求参数有多个值,将使用该方法获取多个值
String[] color=request.getParameterValues("color");
String national=request.getParameter("country");
%>
<!-- 下面依次输出表单域的值 -->
你的姓名:<%=name %><br>
你的性别:<%=gender %><br>
<!-- 输出复选框获取的数组值 -->
你喜欢的颜色:
<%
for(String c:color){out.println(c+" ");}
%>
<hr>
你来自的国家:<%=national %><hr>
</body>
</html>
用户请求方式及结果
5、session对象
JSP中的session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间,在JSP页面中,session的会话是HttpSession类的实例
6、application对象
因为application对象代表Web应用本身,所以使用application来操作Web应用的相关数据。application对象实现了用户间数据的共享,可以存放全局变量。application开始于服务器的启动,直到服务器关闭时结束,在这段时间内application对象一直存在。在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作,在任何地方对此对象属性的操作,都将影响到其他用户的访问。服务器的启动和关闭决定了application对象的生命。application对象是ServletContext类的实例
7、response对象
response对象把作为JSP页面处理结果返回给用户的响应存储在该对象中,并提供了设置响应内容,响应头以及重定向的方法,例如cookie、头信息等,在大多数情况下,程序无法使用response来响应客户端请求,因为使用out响应对象的方法更简单。但是out是JspWriter的实例,JspWriter是Writer的子类,Writer是字符流,无法输出非字符内容,如果需要在JSP页面动态生成一幅位图,或者输出一个pdf文档,使用out作为响应对象无法完成,此时必须使用response作为响应输出
8、config对象
在JSP页面中,对象config代表当前JSP配置信息,该对象在JSP页面中比较少用,常用在Servlet中
9、out对象
对象out代表一个页面输出流,功能是在页面上输出变量值及常量。通常使用在输出表达式的地方都可以使用out对象来达到同样的效果,输出对象out中常用的方法如下
- print或println:输出数据
- newLine:输出换行字符
- flush:输出缓冲区数据
- close:关闭输出流
- clear:清除缓冲区中数据,但不输出到客户端
- clearBuffer:清除缓冲区中数据,输出到客户端
- getBufferSize:获得缓冲区大小
- getRemaining:获得缓冲区中没有被占用的空间
- isAutoFlush:是否为自动输出
例
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
<%
int sum=5;
out.println(5);
%>
</body>
</html>
客户浏览器显示结果
10、exception对象
对象exception是Throwable的实例
功能:表示JSP脚本程序中产生的错误和异常。因为JSP脚本包含的所有可能出现的异常都可以叫诶处理页面处理,所以JSP程序员不要处理异常,即使该异常是checked异常
在JSP中,被调用的错误页面的结果,只有在错误页面中才可使用,也就是说在页面指令中设置
<%@ page isErrorPage="true"%>
异常处理
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
errorPage="error.jsp"
pageEncoding="UTF-8"%>
<!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>JSP异常机制</title>
</head>
<body>
<%
int a=9;
int c=a/0;
%>
</body>
</html>
error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
isErrorPage="true"
pageEncoding="UTF-8"%>
<!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>异常处理页面</title>
</head>
<body>
异常类型:<%out.println(exception.getClass()); %>
异常信息:<%out.println(exception.getMessage()); %>
</body>
</html>
浏览器异常结果
二、JSP指令(page指令、include指令)
1、JSP指令分类
- page指令:页面指令
- include指令:包含指令
- taglib指令:标签库指令(之后的博客再对该指令解析)
2、JSP指令作用
- 为当前页面做一些基本属性设置
- 为当前页面的运行提供基本环境
3、语法格式
<%@ 指令名称 属性名=属性值 属性名=属性值....%>
4、page指令
常用的属性
<%@ page
language="java"
contentType="text/html; charset=UTF-8"
errorPage="error.jsp"
pageEncoding="UTF-8"
import="java.util.*"
session="true"
buffer="none|8kb|size kb"
autoFlush="true"
isErrorPage="false"
%>
解析
- language:声明当前JSP页面使用的脚本语言,因为是JSP页面,所以默认是Java,也只能是Java
- contentType:用于设定生成的网页的文件格式和编码字符集,即MIME类型和页面字符集类型。默认的MIME是text/html,默认的字符集类型是ISO-8859-1
- errorPage:设置错误处理页面,如果出现异常,跳转到指定错误页面
- pageEncoding:设置生成网页的编码字符集
- import:用于导入包,以下几个包默认自动导入,不用显示导入
- java.lang.* \javax.Servlet.* \javax.Servlet.jsp.* \javax.Servlet.http.*
- session:设置这些JSP页面是否需要HTTPSession
- buffer:设置输出缓冲区的大小。输出缓冲区的JSP内置对象out用于缓存JSP页面对客户浏览器的输出,默认值是8kb,也可以设置为none,也可为其他值,单位是kb
- autoFlush:当输出缓冲区即将溢出时,设置是否需要强制输出缓冲区的内容。如果设置为true则表示正常输出,如果设置为false,表示会在buffer溢出是产生一个异常
- isErrorPage:设置本JSP页面是否错误处理程序
5、include指令 <%@ include file=”/xxx.jsp”%>
- JSP中使用include指令后,可以将一个外部文件嵌入到当前的JSP文件中,同时解析这个页面的JSP语句
- include指令是一个静态的include语句,能够把目标页面的其他编译指令也包含进来,两个文件的变量是通用的
- include指定包含的文件可以是JSP,也可以是HTML
例
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
This is index.jsp<br>
<%@include file="/other.jsp" %>
<br>
<%
out.println(otherName);
%>
</body>
</html>
other.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
this is other.jsp
<%
String otherName="other99999";
%>
</body>
</html>
客户浏览器显示结果
三、静态联编
根据以上include指令后,查看Tomcat的work下的相关子目录,只生成了一个index_jsp.java的Servlet源文件,并没有生成other_jsp.java文件
因为JSP翻译引擎在翻译时,会将include指令所指定的文件内容直接翻译到当前JSP对应的Servlet中,形成一个.java文件。
这就说明一个问题,这个是包含操作,是在编译之前完成的,在编译之前由JSP翻译引擎完成的,不是在程序运行期完成的,这种包含是一种静态包含————静态联编
使用include指令的优点
因为有些网站的头部底部左侧,在很多页面都是相同的,使用include可以减少重复性工作,可以使用include指令,实现“一改全改”效果