javaweb——jsp
1、jsp简介
什么是jsp,jsp有啥用?
- JSP全称Java Server Pages,是一种动态网页开发技术
- JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分( 哎! 实际上就是servlet)
- JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
当我们在第一次访问jsp页面的时候,在控制台下方我们会看到类似这样几个地址
-
catalina.home(安装目录):指向公用信息的位置,就是bin和lib的父目录。
-
catalina.base(工作目录):指向每个Tomcat目录私有信息的位置,就是conf、logs、temp、webapps和work的父目录
当我们打开工作目录会发现,Tomcat服务器会把我们的jsp页面翻译成为一个java源文件,并编译成字节码文件
打开这个源文件,我们会发现这样一段代码
通过源代码,我们发现,实际上HttpJspBase实际上继承了HttpServlet
所以通过以上我们发现,jsp其实就是Servlet
2、jsp的生命周期
jsp和servlet一样有四个阶段,所以说这也是jsp和servlet的相似之处。
-
编译阶段:
servlet容器编译servlet源文件,生成servlet类
-
初始化阶段:
加载与JSP对应的servlet类,创建实例,并调用它的初始化方法
-
执行阶段:
调用与JSP对应的servlet实例的服务方法
-
销毁阶段:
调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例
1、JSP编译
当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件。
编译的过程包括三个步骤:
- 解析JSP文件。
- 将JSP文件转为servlet。
- 编译servlet。
2、JSP初始化
容器载入JSP文件后,它会在为请求提供任何服务前调用jspInit()方法。如果您需要执行自定义的JSP初始化任务,复写jspInit()方法就行了,就像下面这样:
public void jspInit(){
// 初始化代码
}
3、JSP执行
jspService()方法需要一个HttpServletRequest对象和一个HttpServletResponse对象作为它的参数
void _jspService(HttpServletRequest request,
HttpServletResponse response)
{
// 服务端处理代码
}
4、jsp销毁
jspDestroy()方法
public void jspDestroy()
{
// 清理代码
}
3、jsp的三种语法
3.1、头部的page 指令
指令 | 描述 |
---|---|
<%@ page … %> | 定义网页依赖属性,比如脚本、缓存、报错页面 |
<%@ include … %> | 包含其他文件 |
<%@ taglib … %> | 引入标签库的定义 |
例如:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
3.1.1、page指令的相关属性
属性 | 描述 |
---|---|
buffer | 指定out对象使用缓冲区的大小 |
autoFlush | 控制out对象的 缓存区 |
contentType | 指定当前JSP页面的MIME类型和字符编码 |
errorPage | 指定当JSP页面发生异常时需要转向的错误处理页面 |
isErrorPage | 指定当前页面是否可以作为另一个JSP页面的错误处理页面 |
extends | 指定servlet从哪一个类继承 |
import | 导入要使用的Java类 |
info | 定义JSP页面的描述信息 |
isThreadSafe | 指定对JSP页面的访问是否为线程安全 |
language | 定义JSP页面所用的脚本语言,默认是Java |
session | 指定JSP页面是否使用session |
isELIgnored | 指定是否执行EL表达式 |
isScriptingEnabled | 确定脚本元素能否被使用 |
3.2、表达式脚本
3.3、jsp注释
<!--这是html注释-->
<%--这是jsp注释--%>
<%
// 单行 java 注释
/* 多行 java 注释 */
%>
4、jsp的九大隐含对象(内置对象)
对象 | 描述 |
---|---|
request | HttpServletRequest类的实例(请求对象) |
response | HttpServletResponse类的实例(响应对象) |
out | PrintWriter类的实例,用于把结果输出至网页上(jsp的输出流对象) |
session | HttpSession类的实例(会话对象) |
application | ServletContext类的实例,与应用上下文有关(ServletContext对象) |
config | ServletConfig类的实例(ServletConfig对象) |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问(jsp的上下文对象) |
page | 类似于Java类中的this关键字(当前的jsp对象) |
exception | exception 类的对象,代表发生错误的 JSP 页面中对应的异常对象 |
5、jsp的四大域对象(也可以说是jsp的四个作用域)
- pageContext (pageContextImpl类) 作用在当前jsp页面
- request (HttpServletRequest类) 作用于一次请求内
- session (HttpSession类) 作用与一个会话内
- application (ServletContext类) 作用于整个web工程
jsp的域对象就像java中的Map,是用来存值的。
四大域对象的优先顺序从小到大排序
6、jsp的常用标签
6.1、静态包含
应用场景
比如某博官网的底部的城市选项,每一页都是一样的,在写代码的时候能每页都写一样的代码,那当然是不能的,意思这里就会用到相同的代码,咱们把相同的代码放在比如a.jsp里,再在主页面去包含它就可以实现代码的复用。
<% include file ="/page/a.jsp"%>
6.2、动态包含
动态包含和静态包含的作用效果是一样的,只是底层实现不一样
写法:<jsp:include page="..." />
或者:<jsp:include page="..."> </jsp:include>
静态包含的本质:它的本质是文件的导入(不会对导入的文件进行编译)
动态包含的本质:它的本质是先编译包含的文件,然后再进行导入
6.3、jsp的请求转发
jsp的请求转发和servlet的请求转发相似
例如:
<jsp:forward page="/a.jsp"></jsp:forword>