一、JSP简介
JSP全称是Java Server Page,它和Servlet一样,也是sun公司推出的一套开发动态web资源的技术,称为JSP/Servlet规范。其本质也是一个Servlet。
二、HTML、Servlet和JSP的关系
HTML:只能开发静态资源,不能包含java代码,无法添加动态数据。
Servlet:写java代码,可以输出页面内容,但是很不方便,开发效率极低。
JSP:HTML+Servlet
三、JSP快速入门(输出当前时间)
四、分析JSP的原理以及生命周期
写在之前:
明确JSP就是一个Servlet。是一个特殊的Servlet。
JSP的原理:
客户端提交请求——Tomcat服务器解析请求地址——找到JSP页面——Tomcat将JSP页面翻译成Servlet的java文件——将翻译好的.java文件编译成.class文件——返回到客户浏览器上。
五、JSP的语法
5.1 模板元素
jsp中的模板元素指的就是jsp中的html标签,在开发过程中,先写好这些模板元素,因为它们决定了页面的外观。
5.2 Java程序片段
在jsp中,可以使用java脚本代码。形式为:
<%
在里面写java程序脚本
需要注意:这里面的内容由tomcat负责翻译,翻译之后是service方法的成员变量
%>
5.3 Java表达式
使用<%=表达式%>
翻译完后是out.print(表达式内容);
<%out.print("当前时间);%>和<%="当前时间"%>是一样的
5.4 JSP声明
JSP的声明
<%!
声明可以是变量,方法,静态方法等
需要注意的是:
写在里面的内容将会被tomcat翻译成全局的属性或者类方法。
%>
5.5 JSP注释
JSP中的注释:<%--注释--%>
注意:
在Jsp中可以使用html的注释,但是只能注释html元素,不能注释java程序片段和表达式。
jsp的注释不仅可以注释java程序片段,也可以注释html元素。
5.6 JSP指令
5.6.1 简介
JSP指令是为JSP引擎服务的,它不会产生可见输出,而是告诉引擎如何处理JSP的其余部分(非指令部分)。
基本语法:
<%@ 指令名称 属性1="值1" 属性2="值2".......%>
一般把指令放在JSP页面的顶部(不是必须的)
指令的属性可以写在一个指令的中,也可以分开写:比如:
<%@指令 属性1=”值1” 属性2=”值2”%>.
等价于:
<%@指令 属性1=”值1” %>.
<%@指令 属性2=”值2”%>.
5.6.2 page指令
属性:
language:告知引擎,脚本使用的是java,默认是java,支持java。不写也行。
extends:告知引擎,JSP对应的Servlet的父类是哪个,不需要写,也不需要改。
import:告知引擎,导入哪些包(类)。
注意:引擎会自动导入:java.lang.*,javax.servlet.*,javax.servlet.http.*,javax.servlet.jsp.*
导入的形式:
<%@page import=”java.util.Date,java.util.UUID”%>或者:
<%@page import=”java.util.Date”%>
<%@page import=”java.util.UUID”%> 用Eclipse:Alt+/ 自动导入
session:告知引擎是否产生HttpSession对象,即是否在代码中调用request.getSession()。默认是true。
buffer:JspWriter用于输出JSP内容到页面上。告知引擎,设定他的缓存大小。默认8kb。
errorPage:告知引擎,当前页面出现异常后,应该转发到哪个页面上(路径写法:/代表当前应用)
注意:当在errorpage上使用了isErrorPage=true之后,ie8有时候不能正常显示
配置全局错误页面:web.xml
当使用了全局错误页面,就无须再写errorPage来实现转到错误页面,而是由服务器负责跳转到错误页面。
isErrorPage:告知引擎,是否抓住异常。如果该属性为true,页面中就可以使用exception对象,打印异常的详细信息。默认值是false。
contentType:告知引擎,响应正文的MIME类型。contentType="text/html;charset=UTF-8"
相当于response.setContentTYpe("text/html;charset=UTF-8");
pageEncoding:告知引擎,翻译jsp时(从磁盘上读取jsp文件)所用的码表。
pageEncoding="UTF-8"相当于告知引擎用UTF-8读取JSP
isELIgnored:告知引擎,是否忽略EL表达式,默认值是false,不忽略。
总结:
属性众多,一般都用默认值。用起来很简单。
5.6.3 include指令
该指令是包含外部页面。
属性:file,以/开头,就代表当前应用。
5.6.4 taglib指令
该指令用于引入外部标签
uri:外部标签的URI地址,类似名称空间。
prefix:前缀。
六、JSP的转发和包含
6.1 转发
语法:<jsp:forward page="/forwarddemojsp"></jsp:forward> 是jsp的内置标签
该方式等价于:
参数:<jsp:param name="message" value="transfer" />
获取参数:
注意:
在使用forward带参数时,不能在中间添加除空格和换行之外的内容。否则报错。
6.2 包含
静态包含:只有一种,<%@include file=%>,又称为include指令。特点是将两个页面合成一个。在包含者中可以使用被包含者的属性。
动态包含:除了include指令外,其余全是动态包含。
jsp的动态包含语法:
<jsp:include page="" />
又称为include动作。
动态包含的特点是,各编译各的,会产生多个java和class文件。只是合并输出结果。
七、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抽象类(重要)
8.1 PageContext抽象类概述
它是JSP独有的对象,Servlet中没有这个对象。本身也是一个域(作用范围)对象,但是它可以操作其他3个域对象中的属性。而且还可以获取其他8个隐式对象。(自定义标签时用)
8.2 PageContext生命周期
它是一个局部变量,所以它的生命周期随着JSP的创建而诞生,随着JSP的结束而消失。每个JSP页面都有一个独立的PageContext。
8.3 PageContext常用方法
页面范围的方法:
void setAttribute(String name,Object value);
void removeAttribute(String name);
Object getAttribute(String name);
操作其他域属性的方法:
比上面的三个方法多了一个参数 int scope。
void setAttribute(String name,Object value,int scope);
void removeAttribute(String name,int scope);
Object getAttribute(String name,int scope);
int scope:它本身是一个常量,有四个值,分别对应四个范围。
APPLICATION_SCOPE 应用级
SESSION_SCOPE 会话级
REQUEST_SCOPE 请求级
PAGE_SCOPE 页面级
在四个范围内根据名称查找对象的方法:
Object findAttribute(String name);
查找顺序是:PAGE——>REQUEST——>SESSION——>APPLICATION。只要在一个范围内找到就不再继续查找。
获取其他八个隐式对象的方法:(自定义标签时用)
pageContext.getRequest();
pageContext.getResponse();
pageContext.getSession();
pageContext.getServletConfig();
pageContext.getServletContext();
pageContext.getException();
pageContext.getPage();
pageContext.getOut();(此方法是其父类JspContext提供)
九、四大域对象
实际开发中用于存放数据的。
域对象名称 |
范围 |
级别 |
备注 |
PageContext |
页面范围 |
最小 |
因范围太小,开发中用的很少 |
ServletRequest |
请求范围 |
比page大,比session小 |
不同的资源,只有转发用 |
HttpSession |
会话范围 |
比request大,比application小 |
多次请求共享数据,但不同的客户端不能共享 |
ServletContext |
应用范围 |
最大 |
尽量少用,如果对数据有修改需要做同步处理 |
十、JSP开发
Servlet:擅长处理业务逻辑,不擅长输出显示界面。在web开发中多用于控制程序逻辑(流程)。所以我们称之为:控制器。
JSP:擅长显示界面,不擅长处理程序逻辑。在web开发中多用于展示动态界面。所以我们称之为:视图。
例如:
M:model 封装的是数据模型
V:view 指的是jsp页面
C:Controller 指的是Servlet
注意:MVC模型针对的只是表现层的模型,和三层架构是没有关系的。