JSP 深入学习
# 110.JSP 深入学习
继续讲解如下内容:
- JSP 的指令、内置对象和注释
- MVC 开发模式
- EL 表达式
- JSTL 标签
- 三层架构
# JSP 中的指令
指令的作用:用于配置 JSP 页面,导入资源文件
格式:<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>
例如我们之前写的 index.jsp 的开头,就用到了 page 指令:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
这里设置了 content-type,以及用的是 Java 语言,还有很多属性,这里就不一一介绍了
指令分类:
- page 指令:配置 JSP 页面的,较少使用
- include 指令:导入页面的资源文件,极少使用
- taglib 指令:导入资源,例如标签(例如 Java 中导入一个类),用的较多
# page 指令
page 指令用来配置 JSP 页面,我们知道一些常见的属性就可以了。例如下面是一个 page 指令:
<%@ page contentType="text/html;charset=UTF-8" language="java" buffer="16kb"%>
常见的属性:
- contentType
- language
- buffer
- import
- errorPage,isErrorPage
详细说明如下:
contentType:等同于 response.setContentType()
,作用如下
设置响应体的 mime 类型以及字符集
设置当前 jsp 页面的编码
只能是高级的 IDE 才能生效,修改 charset 后,文件编码格式也会自动切换
如果使用低级工具,则需要设置 pageEncoding 属性设置当前页面的字符集
language:当初 JSP 被设计时,想要一举改变表现层的技术,支持多种开发语言;但直到如今,也只支持 Java。不能省略。
buffer:缓冲区,JSP 有个内置对象是 out 的,其有一个缓冲区,默认是 8kb,可以通过 buffer 修改大小
import:导包。例如使用 List 对象,需要导入:写了后相当于会在我们 JSP 转换的 Servlet 类里 import
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
2
errorPage:当前页面发生异常后,会自动跳转到指定的错误页面。和 isErrorPage
是配对的。
isErrorPage:标识当前也是是否是错误页面。默认值 false。如果设置成 true,可以使用内置对象 exception; 如果设置成 false,不可以使用内置对象 exception。
例如新建一个 500.jsp
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>服务器正忙...</h1>
<%
String message = exception.getMessage();
out.print(message);
%>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
14
然后在 index.jsp 里配置:
<%@ page contentType="text/html;charset=gbk" errorPage="500.jsp" pageEncoding="GBK" language="java" buffer="16kb" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%
int i = 3/0;
%>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
访问 index.jsp,会跳转到 errosPage.jsp
# include 指令
用来包含页面的,例如我们写了很多个 JSP 后,可以抽出公用的部分,做出一个单独的文件,然后在其他 JSP 里引入这个 JSP。我们来演示下,新建 top.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<h1>页面logo页面标题</h1>
2
新建 home.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@include file="top.jsp"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>hello</h1>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
那么 home.jsp 页面也会显示 top.jsp 的 h1 标签
# taglig 指令
导入资源的,例如导入第三方标签库。我们先演示下效果,后续再说有什么用
首先将涉及到的 jar 包放到 WEB-INF/lib
目录(可以去我的 GitHub 或 Gitee 下载),然后将 lib 目录 add 到 Library 中。
jstl-impl.jar
javax.servlet.jsp.jstl.jar
2
然后我们就可以引入标签库了:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
prefix:定义标签的前缀,可自行修改,uri 则是标签库的具体位置
然后我们就可以使用标签库了:前缀加冒号。一般用约定俗成的。
<c:out>
# JSP 的注释
- html 注释
<!-- -->
: 只能注释 HTML 代码片段。注意,在客户端看 HTML 代码中还是能看到注释 - JSP 注释
<%-- --%>
:可以注释所有(HTML 和 Java 代码),在客户端看 HTML 代码中看不到注释,推荐使用
<!--
<h1>hello</h1>
-->
<%--
<%
System.out.println("hi~~~~");
%>
--%>
<%--
<input>
--%>
2
3
4
5
6
7
8
9
10
11
12
13
14
# 内置对象
什么是内置对象:在 JSP 中不需要创建,可以直接使用的对象。这是因为 JSP 转换为 Servlet 的时候,这些对象已经声明好了。一共有 9 个内置对象:
变量名 | 真实类型 | 作用 |
---|---|---|
pageContext | PageContext | 域对象,当前页面共享数据,还可以获取其他八个内置对象(通过 getXXX 方法) |
request | HttpServletRequest | 域对象,一次请求访问的多个资源(转发) |
session | HttpSession | 域对象,一次会话的多个请求间 |
application | ServletContext | 服务器的域对象,所有用户间共享数据,范围最大 |
response | HttpServletResponse | 响应对象 |
page | Object | 当前页面(Servlet)的对象 相当于 this |
out | JspWriter | 输出对象,数据输出到页面上 |
config | ServletConfig | Servlet 的配置对象 |
exception | Throwable | 异常对象,只有设置了 isErrorPage 才能使用 |
我们可以通过转换后的 Java 代码里查看,在_jspService 方法里有如下定义:
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 01
- 中国网络防火长城简史 转载10-12
- 03
- 公告:博客近期 RSS 相关问题10-02