Java:jsp
程序员文章站
2022-05-16 12:21:20
本文内容: JSP的介绍 jsp的使用 EL表达式 JSTL的使用 首发日期:2018-06-18 JSP的介绍: JSP全称Java Server Pages。 与静态网页格式的html不同的是,jsp是一种动态网页开发技术(动态的网页代表能从数据库等地方获取“动态”的资源,比如股市网页中股市的价... ......
本文内容:
- 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中。
- 例子:
- 【这只是一个简单的例子。但无论如何,执行代码的意义无非就是得到过程或结果罢了。】
输出结果:
-
jsp中可以使用<%=表达式 %>来把表达式的值插入到jsp中。
-
例子:
-
结果是
-
变量声明:
- 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" %>
- <%@ include ... %>
- 意义:把其他文件包含到jsp文件中。比如网页头部不想重复写,那么可以存储到一个jsp中,然后再include进来。
- 格式:<%@ include file="" %> 【file的值是目标文件路径】
- 例子:
- <%@ taglib ... %>
- 意义:引入标签库的定义,可以是自定义标签 。【具体使用可以参考下面的jstl的使用】
- 格式:<%@ taglib uri="uri" prefix="prefixOfTag" %>
- uri的值是tld文件中的uri名称;prefix的值是标签名简写
动作标签:
动作标签的意义是,他能执行某些“动作”。
格式:<jsp:action_name attribute="value" />
- 包含页面:<jsp:include page=""></jsp:include>
- 与include指令不同的是,include指令可以说是静态包含(把另一个文件的内容装进来再转成java文件),include动作可以说是动态包含(把目标文件也转成java文件,访问的时候动态获取对应java文件的内容)
- 例子:
- 例子:
- 可以写在<jsp:forward>或<jsp:include>中,起到参数传递的作用。
内置对象:
由于开发过程中会经常使用到request\response等对象,所以为了简便,jsp的页面加载完毕后就会自动创建一些常用对象(通常称为九大内置对象)
- request:
- 对象类型:HttpServletRequest
- 意义:等同于servlet中的request
- 对象类型:HttpServletResponse
- 意义:等同于servlet中的response
- 对象类型:ServletConfig
- 意义:等同于servlet中的servletConfig
- 对象类型:ServletContext
- 意义:等同于servlet中的servletContext
- 对象类型:HttpSession
- 意义:等同于servlet中的session
- 对象类型:Exception
- 当发生异常时,异常信息都会存储到这个对象中。可以使用这个对象来获取错误信息。
- 对象类型:Object
- 意义:代表当前页对象,类似于this
- 对象类型:JspWriter
- 意义:就是jsp的输出流对象,可以用来输出。但这个对象的输出是由缓冲区的,要等到缓冲区满了或时间到了才输出。
- 对象类型:PageContext
- 意义:代表着整个页面的内容,比如它包含了其他8个内置对象的获取方法,所以可以用来获取页面相关的内容。
域对象:
- pageContext,request,session,application对象都可以用来作为域对象;
- 可作为域对象,表示这些对象可以存值;利用这些域对象的作用范围,我们可以在不同的jsp间实现数据传递。
- 存储数据:域对象.setAttribute("数据名",数据对象)
- 获取数据:域对象.getAttribute("数据名")
- 删除数据:域对象.removeAttribute("数据名")
- request域:
- 在这个域存储的数据只能在同一次请求中使用。【如果使用转发的,转发过去的request存储着之前的值】
- pageContext域:
- 在这个域存储的数据仅在当前页面范围内有效。
- session域:
- 在这个域存储的数据仅在一次会话过程中生效。
- application域:
- 在这个域存储的数据在整个服务器范围内有效。
- 例子:在一个jsp中存储数据;在另一个中获取。
- demo1.jsp的部分代码:
- demo2.jsp的部分代码:
- 结果:demo1.jsp:
- 结果:demo2.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指令:
- 导入jar文件jstl.jar和standard.jar到工程的WebContent/Web-Inf/lib
- 在jsp页面上,使用taglib 指令导入标签库。使用的标签库一般是core核心标签库。使用某些功能,需要导入jstl的其他库。
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- uri是tld文件中的uri,如果不关注,可以使用代码补全帮助填写即可。
- prefix是标签库的简写,功能上使用别的名字也能代表这个标签库,但约定俗成core核心库的简写是c
- 使用标签:
- 格式:<c:标签名></c:标签名>比如:<c:set var="age" value="18" ></c:set>
常用标签:
- 存储数据标签:<c:set></c:set>
- 属性:
- value:要存储的值
- var:存储数据的变量名
- scope:数据存储到哪个域对象中,默认是pageContext域中
- 举例:
- 删除数据标签:<c:remove ></c:remove>
- 属性:
- var:存储数据的变量名
- scope:删除哪个域对象中的数据,默认是pageContext域
- 举例:
- 输出标签,与<%= %>类似:
- 属性:
- value:要输出的内容
- 举例:
- 循环标签:<c:forEach ></c:forEach>
- 属性:
- items:要被循环的信息,没有items时相当于迭代begin到end的数
- begin:开始的位置
- end:结束的位置
- step:步长
- var:存储迭代对象的变量名
- varStatus:迭代状态
- 举例:
- 分支标签:<c:if test="">
- 属性:
- test:判断的条件
- var:用于存储条件结果的变量
- scope:var存储到哪个域,默认是pageContext域
- 举例: