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