Java-JSP其他主题
一、JSP的内置对象
(一)什么是内置对象?
内置对象指的是服务器已经创建好的对象,可以直接使用
JSP一共有9个内置对象
request、response、out、page、pageContext、session、application、exception、config
(二)知识点1:request与response内置对象
jsp翻译成.java文件后,会在_jspService(request,response),直接在该方法体内直接使用,就是内置对象
|
|
(三)知识点2: out、page内置对象
在JSP的_jspService方法中,有out,page对象,如下所示:
?? javax.servlet.jsp.JspWriter out = null;
??final java.lang.Object page = this;
??out = pageContext.getOut();
可见,out的类型是JspWriter,page即当前类(jsp翻译成servlet类)对象;
??out可以用来输出内容到客户端,但是程序员一般不会使用,因为直接使用<%=%>即可以实现输出;
??page也很少使用,与this相同
(四)知识点3: pageContext、session、application内置对象
1.pageContext
- 是servlet.jsp.PageContext类型的对象,
- 指的是页面的上下文,封装了其他的内置对象,由pageContext对象能够得到其他8个内置对象
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
JspWriter writer=pageContext.getOut();
Object p=pageContext.getPage();
pageContext.getException();
pageContext.getRequest();
pageContext.getResponse();
pageContext.getServletConfig();
pageContext.getServletContext();
pageContext.getSession();
%>
- 同时代表的是四大作用域【页面、请求、会话、上下文】中的页面作用域,也可以在页面上下文范围添加属性
只能在当前页面有效,不能跨页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
pageContext.setAttribute("name", "zs");
%>
<%=pageContext.getAttribute("name")%>
2.session
session是JSP中的另一个内置对象,是HttpSession类型的对象,可以在JSP中调用HttpSession接口中的任何方法;默认情况下,session内置对象存在;可以通过指令设置不存在:session="false",在页面上不能使用session内置对象了
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
session.setAttribute("name", "lisi");
%>
<%=session.getAttribute("name") %>
3.application
是ServletContext类型的对象,可以在JSP中调用ServlletContext接口中的任何方法
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
<%
application.setAttribute("name", "wangwu");
%>
<%=application.getAttribute("name") %>
(五)知识点4: exception内置对象
- 在jsp指令添加: isErrorPage="true"
- 才能在页面使用exception内置对象
_jspService()方法里会生成exception对象:
java.lang.Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
(六)课堂练习
1.目标
- 在exception页面输出异常信息
- 在另一个jsp页面引发exception,并且制定错误页面
2.步骤
(1)在exception页面输出异常信息(a.jsp)
- 配置指令 isErrorPage=”true”
- 输出异常信息:<%=exception.getMessage()%>
<%@ page contentType="text/html;charset=UTF-8" language="java"
isErrorPage="true" %>
Title
<%=exception.getMessage()%>
(2)在另一个jsp页面(b.jsp)引发exception,并且制定错误页面(a.jsp)
- 指定错误页面: errorPage=”a.jsp”
- 引发异常:int i=1/0;
<%@ page contentType="text/html;charset=UTF-8" language="java"
errorPage="a.jsp" %>
Title
<%int i = 1 / 0;%>
<%=i%>
(3)测试
(七)知识点5: config内置对象
- ServletConfig类型对象,通过pageContext.getServletConfig()得到
- 在JSP中可以直接使用config对象调用ServletConfig接口中任意方法
(八)课堂练习
1.目标
- 将jsp在web.xml配置初始化的参数
- 在jsp中使用ServletConfig对象得到参数的值
2.步骤
(1)将jsp在web.xml配置初始化的参数
testjsp
/h.jsp
name
zhaoliu
testjsp
/testjsp
(2)在jsp中使用ServletConfig对象config.getInitParameter(name)得到初始化参数的值
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
Insert title here
<%=config.getInitParameter("name")%>
(九)总结
1.什么是内置对象?
服务器创建好的对象,直接使用的对象叫内置对象
2.JSP内置对象有哪些?
request 请求对象
response 响应对象
out 输出对象JspWriter out.write() out.print()
page jsp翻译成servlet类的对象 page=this
pageContext 页面作用域对象 不能跨页面,setAttribute(name,value) getAttribute(name) removeAttribute(name) 能得到其他8个内置对象
session HttpSession类型的对象 会话对象 setAttribute(name,value) getAttribute(name) removeAttribute(name) 默认情况下,session内置对象存在;可以通过指令设置不存在:session="false",在页面上不能使用session内置对象了
application ServletContext类型的上下文对象 setAttribute(name,value) getAttribute(name) removeAttribute(name)
config ServletConfig对象
1.web.xml配置jsp为servlet
2.f.jsp
<%=config.getInitParameter("name")%>
exception 异常对象 默认不存在
1.设置指令 isErrorPage="true"
2.exception.getMessage()
3.引发异常页面
1.errorPage="g.jsp"
2.int i=1/0;
3.哪几个内置对象比较“特殊”?
1.其中pageContext对象封装了所有其他的内置对象;
2.session默认存在,可以通过指令配置为不存在 session="false";
3.exception默认不存在,当页面被指定为错误页面时才能使用isErrorPage="true"
二、指令和动作
(一)知识点1: JSP page指令标签的作用与特性
1.指令作用
- 影响容器翻译生成Java类的整体结构
2.指令的语法
- <%@ directive {attr=“value”}%>;
- 其中,directive为指令名,attr指该指令对应的属性名,一个指令可能有多个属性;
3.jsp常用的指令
- JSP中常用的指令有三个:page、include、taglib
4.page指令
- page指令是最为复杂的一个指令,共有13个属性;
- page指令作用于整个JSP页面,可以将指令放在JSP页面任何一个位置
(1)import属性
import属性:用来引入JSP文件需要使用的类
<%@page import="java.util.*,java.io.*" %>
<%@page import="com.etc.vo.*" %>
上述代码可以在JSP文件中使用,引入JSP需要使用的Java类;
可以使用逗号同时引入多个包,也可以在一个JSP文件中多次使用import;
值得注意的是,import是page指令中唯一一个可以在一个JSP文件中多次出现的属性,其他属性在一个JSP文件中只能出现一次
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%List str = new ArrayList<>();%>
(2)pageEncoding属性:用来设置JSP文件的页面编码格式
- <%@page pageEncoding=“utf-8"%>
- 上述代码设置当前JSP的页面编码格式是utf-8。
(3)session属性
- session属性:用来设置JSP页面是否生成session对象。该属性默认值为true,可以设置成false。
???如下代码所示:
- <%@page session="false"%>
- session属性值设置为false后,该JSP翻译生成的类中将没有内置对象session,该JSP不参与会话,页面不携带session。
(4)errorPage属性:
- 设置JSP页面的错误页面。当JSP中发生异常或错误却没有被处理时,容器将请求转发到错误页面;
(5)isErrorPage属性
- 默认值是false,可以设置为true。在JSP的错误页面中,将isErrorPage设置为true,则该页面翻译生成的Java类中,将生成exception内置对象。在error.jsp中加入代码:435
- <%@page isErrorPage="true"%>
- 上述代码将error.jsp页面设置为错误页面,所以,在error.jsp翻译生成的Java类中的_jspService方法中将生成exception内置对象
- 注意:即使一个页面没有设置isErrorPage=“true”,也可以作为错误页面使用,区别在是否有exception内置对象产生。
(二)知识点2: JSP include、taglib指令标签的使用
include指令是JSP中另外一个常用指令,用来静态包含其他页面;
所谓静态包含,指的是在翻译期间,把包含的页面也翻译到当前页面的Java文件中,也就是Java源文件即实现“二合一”
例如,在main.jsp中编写如下代码:
<%@include file="copyright.jsp"%>
过程:翻译main.jsp时,会把copyright.jsp文件翻译后插入到main.jsp翻译生成的.java文件中的相应位置;
|
|
Taglib指令的语法:
<%@ taglib uri="uri" prefix="prefixOfTag" %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀
(三)知识点3: JSP include动作标签的使用
JSP规范中定义了一系列的标准动作。Web容器按照规范进行了实现,可以解析并执行标准动作;
1.标准动作使用标准的XML语法。
其中action_name表示标准动作的名字,attribute1和attribute2是标准动作的若干个属性;
2.include动作:在JSP页面中,进行动态包含,
例如:
3.课堂练习
(1)目标
动态包含
(2)步骤
①head.jsp
②main2.jsp
|
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 我是head内容 |
|
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> "Content-Type" content="text/html; charset=UTF-8"> 我是main内容 |
(四)知识点4: 动态include与静态include的差异
include标准动作与include指令都是实现包含其他页面的功能;
include标准动作的属性是page,实现动态包含,发生在请求阶段;
include指令的属性是file,实现静态包含,发生在翻译阶段。
(五)知识点5: JSP其他动作标签简述
1.forward动作:在JSP页面中进行请求转发,
如下代码所示:
上述代码将把请求转发到loginsuccess.jsp页面,类似在Servlet中调用RequestDispatcher的forward方法进行请求转发。
|
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> "Content-Type" content="text/html; charset=UTF-8"> |
|
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> "Content-Type" content="text/html; charset=UTF-8"> n.jsp |
2.param动作:往往作为子动作使用,为forward和include动作传递参数
上述代码使用param为forward和include动作传递参数,参数将被作为请求参数传递
|
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> "Content-Type" content="text/html; charset=UTF-8"> |
|
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> "Content-Type" content="text/html; charset=UTF-8"> n.jsp <%=request.getParameter("name")%> |
注意事项
使用标准动作时,一定注意正确结束标准动作,如
如果标准动作没有动作体,就可以直接结束,如
(六)总结
1.page指令有哪些常用属性?
import 引入java类 唯一一个可以多次使用的属性
pageEncoding 设置jsp页面的编码格式
errorPage 设置定位错误页面
isErrorPage 设置错误页面
session 会话可以使用
??contentType 设置内容类型
2.include指令和include动作有什么区别?
include指令静态包含 翻译二合一(<%@ include file=”” %>)
include动作动态包含 翻译2个.java 请求运行动态包含进来(
3.
????