简述
jsp是java server page的缩写,即java服务器端页面,可以理解为一个特殊的页面。JSP页面是由HTML语句和嵌套在其中的Java代码组成的一个普通文本文件。其中既可以直接定义html的标签,也可以定义java代码。一句很精髓的话:servlet就是在java里写html代码,jsp就是在html里写java代码。
在JSP页面中编写的Java代码需要嵌套在<%和%>中,嵌套在<%和%>之间的Java代码被称之为脚本片段(Scriptlets),没有嵌套在<%和%>之间的内容被称之为JSP的模版元素。
应用场景
如果一个页面既有动态资源,又有静态资源,那么如果用servlet来干的话,就必须从response获得输出流输出动静资源到页面,光从代码上就非常的复杂,你写标签还要放在函数里面,没有代码提示还得自己缩进对齐。
jsp的原理
我们可以把jsp理解为一种特殊的servlet类形式,客户端请求服务器,服务器解析请求消息,则会找到对应的jsp资源,然后服务器就会把jsp文件转换为.java类文件,然后编译.java变为.class字节码文件提供servlet服务。其中的转换是由tomcat来做的。
我们通过查看被转化的jsp页面,即xxx.java文件,可以看到被自动转换的jsp变成了一个java类,它继承HttpJspBase,然后我们查看HttpJspBase的源码,发现它继承HttpServlet,所以逻辑很清晰了,jsp本质上就是一个servlet
我们也从HttpJspBase类中找到了service方法:
转换的过程很好理解,就是把html的页面代码放到response输出流的write方法里,然后被<%%>括住的原封不动。
jsp脚本
jsp提供了三种的脚本定义方式:
<% 代码 %> | 定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么. |
<%! 代码 %> | 定义的java代码,在jsp转换后的java类的成员位置。 |
<%= 代码 %> | 定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。 |
jsp的内置对象
内置对象就是在jsp的页面中,不需要创建和获取,可以直接使用的对象。
一共有9个内置对象。
首先是<%%>脚本里的代码会放到service方法里,所有request对象和response对象可以直接用。
一个字符输出流对象out,和response的getWriter类似,out对象可以直接用于输出页面(使用print方法)。
需要注意的是,tomcat服务器真正地给客户端做出响应之前,会现在response缓冲区拿数据,再到out缓冲区拿数据,所以response的输出永远比out的快。
所以我们一般用out输出,不混用response。
jsp的9个内置对象:
变量名 | 真实类型 | 作用 |
request | HttpServletRequest | 一次请求访问的多个资源(转发) |
response | HttpServletResponse | 响应对象 |
out | JspWriter | 输出对象,数据输出到页面上 |
session | HttpSession | 一次会话的多个请求间 |
pageContext | PageContext | 当前页面共享数据,还可以获取其他八个内置对象 |
application | ServletContext | 所有用户间共享数据 |
page | Object | 当前页面(Servlet)的对象 this |
config | ServletConfig | Servlet的配置对象 |
exception | Throwable | 异常对象 |
jsp的指令
jsp的指令是用于配置jsp页面以及导入资源文件。
<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %> | 配置jsp指令 |
page指令
page用于配置jsp页面
contentType:等同于response.setContentType()
1. 设置响应体的mime类型以及字符集
2. 设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要设置pageEncoding属性设置当前页面的字符集)
import:导包
errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
isErrorPage:标识当前也是是否是错误页面。
* true:是,可以使用内置对象exception,exception可以getMessage获取错误信息
* false:否。默认值。不可以使用内置对象exception
include指令
include表示页面包含的,导入页面的资源文件
taglib指令
taglib用于导入资源,例如我们可以导入标签库,以jstl为例
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> | prefix:前缀,自定义的,可以理解为导入资源的命名空间 |
jsp页面的注释
jsp页面有html也有java,这也就意味着有两种注释形式
html注释格式:<!-- --> ,它只能注释html代码片段
jsp注释格式:<%-- --%> ,它能注释所有内容