为什么要使用JSP
Servlet存在以下缺陷:
1.Servlet的编码、部署和调试任务繁琐
2.生成动态网页繁琐,不利于项目分工
可以使用JSP来弥补Servlet的这些缺陷
什么是JSP
JSP(Java Server Pages),是由HTML语句和嵌套在其中的Java代码组成的一个普通文本文件,其扩展名为.jsp。使用jsp技术编写的页面为动态页面
JSP通常用于简化创建产生文本的Servlet,而Servlet更适合于发送原生字节到客户端或需要用Java源代码完全控制源代码的场合。二者可以很好的分开
JSP引擎
容器厂商定义的一个类,用于帮助我们翻译JSP文件,如:org.apache.jasper.servlet.JspServlet
Ps:所有的JSP翻译后的类都必须实现HttpJspPage接口,而HttpJspPage接口是Servlet的子接口,所以从这个意义上来说,JSP的本质是Servlet
JSP生命周期
1. Web容器第一次接收到对某个JSP页面的请求后,首先自动将该JSP页面翻译为Servlet代码
2. Web容器负责将Servlet代码编译为字节码。与源文件放在同一个目录下
3. Web容器装载新生成的servlet类
4. Web容器创建servlet实例
5. Web容器调用Servlet示例的jspInit()方法,JSP页面装载资源
6. 容器创建一个新线程来处理这个客户的请求 ,servlet对象的_jspService()方法运行
7. 容器调用生成的servlet对象的jspDestroy()方法,销毁装载的资源
JSP隐式对象
实质上就是翻译后的Servlet中的局部变量,一共有9个,其中
属于作用域范畴的有4个:
pageContext – 代表pageContext对象,只在当前页面有效
request – 代表HttpServletRequest对象,在一次请求中有效
session – 代表HttpSession对象,在一次会话中有效
application – 代表ServletContext对象,在整个web应用中有效
属于输出范畴的有2个
response -- 代表与响应相关的HttpServletResponse对象
out -- 代表与响应输出流相关的JspWriter对象,可输出字符流
其它有3个
config – 代表ServletConfig,用于配置servlet对象
page – 当前jsp对象,相当于this
exception – 代表Throwable对象,只能在JSP错误页面中使用
脚本元素
声明 <%! 声明内容 %>
– 主要用于定义,可以定义全局变量、静态变量和方法
脚本 <% Java程序代码 %>
– 书写Java代码,丰富_jspService()方法
表达式 <%= 脚本表达式%>
– 等价于out.print(“脚本表达式”)
注释
JSP注释 <%-- 注释内容 --%>
– 在服务器端翻译后的代码中和客户端均不可见,安全性高
Html注释 <!-- 注释内容 -->
– 在服务器端翻译后的代码中和客户端均可见
Java注释 //
– 在服务器端翻译后的代码中可见,客户端不可见
JSP指令
JSP指令用于提供整个JSP页面的相关信息,用于JSP页面与容器之间的通信,有三种类型的指令
Page指令
<%@ page attribute1=”value1” attribute2=”value2” %>
-- 用于设定整个JSP页面的属性和相关功能,page指令共有11个属性,较常用的有:
contentType:设定MIME类型和JSP编码
import:在JSP中引入Java的包和类,多个包之间以逗号隔开
session:指定当前页面是否能获得当前用户的session对象
errorPage:如果当前页面发生异常,网页会重定向到errorPage所指定的页面进行处理
isErrorPage:允许指定的JSP页面为错误处理页面
include指令
表示在JSP编译时插入一个包含文件或者代码的文件,是一种静态包含
<%@ include file="relativeURL" %>
Ps:1)include指令所包含的文件名不能是一个变量url,只能是静态的文件名。
2)在被包含页面中,一般不包含<html><body>标记,两个页面之间不能存在相同的局部变量
taglib指令
让用户能够自定义标签
<%@ taglib prefix="tagprefix" uri="url" %>
JSP标准动作
<jsp:include>动作
实现一种动态包含,把显示的结果插入到当前页面来显示
<jsp:include page="localURL" flush="true"/>
page:表示一个相对路径
flush:必需属性,且只能为真,表示当缓冲区满时会自动清空
Ps:静态包含与动态包含的区别:
1)静态包含是文件原样的拷贝,所以在被包含页面中,一般不包含<html>和<body>标记,两个页面之间不能存在相同的局部变量;动态包含包含的是结果,在两个页面之间,可以存在相同的变量
2)静态包含在编译时发生,只能包含文件;动态包含在请求时发生,可包含JSP及Servlet请求的url
<jsp:forward>动作
相当于内部转发
<jsp:forward page="relativeURL">
EL表达式
EL(expression_r_r Language) -- 表达式语言
语法:${...}
EL的主要目标是从JSP页面中消除Java代码,因此,EL表达式不能在脚本中定义变量。
EL表达式隐式变量:
类别 |
隐式变量名 |
描述 |
JSP | pageContext | 用来访问JSP的隐式对象 |
作用域 | pageScope | 与page作用域属性的名称和值相关联的Map类 |
requestScope | 与request作用域属性的名称和值相关联的Map类 | |
sessionScope | 与session作用域属性的名称和值相关联的Map类 | |
applicationScope | 与application作用域属性的名称和值相关联的Map类 | |
请求参数 | param | 包含请求参数字符串的Map类 |
paramValues | 包含请求参数字符串数组(String[])的Map类 | |
请求头 | header | 包含请求头字符串的Map类 |
headerValues | 包含请求头字符串数组(String[])的Map类 | |
Cookie | cookie | 按名称存储请求附带的Cookie的Map类 |
自定义标签
1.新建一个类继承BodyTagSupport类,BodyTagSupport类实现了Tag接口,重写需要实现的方法,一般是doEndTag()
2.在WEB-INF下面新建一个.tld文件,完成注册
<?xml version="1.0" encoding="UTF-8"?>
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<uri>http://www.baidu.com</uri>
<tag>
<name>tagTast</name>
<tag-class>com.lovo.MyTag</tag-class>
</tag>
</taglib>
3.在jsp页面添加taglib指令
<%@ taglib prefix="my" uri="com.lovo.MyTag">
4.在jsp页面使用自定义标签
为自定义标签设置属性
1.定义属性,并且生成get和set方法
2.在tld文件里<tag>标签内注册
<attribute>
<name>属性名<name>
<required>true</required>
</attribute>
3.在jsp页面里面设置标签属性的值
标准标记库JSTL:
需要两个Jar文件:jstl.jar、standard.jar;构建成功后须在JSP中添加如下指令;
< %@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
常用标记:
<c:if> -- 判断
<c:forEach> -- 循环
在JSP中使用JavaBean:
1、<jsp:useBean>动作
语法:<jsp:useBean id="beanName" scope="page|request|session|applicaion" class="className">
id -- 对象的属性名
scope -- 作用域
class -- 类的全路径名。
2、<jsp:getProperty>动作
语法:<jsp:getProperty name="beanName" property="propertyName">
name -- 对应<jsp:useBean>里的id。
property -- 要获取的属性名
3、<jsp:setProperty>动作
语法:<jsp:setProperty name="beanName" property="属性名">
<jsp:setProperty name="beanName" property="属性名" param="参数名">
<jsp:setProperty name="beanName" property="属性名" value="属性值"> //获取请求参数
<jsp:setProperty name="beanName" property="*">