21. JSP

概念

jsp 全称为 java server pages。jsp 的本质是 servlet

运行原理

第一次访问 jsp 页面时,会执行以下步骤:

  1. 服务器将 jsp 翻译为 java 文件
  2. 将翻译好的 java 文件编译为 class 文件
  3. 运行

第二次运行,若 jsp 文件没有被修改则不会在进行翻译和编译了。若 jsp 被更改了则会进行翻译和编译。

基本语法

指令

1
<%@ %>

脚本片段

1
<% %>

作用是可以在里面书写 java 代码。最终会被翻译在 java 文件中的 _jspService() 方法中。

表达式

1
<%= %>

作用是输出数据到页面

声明

1
<%! %>

作用是可以在里面书写 java 代码。最终会被翻译在 java 文件中的 class 中。

注释

1
<!--  -->

指令

语法格式为 <%@ 指令名 属性=属性值 属性2=属性值2 %>。常用的有 page,include ,taglib 指令。

page

  1. language,表示支持的语言,默认为 java,也只支持 java

  2. contentType,与 respons.setContentType() 作用一致。

  3. pageEncoding ,jsp 页面编码

  4. import,导包

  5. errorPage,当前页面报错需要显示的错误页面。

  6. isErrorPage,设置当前页面是否为错误页面。

1
2
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" errorPage="ErrorPage.jsp"%>

include

  1. file,将目标页面包含到当前页面。特点是静态包含,即被包含的文件不会被翻译和编译。而是将内容放到当前页面中进行统一的翻译和编译。
1
<%@ include file="NewFile.jsp" %>

动作标签

语法格式为 <jsp: 标签名 属性=属性值></jsp:>, 常见的动作标签有转发和动态包含

转发

  1. 带参数的写法 (注意: 开始和结束标签之间不能有空格和内容)
1
<jsp:forward page="NewFile.jsp"></jsp:forward>
  1. 不带参数的写法
1
2
3
<jsp:forward page="NewFile.jsp">
<jsp:param value="18" name="age"/>
</jsp:forward>

动态包含

特点是被包含页面会先被翻译和编译

1
<jsp:include page="NewFile.jsp"></jsp:include>

JSP中九个隐含对象

隐含对象是指可以直接在 jsp 中使用的对象,不需要直接 new 实例,由服务器new,并存放在 _jspService 方法中。

application

  1. 类型:ServletContext
  2. 作用:域对象
  3. Servlet 中的获取方式:this.getServletContext()

session

  1. 类型:HttpSession
  2. 作用:域对象
  3. Servlet 中的获取方式:request.getSession()

request

  1. 类型:HttpServletRequest
  2. 作用:域对象(除此之外在 Servlet 中还可以获取初始化参数,获取虚拟路径,转发等)
  3. Servlet 中的获取方式:直接使用

pageContext

  1. 类型:PageContext
  2. 作用:域对象,可以通过 pageContext 在 jsp 中获取其他八个隐含对象
  3. Servlet 中的获取方式:无

response

  1. 类型:HttpServletResponse
  2. 作用:与 Servlet 中的 response 一致(响应文本/html,重定向)
  3. Servlet 中的获取方式:直接使用

page

  1. 类型:Object
  2. 作用:当前类的对象

out

  1. 类型:JspWriter
  2. 作用:与 Servlet 中的 PrintWriter 作用类似(都继承了 java.io.Writer)

config

  1. 类型:ServletConfig
  2. 作用:与 Servlet 中的 ServletConfig 作用类似
  3. Servlet 中的获取方式:this.getServletConfig()

exception

  1. 类型:Throwable
  2. 作用:接收处理异常信息

JSP 四个域对象

按照范围从大到小的顺序分别为:application(当前项目中有效),session(当前会话中有效),request(当前请求中有效),pageContext(当前页面)

域对象共有的方法:

  1. getAttribute()
  2. setAttribute()
  3. removeAttribute()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<body>
当前页面设置
<%
application.setAttribute("name1", "san.zhang1");
session.setAttribute("name2", "san.zhang2");
request.setAttribute("name3", "san.zhang3");
pageContext.setAttribute("name4", "san.zhang4");
%>
当前页面获取
<%=application.getAttribute("name1")%> <!-- san.zhang1 -->
<%=session.getAttribute("name2")%> <!-- san.zhang2 -->
<%=request.getAttribute("name3")%> <!-- san.zhang3 -->
<%=pageContext.getAttribute("name4")%> <!-- san.zhang4 -->
</body>

当转发到 NewFile2.jsp 时

1
<jsp:forward page="NewFile2.jsp"></jsp:forward>
1
2
3
4
5
6
7
<body>
转发页面获取
<%=application.getAttribute("name1")%> <!-- san.zhang1 -->
<%=session.getAttribute("name2")%> <!-- san.zhang2 -->
<%=request.getAttribute("name3")%> <!-- san.zhang3 -->
<%=pageContext.getAttribute("name4")%> <!-- null -->
</body>

当使用超链接跳转到新的地址时

1
<a href="NewFile3.jsp">NewFile3.jsp</a>
1
2
3
4
5
6
7
<body>
跳转页面获取
<%=application.getAttribute("name1")%> <!-- san.zhang1 -->
<%=session.getAttribute("name2")%> <!-- san.zhang2 -->
<%=request.getAttribute("name3")%> <!-- null -->
<%=pageContext.getAttribute("name4")%> <!-- null -->
</body>