1.什么是JSP?
由SUN公司制订的一种服务器端的动态页面技术规范。
JSP本质就是一个Servlet。
注:jsp是一个以".jsp"为后缀的文件,该文件主要内容是html和少量的java代码,该文件会被容器自动转换成一个对应的Servlet然后执行。
2.如何写一个JSP?
step1. 添加一个以".jsp"为后缀的文件。
step2. 在该文件里面,可以使用如下几种元素:
(1)html(css,js)
直接写即可。
(2)java代码
1)方式一:
java代码片断:
语法:
<% java代码 %>
2)方式二:
jsp表达式:
语法:
<%= java表达式 %>
(3)隐含对象
1)什么是隐含对象?
在jsp当中不用作任何说明,直接可以使用的对象,比如out、request和response。
2)为什么可以直接使用这些隐含对象(见下图)?
(4)指令
1)什么是指令?
可以通过指令告诉容器,在将JSP转换成对应的Servlet时做一些额外的处理,比如导包。
2)语法
<%@ 指令名 属性=值 %>
3) page指令
import属性:用于指定要导的包名,比如:
<%@ page import="java.util.*"%>
<%@ page import="java.util.*,java.text.*" %>
contentType属性:用于指定MIME类型
即指定response.setContentType("text/html;charset=utf-8");
pageEncoding属性:(见下图)
3.JSP是如何执行的?
step1. 容器将JSP转换成一个对应的Servlet。
a. html(css,js)-----> 在service方法里,使用out.write输出。
注(了解):out.write方法会将null转换成""输出,而print方法会直接输出null。
b. <% %> -----> 照搬到service方法里。
c. <%= %> -----> 在service方法里,使用out.print输出。
step2. 容器调用该Servlet。
容器将这个Servlet编译,然后实例化、初始化,最后调用该实例的service方法。
4. jsp基础知识补充:
(1)jsp声明:
<%! 声明一个变量或者方法 %>
注: jsp声明用来给对应的Servlet添加新的成员变量或者方法。
(2)补充几个隐含对象(共9个):
除了out,request,response这三个隐含对象以外,还有如下几个:
-
session: HttpSession接口的实现。
当page指令的session属性值设置为false时,容器不再提供获得session对象的代码了,也就是说,不能够使用session隐含对象了。
注:
在一些特定的web应用当中,可能要使用非原生session,此时,最好将session属性值设置为false.
原生session指的是由容器提供的session
HttpSession session = request.getSession();
-
application: ServletContext接口的实现。
容器启动之后,会为每一个web应用都创建唯一的一个符合ServletContext接口要求的对象,该对象一般称之为Servlet上下文。该对象会一直存在,除非容器关闭。
Servlet上下文作用主要有两个:
(1)绑订数据:
request,session,Servlet上下文都提供了绑订数据相关的方法(setAttribute等方法),在实际使用时,有一个原则:即在满足使用条件的情况下,优先使用生命周期短的(为了节省内存空间的占用)。
生命周期从短到长依次为request < session < Servlet上下文。
另外,绑订到session上的数据只有与之对应的用户能够访问到,而绑订到Servlet上下文上的数据所有用户都可以访问。
(2)读取全局的初始化参数。
在同一个web应用当中,可以被所有的Servlet,jsp,过滤器访问的初始化参数称之为全局的初始化参数,需要使用ServletContext提供的getInitParameter方法来读取。
-
pageContext: PageContext接口的实现。
容器会为每一个jsp实例创建唯一的一个符合PageContext接口要求的对象(也可以称之为页面上下文),该对象会一直存在,除非对应的jsp实例被销毁。
(1)绑订数据:
绑订到pageContext上的数据只有与之对应的jsp实例能够访问到(不能被共享)。
(2)提供了获得其它所有隐含对象的方法:
在jsp标签类当中,经常需要通过pageContext对象来获得其它隐含对象。
-
config: ServletConfig接口的实现。
可以给jsp配置初始化参数(web.xml),然后通过该隐含对象来读取。
-
exception: 封装了jsp运行时产生的异常信息。
只有当page指令的exception属性值为true时才能使用。
-
page(了解): jsp实例本身
注: jsp实例指的是jsp对应的那个Servlet实例。
(3)补充指令相关知识
1)page指令:
除了import属性,contentType属性,pageEncoding属性这几个属性以外,还有:
session属性:缺省值是true,当值为false时,容器不再生成获得session对象的代码。
errorPage属性:用于指定一个异常处理页面,当jsp运行时发生了异常,则容器会调用该异常处理页面。
isErrorPage属性:缺省值为false,当值为true时,可以使用exception隐含对象。
2)include指令:
file属性:用于指定要包含的文件,比如:
<%@ include file=“header.jsp”%>
注:容器在生成jsp对应的Servlet源代码的时候,会将file属性指定的文件的内容直接插入到该指令所在的位置。被包含的文件如果是jsp,则该jsp并不会真正执行(也就是说没有对应的Servlet)。
3)taglib指令:
用于导入jsp标签。
(4) 注释
1)方式一:
<!-- 注释的内容 -->
2)方式二:
<%-- 注释的内容 --%>
注:方式一被注释的内容会执行(包括java代码,el表达式,jsp标签),而方式二被注释的内容不会执行。
2.在MVC架构中使用jsp
MVC工作流程:
转发工作流程:
5. jsp标签和el表达式
(1)什么是jsp标签?
sun公司推出的一种用于替换jsp中的java代码的技术,语法类似于html标签(比如有开始标记、结束标记,有一些属性,有标签体)。
使用jsp标签方便代码的复用,也方便jsp文件的维护。
(2)什么是el表达式?
是一套简单的运算规则,用于给jsp标签的属性赋值。
注:el表达式也可以脱离jsp标签,直接使用。
(3)el表达式的使用
1)访问bean的属性
第一种方式: ${e.name}
a. 该表达式的执行过程:容器会依次从pageContext—>request—>
session—>application中查找绑订名为"e"的对象,找到该对象之后,会调用
该对象的"getName"方法,最后输出该方法的执行结果。
注:如果找不到对应的对象,会输出"",另外,会将null转换成""输出。
b.指定查找范围:可以通过pageScope,requestScope,sessionScope,
applicationScope来指定查找范围。
第二种方式:${e[‘name’]}
a. [ ]里面以出现绑订名。
b. [ ]里面可以出现从0开始的下标,用于访问数组中指定下标的某个元素。
2)做一些简单的运算
a.算术运算: +,-,*,/,%
注: “+” 只能求和。
b.关系运算: >,>=,<,<=,==,!=
c.逻辑运算: &&, ||, !
d.empty运算: empty
注:empty运算用于判断一个集合是否为空,或者是不是一个空字符串。
3)读取请求参数值
a. 第一种方式:
${param.username} 等价于
request.getParameter(“username”)
b.第二种方式:
${paramValues.city} 等价于
request.getParameterValues(“city”);
注:当有多个请求参数名相同时,使用该方法,比如
el03.jsp?city=bj&city=wh&city=cs
(4)jstl(jsp standard taglib)
1)jstl是什么?
apache开发的一套jsp标签,后来捐献给了sun,sun将其命名为jstl,也就是jsp
标准标签库。
2)如何使用jstl?
step1. 导入jstl相关的jar包。
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
step2.使用taglib指令导入要使用的jsp标签
<%@ taglib uri="" prefix="" %>
uri属性:用于指定标签所属的命名空间(namespace)。
注:命名空间是为区分同名的元素而在元素前添加的一段说明。
命名空间经常是一个域名(为了避免命名空间冲突)。
prefix属性:用于指定命名空间的别名。
3)if标签
<c:if test="">
标签体
</c:if>
当test属性值为true时,执行标签体的内容。
test属性可以使用el表达式进行计算。
4) choose标签
<c:choose>
<c:when test="">
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
when可以出现1次或者多次,相当于一个if或者else if语句,当test属性值为true时,执行标签体的内容。
otherwise可以出现0次或者1次,相当于最后那个else语句。
5)forEach标签
<c:forEach items="" var="" varStatus="">
</c:forEach>
items属性用于指定要遍历的集合或者数组,可以使用el表达式赋值。
var属性用于指定一个绑订名:
注:该标签每次从集合或者数组中取一个元素,然后将这个元素绑订到pageContext上。
varStatus属性用于指定一个绑订名:
注:绑订值是一个对象,该对象由该标签创建,用于获得当前遍历的状态,比如:
getIndex():用于获得当前正在被遍历的元素的下标(从0开始)
getCount():用于获得当前正在被遍历的元素是第几个元素(从1开始)
标签的执行过程: