JavaWeb:jsp

时间:2022-08-16 06:50:24

本文内容:

  • JSP的介绍
  • jsp的使用
  • EL表达式
  • JSTL的使用

首发日期:2018-06-18


JSP的介绍:

  • JSP全称Java Server Pages。
  • 与静态网页格式的html不同的是,jsp是一种动态网页开发技术(动态的网页代表能从数据库等地方获取“动态”的资源,比如股市网页中股市的价格不可能是静态写在html中的,那会一层不变)。
    • JSP文件后缀名为 *.jsp
  • 它使用JSP标签在HTML网页中插入Java代码标签通常以<%开头以%>结束。
    • 一个常用的功能是:<%= 表达式 %> 可以将表达式的值输出到网页中,比如JavaWeb:jsp会变成JavaWeb:jsp
  • JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。
  • 在早期版本中,jsp也可以用于做整个的开发(因为jsp也可以操作数据库,所以jsp既能获取数据,又能输出数据到网页中),但由于后期的功能增多,jsp逐渐偏重于负责页面的呈现,而不负责数据获取等业务。

补充:

  • jsp本质上还是一种servlet,它与servlet类似(你可能了解到servlet可以返回数据给浏览器,它是通过实现的。),如果你查看在tomcat里面的编译成功的.java和class文件,你会发现jsp会转成.java文件,然后里面的类继承了一种servlet类。JavaWeb:jsp同时它的数据输出本质上是使用out.write()来使动态数据能输出到网页中的。

jsp的使用:

执行代码:

  • jsp中可以使用<% %>来包裹java代码,它与在普通java程序中使用java代码没有什么区别。
  • 它的意义也主要是“执行代码”。通过执行代码,可以得到某些计算结果或过程,从而能使用到jsp中。
  • 例子:
    • JavaWeb:jsp【这只是一个简单的例子。但无论如何,执行代码的意义无非就是得到过程或结果罢了。】

输出结果:

  • jsp中可以使用<%=表达式 %>来把表达式的值插入到jsp中。

  • 例子:

    • JavaWeb:jsp结果是JavaWeb:jsp

    • JavaWeb:jsp

变量声明:

  • jsp中可以使用<%! 变量声明 %>来声明变量,以便后续的使用。【一个<%! %>的变量声明可以是多个的】
  • 例子:
    • JavaWeb:jsp

注释:

  • 因为html的注释是无法影响jsp语句的【将某一段jsp代码注释,这段代码也依旧会执行】,所以需要jsp的注释,jsp使用<%--  --%>来包裹注释
  • 例子:
    • <%-- JSP 注释 --%>

流程控制语句:

【对于普通的循环运算,可以在<% %>中插入循环语句。但如果是想要将循环的内容输出到网页中,那么就需要使用jsp的循环了。(选择语句也是这样子)】

jsp可以使用java的流程控制语句,下面仅仅使用比较常见的流程控制语句来举例。

  • 循环语句:
    • 格式:JavaWeb:jsp,就是提前结束{,利用<% %>来分隔完整的{}
    • 例子:JavaWeb:jsp
  • 选择语句:
    • 格式:与循环语句的格式类似,也是使用提前结束{,利用<% %>来分隔完整的{}
    • 例子:JavaWeb:jsp

三大指令:

  • <%@ 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 ... %>
    • 意义:把其他文件包含到jsp文件中。比如网页头部不想重复写,那么可以存储到一个jsp中,然后再include进来。
    • 格式:<%@ include file="" %> 【file的值是目标文件路径】
    • 例子:JavaWeb:jsp
  • <%@ 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文件的内容)
    • 例子:JavaWeb:jsp
  • 请求转发:<jsp:forward page=""></jsp:forward>
    • 例子:JavaWeb:jsp
  • 参数传递:<jsp:param value="" name="" >
    • 可以写在<jsp:forward>或<jsp:include>中,起到参数传递的作用。
    • JavaWeb:jspJavaWeb:jsp

内置对象:

由于开发过程中会经常使用到request\response等对象,所以为了简便,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中存储数据;在另一个中获取。
    • demo1.jsp的部分代码:JavaWeb:jsp
    • demo2.jsp的部分代码:JavaWeb:jsp
    • 结果:demo1.jsp:JavaWeb:jsp
    • 结果:demo2.jsp:JavaWeb:jsp

EL表达式:

意义:

  • 简化jsp代码

使用:

  • 取值: ${表达式 }  【${表达式 } 相当于<%=表达式 %>】
    • 取域对象的数据:
      • 如果表达式为一个变量名;那么代表从域对象中获取数据;默认顺序是pageContext,request,session,application;也可以指定查找域,比如${ pageScope.name },{ requestScope.name},${ sessionScope.name },${ applicationScope.name }
      • 如果数据是一个带有下标的数据(集合之类的)那么可以使用数据名[下标]来逐一获取;如果数据是一个类对象,那么获取类中的数据时使用对象.数据名(对于Map,也使用对象.键名 来获取)
    • 例子:
      • JavaWeb:jsp
      • JavaWeb:jsp
      • JavaWeb:jsp
  • 运算: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指令:
    1. 导入jar文件jstl.jar和standard.jar到工程的WebContent/Web-Inf/lib
    2. 在jsp页面上,使用taglib 指令导入标签库。使用的标签库一般是core核心标签库。使用某些功能,需要导入jstl的其他库。JavaWeb:jsp
    3. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      1. uri是tld文件中的uri,如果不关注,可以使用代码补全帮助填写即可。
      2. prefix是标签库的简写,功能上使用别的名字也能代表这个标签库,但约定俗成core核心库的简写是c
  • 使用标签:
    • 格式:<c:标签名></c:标签名>比如:<c:set var="age" value="18" ></c:set>

常用标签:

  • 存储数据标签:<c:set></c:set>
    • 属性:
      • value:要存储的值
      • var:存储数据的变量名
      • scope:数据存储到哪个域对象中,默认是pageContext域中
    • 举例:
      • JavaWeb:jsp
  • 删除数据标签:<c:remove ></c:remove>
    • 属性:
      • var:存储数据的变量名
      • scope:删除哪个域对象中的数据,默认是pageContext域
    • 举例:JavaWeb:jsp
  • 输出标签<c:out value=""></c:out>,与<%= %>类似:
    • 属性:
      • value:要输出的内容
    • 举例:JavaWeb:jsp
  • 循环标签:<c:forEach ></c:forEach>
    • 属性:
      • items:要被循环的信息,没有items时相当于迭代begin到end的数
      • begin:开始的位置
      • end:结束的位置
      • step:步长
      • var:存储迭代对象的变量名
      • varStatus:迭代状态
    • 举例:
      • JavaWeb:jsp
  • 分支标签:<c:if test="">
    • 属性:
      • test:判断的条件
      • var:用于存储条件结果的变量
      • scope:var存储到哪个域,默认是pageContext域
    • 举例:JavaWeb:jsp