1.JSP是什么?
- JSP的全名是:Java Server Pages ,由它的全名可知。它就是java的服务器页面。因为用Servlet传html页面很繁琐,所以出现了Jsp来回传html页面数据。
Jsp的本质其实就是一个servlet程序。
原因:
- Tomcat服务器在解析项目时,会将.jsp文件翻译为.java和.class文件。
- .jsp文件被服务器翻译为.java文件后,我们发现其继承了HttpJspBase,而HttpJspBase又继承了HttpServlet,也就是说翻译出来的jsp页面是一个Servlet程序。
2.JSP头部的page指令:
page指令可以修改jsp页面中一些重要的属性,或者行为。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
- language 表示jsp翻译后时什么语言,这里暂时只支持java。
- contentType 表示jsp返回的数据类型是什么,也是源码中response.setContentType()属性的值。
- pageEncoding 表示当前jsp文件本身的字符集。
- import 用于导包。
- autoFlush 设置当out输出流缓冲区满了以后,是否自动刷新缓冲区,默认值是true。
- buffer 设置out缓冲区的大小,默认是8KB。
- errorPage 当jsp页面运行时出错,跳转到该属性设置的页面去。
- isErrorPage 设置当前jsp页面是否是错误信息页面,默认是false,如果是true可以获取异常信息。
- session 设置访问当前jsp页面,是否会创建HtppSession对象,默认是true。
- extends 设置jsp翻译称为servlet程序,翻译的java类默认继承谁。
3.JSP中常用的脚本
- 声明脚本
- 格式:<%! %>
- 作用:可以给jsp翻译出来的java类定义属性和方法甚至是静态代码块,内部类。
- 表达式脚本
- 格式:<%= %>
- 作用:在jsp页面上输出数据
- 特点:所有的表达式脚本都会被翻译到_jspService()方法中;表达式脚本都会被翻译成为out.print()输出到页面上;由于表达式脚本翻译的内容都在_jspService()中,所以_jspService()方法中的对象都可以直接使用;表达式脚本中的表达式不能以分号结束;
- 代码脚本
- 格式:<% %>
- 作用:可以在jsp页面中编写我们自己需要的功能(java语句)
- 特点:代码脚本翻译后都在_jspService方法中;代码脚本由于翻译到_jspService中,所以在_jspService()方法中的现有对象都可以直接使用;还可以由多个代码脚本块组合完成一段完整的java语句。
4.JSP的三种注释:
- html注释 <!-- 这是html注释 -->,html注释会被翻译到java源代码中,会被输出到客户端。
- java注释 // 单行java注释;/* */ 多行java注释。会被翻译到java源代码中。
- jsp注释 <%-- 这是jsp注释 --%> jsp注释会注掉jsp页面中所有的代码。
5.JSP的九大内置对象:
jsp中的内置对象指Tomcat在翻译jsp页面成为Servlet源代码后,内部提供的九大对象,叫内置对象。
- request 请求对象
- response 响应对象
- pageContext jsp的上下文对象
- session 会话对象
- application ServletContext对象
- config ServletConfig对象
- out jsp输出流对象
- page 指向当前的jsp对象
- exception 异常对象
其中,四个域对象为:pageContext 当前jsp页面范围内有效
request 一次请求内有效
session 一个会话范围内有效(打开浏览器访问服务器,直到关闭)
application 整个web范围内都有效(只要web工程不停止,数据一直都在)
域对象是可以像Map一样存取数据的对象。四个域对象功能一样,不同的是它们对数据的存取范围。
虽然四个域对象都可以存取数据,在使用上它们是有优先顺序的(从小到大进行使用):
pageContext----->request------>session------>application
out输出和response.getWriter输出:
response中表示响应,我们经常用于设置返回给客户端的内容(输出),out也是给用户做输出使用的。
区别:当jsp页面中的代码执行完成后会做以下两个操作:
- 执行out.flush()操作,会把out缓冲区中的数据追加写入到response缓冲区末尾。
- 会执行response的刷新操作,把数据全部写给客户端。
总结:由于jsp翻译后,底层代码都是使用out来进行输出,所以一般情况下,我们在jsp页面中统一使用out来进行输出,避免打乱页面输出的顺序;
由于out.write()输出字符串不会出错,out.print()输出任意数据都不会出错(该方法将数据都转化为字符串后再调用write()输出)。所以在jsp页面中,可以统一使用out.print()来进行输出。
6.JSP常用的标签
1.静态包含(常用)
格式: <%@ include file="" %>
解释: file属性表示要包含的资源路径。
特点: 1. 静态包含不会翻译被包含的jsp页面。
2.静态包含其实是把被包含的jsp页面的代码拷贝到包含的位置执行输出。
2.动态包含
格式: <jsp:include page=""></jsp:incliude>
解释: page属性表示要包含的资源路径。
特点: 1.动态包含会翻译被包含的jsp页面。
2.动态包含底层使用如下代码去调用被包含的jsp页面执行输出:
JspRuntimeLibrary.include(request, response, "/include/foot.jsp", out, false);
解析:使用包含的jsp将自己的request, response, out对象传递给被包含的jsp,然后被包含的jsp页面会用传递过来的out对象来给使用包含的jsp页面里的out缓冲区写数据,这样子就实现了包含关系。
3.动态包含可以传递参数。 <jsp:param name="username" value="user1"/>
3.请求转发
格式:<jsp:forward page=""></jsp:forward>
解释:其作用和 request.getRequestDispatcher(" ").forward(request,response) 方法一样,page属性设置请求的转发路径。