一、JSP概述
1、JSP结构
网络服务器需要一个jsp引擎,也就是一个容器来处理jsp页面,容器用来截获对jsp页面的请求,jsp容器和服务器共同合作,为jsp的正常运行提供必要的运行环境和其他服务,并且能识别出专属于jsp网页的特殊元素。
2、JSP运行流程
- 对jsp的请求就像其他普通网页的请求一样,浏览器会发送一个HTTP请求给服务器,web服务器识别出这是一个对jsp页面的请求,将该请求传递给jsp引擎(通过使用url或者.jsp来完成)
- jsp引擎从磁盘中载入jsp页面,然后将他们转化成servlet(这种转化只是简单的将所有模板文本改用成println()语句),并且将所有的jsp元素转化成java代码
- jsp引擎将servlet编译成可执行类,并且将原始请求传递给servlet引擎
- web服务器的某组件将会调用servlet引擎,然后载入并执行servle类,在执行过程中,servlet类会产生HTML格式的输出并将其内嵌于HTTP response中上交给服务器,web服务器以静态HTML网页的形式将HTTP response返回到浏览器中。最终,浏览器处理HTTP response中动态产生的HTML网页,就像在处理静态网页一样
3、JSP生命周期
阶段 | 说明 |
---|---|
编译阶段 | jsp容器编译jsp引擎转化成的servlet源文件,生成servlet类 |
初始化阶段 | 加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法 |
执行阶段 | 调用与JSP对应的servlet实例的服务方法 |
销毁阶段 | 调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例 |
二、JSP语法
1、JSP脚本
jsp脚本就是java代码片段,分为以下三种
<%...%>:Java语句
<%=...%>:Java表达式
<%!...%>:Java定义类成员,在类中添加方法或成员
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--java语句--%>
<%
String sout = "Hello,java语句";
//不会输出到客户端,而是再控制台打印
System.out.println(sout);
%>
<%--java表达式--%>
//在客户端浏览器输出展示
<%=sout%><br>
<%="我是中国人,我爱中国!!!"%>
</body>
</html>
输出
2、JSP指令
指令 | 说明 |
---|---|
page | 用于定义 JSP 页面的各种属性 |
include | 静态包含指令,用于引入其它 JSP 文件。使用 include 指令引入的其它 JSP 文件,JSP 引擎将把这两个 JSP 文件翻译成一个 servlet,所以将 include 称为静态包含 |
taglib | 用于在 JSP 页面中导入标签库(JSP 标准标签库、第三方标签库、自定义标签库) |
注:page 是最复杂的一个指令,它的属性很多,常用的属性有 import、language、pageEncoding 等,下面列出常见属性
属性名 | 取值范围 | 说明 |
---|---|---|
import | 任何包名,类名 | 引入该JSP中用到的类、包等 |
language | java | 解释该JSP文件时采用的语言,一般为java语言,默认为java |
pageEncoding | utf-8 | 指定一张码表来对该JSP页面进行编码 |
contentType | 有效的文档类型 | 客户端浏览器根据该属性判断文档类型,例如 HTML格式为text/html |
errorPage | 某个jsp的相对路径 | 指明一个错误页面,如果该JSP程序抛出一个未捕捉的异常,则转到errorPage指定的页面 |
isErrorPage | true||false | 指定该页面是否为错误显示页面 |
注:
- import是唯一可以声明多次的page指令属性,一个import可以引用多个类,中间用英文逗号隔开,如<%@ page import="java.util.List,java.lang.String"%>
- errorPage指定的页面通常isErrorPage属性为true,且内置的exception对象为未捕捉的异常
3、JSP内置对象
JSP提供了由容器实现和管理的内置对象,也可以称之为隐含对象,由于JSP使用Java作为脚本语言,所以JSP将具有强大的对象处理能力,并且可以动态创建Web页面内容。但Java语法在使用一个对象前,需要先实例化这个对象,这其实是一件比较烦琐的事情。JSP为了简化开发,提供了一些内置对象,用来实现很多JSP应用。在使用JSP内置对象时,不需要先定义这些对象,直接使用即可
内置对象 | 说明 |
---|---|
request | 请求对象 |
response | 响应对象 |
session | 一次会话,在服务器端记录用户状态信息 |
application | 标识web应用上下文 |
exception | 表示发生异常对象 |
page | 代表当前JSP页面,是当前JSP编译后的Servlet类的对象,相当于this |
config | 标识Servlet配置 |
out | 输出响应体 |
pagecontext | 表示jsp页面上下文 |
- request对象
- session对象
- application对象
方法 | 说明 |
---|---|
String getInitParameter(String name) | 获取已命名的应用程序初始化参数值。 |
Enumeration |
获取所有已定义的应用程序初始化参数名的枚举。 |
Enumeration |
获取所有application对象使用的属性名。 |
Object getAttribute(String name) | 从application对象中获取指定对象名。 |
void setAttribute(String key,Object obj) | 使用指定名称和指定对象在application对象中进行关联。 |
void removeAttribute(String name) | 从application对象中去掉指定名称的属性。 |
具体了解其用法参见参考资料
4、四大作用域
jsp九个内置对象中能存储数据的四个被称为jsp四大作用域
作用域 | 说明 |
---|---|
page | 变量在当前页面有效 |
request | 变量在当前请求中有效 |
session | 变量在当前会话中有效 |
application | 变量在一个应用下都有效 |
详细说明:
1)page作用域 代表变量只能在当前页面上生效
2)request作用域 代表变量能在一次请求中生效,一次请求可能包含一个页面,也可能包含多个页面,比如页面A请求转发到页面B。
3)session作用域 代表变量能在一次会话中生效,基本上就是能在web项目下都有效,session的使用也跟cookie有很大的关系。一般来说,只要浏览器不关闭,cookie就会一直生效,cookie生效,session的使用就不会受到影响。
4)application作用域 代表变量能一个应用下(多个会话),在服务器下的多个项目之间都能够使用。比如baidu、wenku等共享帐号。