JSP
- JSP全称是Java Server Page,基于Java和Servlet一样是sun公司推出的一套开发动态web资源的技术,称为JSP/Servlet规范。JSP的本质其实就是一个Servlet。
jsp是一种动态网页技术标准
,jsp部署在服务器上可以处理客户端的请求,并根据请求内容动态生成HTML、XML或其他格式文档的Web网页,再响应给客户端- JSP的内容(标签)转成Java文件也是使用
resp.getWriter().write
去实现的,
JSP和HTML以及Servlet的适用场景:
类别 | 适用场景 |
---|---|
HTML | 只能开发静态资源,不能包含java代码,无法添加动态数据。 |
Servlet | 写java代码,可以输出页面内容,但是很不方便,开发效率极低。 |
JSP | 它包括了HTML的展示技术,同时具备Servlet输出动态资源的能力。但是不适合作为控制器来用。 |
JSP执行过程:
Jsp指令:
使用指令需要jar包,在Tomcat目录下的lib中的
jsp-api.jar
,复制到IDEA即可
Page指令:
属性 | 描述 |
---|---|
buffer | JspWriter用于输出JSP内容到页面上。告知引擎,设定他的缓存大小。默认8kb |
autoFlush | 控制out对象的 缓存区 |
contentType | 告知引擎,响应正文的MIME类型。contentType=“text/html;charset=UTF-8” |
errorPage | 指定当JSP页面发生异常时需要转向的错误处理页面 |
isErrorPage | 告知引擎,是否抓住异常。如果该属性为true,页面中就可以使用exception对象,打印异常的详细信息。默认值是false |
pageEncoding: | 告知引擎,翻译jsp时(从磁盘上读取jsp文件)所用的码表。pageEncoding="UTF-8"相当于告知引擎用UTF-8读取JSP |
extends | 指定servlet从哪一个类继承 |
import | 导入要使用的Java类 |
info | 定义JSP页面的描述信息 |
isThreadSafe | 指定对JSP页面的访问是否为线程安全 |
language | 定义JSP页面所用的脚本语言,默认是Java |
session | 告知引擎是否产生HttpSession对象,即是否在代码中调用request.getSession()。默认是true |
isELIgnored | 告知引擎,是否忽略EL表达式,默认值是false,不忽略 |
isScriptingEnabled | 确定脚本元素能否被使用 |
Include指令:
JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
Include指令的语法格式如下:
<%@ include file="文件相对 url 地址" %>
Taglib指令:
JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
属性:
- uri:外部标签的URI地址。
- prefix:使用标签时的前缀。
Taglib指令的语法:
<%@ taglib uri="uri" prefix="prefixOfTag" %>
Jsp隐式对象:
什么是隐式对象呢?它指的是在jsp中,可以不声明就直接使用的对象。它只存在于jsp中,因为java类中的变量必须要先声明再使用。其实jsp中的隐式对象也并非是未声明,只是它是在翻译成.java文件时声明的。所以我们在jsp中可以直接使用。
隐式对象名称 | 类型 | 备注 |
---|---|---|
request | javax.servlet.http.HttpServletRequest | |
response | javax.servlet.http.HttpServletResponse | |
session | javax.servlet.http.HttpSession | Page指令可以控制开关 |
application | javax.servlet.ServletContext | |
page | Java.lang.Object | 当前jsp对应的servlet引用实例 |
config | javax.servlet.ServletConfig | |
exception | java.lang.Throwable | page指令有开关 |
out | javax.servlet.jsp.JspWriter | 字符输出流,相当于printwriter |
pageContext | javax.servlet.jsp.PageContext | 很重要 |
PageContext对象:
-它是JSP独有的对象,Servlet中没有这个对象。本身也是一个域(作用范围)对象,但是它可以操作其他3个域对象中的属性。而且还可以获取其他8个隐式对象。
生命周期:
PageContext是一个局部变量,所以它的生命周期随着JSP的创建而诞生,随着JSP的结束而消失。每个JSP页面都有一个独立的PageContext。
四大域对象:
域对象名称 | 范围 | 级别 | 备注 |
---|---|---|---|
PageContext | 页面范围 | 最小只能在当前页面用 | 范围小,开发中用的少 |
ServletContext | 请求范围 | 一次请求或当前请求转发用 | 请求转发后再次转发时请求域丢失 |
HttpSession | 会话范围 | 多次请求组数据共享时使用 | 多次请求共享数据,但不同的客户端不能共享 |
ServletContext | 应用范围 | 最大,整个应用都可以使用 | 如果对数据有修改需要做同步处理,少用 |
MVC模型:
- M(Model)模型:用于封装数据,封装的是数据模型
- V(View)视图:用于显示数据,动态资源用JSP页面,静态资源用HTML页面
- C(Controller)控制器:用于处理请求和响应
JSP代码演示:
<%--page指令--%>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"language="java" errorPage="error.jsp"
%><%--include指令 可以包含其他页面--%>
<%@include file="/include.jsp" %>
<!DOCTYPE html><%--taglib:可以引入外部标签库--%>
<%-- <%@taglib uri=标签库的地址 prefix=前缀名称 %> --%>
<%@taglib prefix="" %>
<html>
<head><title>JSP - Hello World</title>
</head>
<body>
<%--这是jsp的注释格式--%><%System.out.println("这个输出只能打印到控制台");out.println("这个才是输出到页面,但是没有换行<br>");
%><%--表达式--%>
<%="相当于out.println<br>"%>
<%= request.getAttribute("username”)%><%--声明变量和方法--%>
<%--加!代表声明的是成员变量不加!代表的是声明局部变量声明方法必须加!
--%>
<%! String s = "itzhuzhu";%>
<% String s = "itzhuzhu";// 隐式对象:可以直接调用request.getSession();response.getWriter().write("隐式对象:可以直接调用");pageContext.setAttribute("直接用","直接用");
%><%// 定义数组ArrayList<Object> objects = new ArrayList<>();
%>
<%=s%><%--定义方法--%>
<%! public void method() {System.out.println(s);
}%></body>
</html>