JavaWeb-04

什么是JSP?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Java Server Pages,它和servlet技术一样,都是Java中用于开发动态WEB资源的技术
JSP相当于Java + HTML
JSP最大的特点就是:有种写HTML代码的感觉,HTML只能提供静态的WEB资源
JSP技术允许在HTML页面中嵌套Java代码
对比Servlet有一个特别好的地方,可以对前端页面进行排版

JSP的执行过程:
JSP本质上就是一个Servlet程序
1.第一次访问JSP文件时,会在Tomcat的work目录下生成一个对应的java程序
例如:01hello.jsp ==> _01hello_jsp.java
2.根据这个java程序生成对应的class字节码文件
3.Tomcat服务器会加载这个class字节码文件,执行里面的代码,执行的本质其实是一个Servlet程序
4.如果是第二次访问这个JSP文件,不会重新生存对应的java程序,以及class文件,直接执行对应的class文件

这里Tomcat服务器会根据JSP文件和class文件的修改时间,来判断是否需要重新生成Java和编译之后的class文件

JSP语法规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1.JSP脚本
<%
只能是Java代码
%>
在JSP脚本中只能出现Java代码,不能出现其他的任何东西,例如:html代码
在JSP脚本中的代码会被JSP编译器原封不动的放到Servlet程序中的_jspService方法中

2.JSP表达式
<%=Java的表达式%>
例如:
<%= new Date()%>
<%=name%>
Java的表达式就是一条Java语句,但是在JSP表达式语法中不允许出现分号

3.JSP声明
<%!
定义变量,方法
%>
JSP声明的Java代码不会被编译到_jspservice方法中,而是定义在这个JSP文件对应的class类中,JSP声明中的变量是成员变量,方法可以认为是成员方法

4.JSP注释
<%-- 注释内容--%> 唯一推荐格式

JSP三大指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
JSP指令不是直接生成可视化文件,而是告诉JSP引擎如何处理JSP页面中的其他部分

JSP指令的基本语法:
<%@ 指令名 属性名="值"%>

1.include指令
include指令用于引入其他JSP页面,如果使用include指令引入其他的JSP页面,JSP引擎会把这两个JSP文件翻译成一个servlet,
所以include指令引入称之为静态引入

格式:
<%@include file="relativeURL"%>
这里要求file属性使用URL用来引入其他的JSP文件,这里URL必须是一个相对路径,如果使用"/",表示当前WEB项目的根目录

【注意】
1.被引入的文件必须符合JSP语法
2.被引入的文件可以使用HTML,JSP这些文件格式,JSP引擎也会按照JSP语法规则处理
小规范:
如果是静态的引入文件,通常会使用.jspf(JSP Fragments)作为文件后缀名
2.Page指令
用于定义JSP页面的各种属性,无论它在哪一个位置出现,都作用于整个JSP页面,书写要求:page指令最好放在页面的开始

page指令的常用语法:
<%@ page
[language = "java"],
[import = "pagename.* 或者class"],
[session = "true"],
[buffer = "nune | 8kB | sizekB"],
[autoFlush = "true | false"],
[errorPage = "relativeURL"],
[isErrorPage = "true | false"],
[pageEncode = "utf-8 | charSet"],
[contentType = "text/html;charset = utf-8"]
%>

使用errorPage设置当前页面的错误异常处理页面,在错误处理页面中,如果需要使用exception对象,必须设置isErrorPage="true"

一般情况下不会给每一个页面都设置ErrorPage,否则工作量太大了。

全局异常处理
在web.xml中配置
<error-page>
<!-- error-code 是要捕获的错误编号 -->
<error-code>404</error-code>
<!-- location 式异常处理页面所在位置 -->
<location>/common/404.jsp</location>
</error-page>

<error-page>
<!-- error-code 是要捕获的错误编号 -->
<error-code>500</error-code>
<!-- location 式异常处理页面所在位置 -->
<location>/common/500.jsp</location>
</error-page>

<error-page>
<!-- 这里是完整的包名.类名 -->
<exception-type>java.lang.NullPointerException</exception-type>
<!-- location 式异常处理页面所在位置 -->
<location>/common/error.jsp</location>
</error-page>
3.teblib指令

JSP和Servlet的分工

Servlet用来处理响应的数据
JSP用来处理Servlet转发过来的响应数据

内置对象

1
2
3
4
5
6
每一个JSP页面在第一次访问的时候,WEB服务器都会把JSP文件交给JSP引擎处理,处理之后,会出现一个非常重要的方法_jspservice,
本质就是Servlet里面的Service方法

JSP引擎在调用JSP对应的_jspService方法时,会提供给 _jspService方法9个开发相关的内置对象

1.九大内置对象
内置对象 对应的Servlet技术
request HttpServletRequest
response HttpServletResponse
application ServletContext
Session HttpSession
out jspWriter 类似于PrintWrite
pageContext pageContext
exception throwable
config Servletconfig
page Object(this) 很少使用
1
2
3
4
5
6
7
8
9
10
2.out    会有一个buffer缓存。 (自己的理解:JSPWriter对象)
out用于给客户端发送文本数据
out对象是通过pageContext对象里面的pageOut获取的,类似于response.getWriter()获取到的PrintWriter对象

3.pageContext
pageContext对象是JSP技术最重要的一个对象,这个pageContext表示当前JSP页面的运行环境
这个对象不仅封装了其他的8大内置(隐式)对象的引用,而且pageContext本身就是一个域对象,
可以用来保存数据。而且pageContext还封装了WEB开发中经常涉及到的一些常用操作
例如:
跳转其他资源,检索其他域对象的属性