本文内容:
- JSP的介绍
- jsp的使用
- EL表达式
- JSTL的使用
首发日期:2018-06-18
JSP的介绍:
- JSP全称Java Server Pages。
- 与静态网页格式的html不同的是,jsp是一种动态网页开发技术(动态的网页代表能从数据库等地方获取“动态”的资源,比如股市网页中股市的价格不可能是静态写在html中的,那会一层不变)。
- JSP文件后缀名为 *.jsp
- 它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
- JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。
- 在早期版本中,jsp也可以用于做整个的开发(因为jsp也可以操作数据库,所以jsp既能获取数据,又能输出数据到网页中),但由于后期的功能增多,jsp逐渐偏重于负责页面的呈现,而不负责数据获取等业务。
补充:
- jsp本质上还是一种servlet,它与servlet类似(你可能了解到servlet可以返回数据给浏览器,它是通过实现的。),如果你查看在tomcat里面的编译成功的.java和class文件,你会发现jsp会转成.java文件,然后里面的类继承了一种servlet类。同时它的数据输出本质上是使用out.write()来使动态数据能输出到网页中的。
jsp的使用:
执行代码:
- jsp中可以使用<% %>来包裹java代码,它与在普通java程序中使用java代码没有什么区别。
- 它的意义也主要是“执行代码”。通过执行代码,可以得到某些计算结果或过程,从而能使用到jsp中。
- 例子:
输出结果:
变量声明:
注释:
- 因为html的注释是无法影响jsp语句的【将某一段jsp代码注释,这段代码也依旧会执行】,所以需要jsp的注释,jsp使用<%-- --%>来包裹注释
- 例子:
- <%-- JSP 注释 --%>
流程控制语句:
【对于普通的循环运算,可以在<% %>中插入循环语句。但如果是想要将循环的内容输出到网页中,那么就需要使用jsp的循环了。(选择语句也是这样子)】
jsp可以使用java的流程控制语句,下面仅仅使用比较常见的流程控制语句来举例。
三大指令:
- <%@ page ... %>
- 意义:定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等
- 格式:<%@ page attribute="value" %>
- 属性attribute:
- language :指定jsp所用的脚步语言,值仅可为"java" 【本意想要把jsp扩展到其他语言】
- import :指定导入要使用的Java类。比如
-
<%@page import="java.util.*"%>
<%@page import="java.sql.Date"%>
- 导入自己写的类,比如:<%@page import="test.demo1.Student" %>
- pageEncoding :页面的编码方式。 【常用为 pageEncoding="UTF-8"】
- contype :指定当前JSP页面的MIME类型和字符编码【常用为 contentType="text/html; charset=UTF-8"】
- errorPage :指定发生错误时跳转的页面。值为一个url 【比如:errorPage="bottom.jsp"】
- isErrorPage :指定当前页面是否为错误页【当值为true时,才可以使用jsp的Exception对象】
- session:指定JSP页面是否使用session 【默认是session="true"】
- <%@ include ... %>
- <%@ taglib ... %>
- 意义:引入标签库的定义,可以是自定义标签 。【具体使用可以参考下面的jstl的使用】
- 格式:<%@ taglib uri="uri" prefix="prefixOfTag" %>
- uri的值是tld文件中的uri名称;prefix的值是标签名简写
动作标签:
动作标签的意义是,他能执行某些“动作”。
格式:<jsp:action_name attribute="value" />
- 包含页面:<jsp:include page=""></jsp:include>
- 请求转发:<jsp:forward page=""></jsp:forward>
- 参数传递:<jsp:param value="" name="" >
内置对象:
由于开发过程中会经常使用到request esponse等对象,所以为了简便,jsp的页面加载完毕后就会自动创建一些常用对象(通常称为九大内置对象)
- request:
- 对象类型:HttpServletRequest
- 意义:等同于servlet中的request
- response:
- 对象类型:HttpServletResponse
- 意义:等同于servlet中的response
- config
- 对象类型:ServletConfig
- 意义:等同于servlet中的servletConfig
- application
- 对象类型:ServletContext
- 意义:等同于servlet中的servletContext
- session
- 对象类型:HttpSession
- 意义:等同于servlet中的session
- exception
- 对象类型:Exception
- 当发生异常时,异常信息都会存储到这个对象中。可以使用这个对象来获取错误信息。
- page
- 对象类型:Object
- 意义:代表当前页对象,类似于this
- out
- 对象类型:JspWriter
- 意义:就是jsp的输出流对象,可以用来输出。但这个对象的输出是由缓冲区的,要等到缓冲区满了或时间到了才输出。
- pageContext
- 对象类型:PageContext
- 意义:代表着整个页面的内容,比如它包含了其他8个内置对象的获取方法,所以可以用来获取页面相关的内容。
域对象:
- pageContext,request,session,application对象都可以用来作为域对象;
- 可作为域对象,表示这些对象可以存值;利用这些域对象的作用范围,我们可以在不同的jsp间实现数据传递。
- 存储数据:域对象.setAttribute("数据名",数据对象)
- 获取数据:域对象.getAttribute("数据名")
- 删除数据:域对象.removeAttribute("数据名")
- request域:
- 在这个域存储的数据只能在同一次请求中使用。【如果使用转发的,转发过去的request存储着之前的值】
- pageContext域:
- 在这个域存储的数据仅在当前页面范围内有效。
- session域:
- 在这个域存储的数据仅在一次会话过程中生效。
- application域:
- 在这个域存储的数据在整个服务器范围内有效。
- 例子:在一个jsp中存储数据;在另一个中获取。
EL表达式:
意义:
- 简化jsp代码
使用:
- 取值: ${表达式 } 【${表达式 } 相当于<%=表达式 %>】
- 取域对象的数据:
- 如果表达式为一个变量名;那么代表从域对象中获取数据;默认顺序是pageContext,request,session,application;也可以指定查找域,比如${ pageScope.name },{ requestScope.name},${ sessionScope.name },${ applicationScope.name }
- 如果数据是一个带有下标的数据(集合之类的)那么可以使用数据名[下标]来逐一获取;如果数据是一个类对象,那么获取类中的数据时使用对象.数据名(对于Map,也使用对象.键名 来获取)
- 例子:
- 运算:EL表达式也可以使用某些运算 ,${运算表达式}
- 判断数据是否为空:${empty name }
- 三目运算符:比如${name == null?"null":name }
- 判断关系:比如${ age >18}
隐式对象:
EL表达式有11个隐式对象:
对象 | 意义 |
pageContext | 存储了网页相关信息 |
pageScope | 作用域相关对象 |
requestScope | 作用域相关对象 |
sessionScope | 作用域相关对象 |
applicationScope | 作用域相关对象 |
param | 参数信息相关对象,存储了传过来的参数 |
paramValues | 参数信息相关对象,存储了传过来的参数的值 |
header | 头信息相关对象,存储了头部信息 |
headerValues | 头信息相关对象,存储了头部信息的值 |
cookies | cookies对象 |
initParam | 存储了全局初始化参数 |
JSTL的使用:
意义:
- 仅仅依靠jsp自带的几个内置标签是无法实现多么复杂的功能的。
- 为了增加功能,所以需要扩展标签库。
- jstl全称是JSP Standard Tag Library,即 jsp标准标签库,是最常用的扩展标签库。
使用:
- 首先需要导入标签库,借助taglib指令:
- 使用标签:
- 格式:<c:标签名></c:标签名>比如:<c:set var="age" value="18" ></c:set>
常用标签:
- 存储数据标签:<c:set></c:set>
- 删除数据标签:<c:remove ></c:remove>
- 输出标签<c:out value=""></c:out>,与<%= %>类似:
- 循环标签:<c:forEach ></c:forEach>
- 属性:
- items:要被循环的信息,没有items时相当于迭代begin到end的数
- begin:开始的位置
- end:结束的位置
- step:步长
- var:存储迭代对象的变量名
- varStatus:迭代状态
- 举例:
- 分支标签:<c:if test="">