JSP学习笔记

JSP概述

  • JSP(全称JavaServer Pages)是由Sun Microsystems公司倡导和许多公司参与共同建立的一种使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的Web网页的技术标准。JSP技术是以Java语言作为脚本语言的,JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序。
  • JSP使Java代码和特定的预定义动作可以嵌入到静态页面中。JSP句法增加了被称为JSP动作的XML标签,它们用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库提供了一种和平台无关的扩展服务器性能的方法。
  • JSP被JSP编译器编译成Java Servlets。一个JSP编译器可以把JSP编译成JAVA代码写的servlet然后再由JAVA编译器来编译成机器码,也可以直接编译成二进制码。

执行过程

编写一jsp文件,命名为hello.jsp,执行流程如下:

  1. 把 hello.jsp转译为hello_jsp.java
  2. hello_jsp.java 位于\tomcat\work\Catalina\localhost_\org\apache\jsp
  3. hello_jsp.java是一个servlet
  4. 把hello_jsp.java 编译为hello_jsp.class
  5. 执行hello_jsp.class,生成html
  6. 通过http协议把html 响应返回给浏览器

JSP指令

JSP指令控制JSP编译器如何去生成servlet,以下是可用的指令:

  • 包含指令include
    包含指令通知JSP编译器把另外一个文件完全包含入当前文件中。效果就好像被包含文件的内容直接被粘贴到当前文件中一样。这个功能和C预处理器所提供的很类似。被包含文件的扩展名一般都是”jspf”(即JSP Fragment,JSP片段):
    <%@ include file="somefile.jsp" %>
  • 页面指令page
    页面指令有以下几个选项:
    • import 使一个JAVA导入声明被插入到最终页面文件。注意:在同一个JSP文件中只有”import”导入页面指令可以被多次使用,如果导入多个类,彼此用,逗号隔开。
    • contentType 规定了生成内容的类型。当生成非HTML内容或者当前字符集character set并非默认字符集时使用。如contentType=”text/html; charset=UTF-8″
    • pageEncoding 页面的字符设置
    • errorPage 处理HTTP请求时,如果出现异常则显示该错误提示信息页面。
    • isErrorPage 如果设置为TRUE,则表示当前文件是一个错误提示页面。
    • isThreadSafe 表示最终生成的servlet是否线程安全(thread safe)。
      1. <%@ page import="java.util.*" %> //example import导入样例
      2. <%@ page contentType="text/html" %> //example contentType页面类型样例
      3. <%@ page isErrorPage=false %> //example for non error page无错页面样例
      4. <%@ page isThreadSafe=true %> //example for a thread safe JSP线程安全JSP样例
  • 标签库指令taglib
    标签库指令描述了要使用的JSP标签库。该指令需要指定一个前缀prefix(和C++的命名空间很类似)和标签库的描述URI:
    <%@ taglib prefix="myprefix" uri="taglib/mytag.tld" %>

JSP页面元素

  • 标准脚本变量
    以下是永远可用的脚本变量:
    • out:JSPWriter,用来写入响应流的数据
    • page:servlet自身
    • pageContext:一个PageContext实例包括和整个页面相联系的数据,一个给定的HTML页面可以在多个JSP之间传递。
    • request:HTTP request(请求)对象
    • response:HTTP response(响应)对象
    • session:HTTP session(服务端会话)对象
  • 脚本元素
    有三个基本的脚本元素,作用是使JAVA代码可以直接插入servlet。
    • 一种是声明标签,在JAVA SERVLET的类体中放入一个变量的定义。静态的数据成员也可以如此定义。
      <%! int serverInstanceVariable = 1; %>
    • 一种是脚本标签,在JAVA SERVLET的类的_jspService()方法中放入所包含的语句。
      <% int localStackBasedVariable = 1; out.println(localStackBasedVariable); %>
    • 一种是表达式标签,在JAVA SERVLET的类中放入待赋值的表达式,表达式注意不能以分号结尾,一般用于输出一段html。
      <%= "expanded inline data " + 1 %>相当于<%out.println( "expanded inline data " + 1); %>
  • 页面元素
    总结,JSP的页面元素组成如下:
    • 静态内容
      就是html,css,javascript等内容
    • 指令
      <%@开始 %> 结尾,比如<%@page import="java.util.*"%>
    • 表达式
      <%=...%>用于输出一段html
    • Scriptlet
      <%...%>之间,可以写任何java 代码
    • 声明
      <%!......%>之间可以声明字段或者方法。但是不建议这么做。
    • 动作
      <jsp:include page="Filename" >在jsp页面中包含另一个页面。
    • 注释
      <%-- .....-- %>,不同于 html的注释<!-- -->通过jsp的注释,浏览器也看不到相应的代码,相当于在servlet中注释掉了

JSP动作

JSP动作是一系列可以调用内建于网络服务器中的功能的XML标签。JSP提供了以下动作:

  • jsp:include
    和子过程类似,JAVA SERVLET暂时接管对其它指定的JSP页的请求和响应。当处理完该JSP页后就马上把控制权交还当前JSP页。这样JSP代码就可以在多个JSP页中共享而不用复制。(注意区别指令include,指令include会导致多个jsp文件合并为一个java文件,动作include是独立访问,但需注意传参jsp:param)
  • jsp:param
    可以在jsp:include, jsp:forward或jsp:params块之间使用。指定一个将加入请求的当前参数组中的参数。
  • jsp:forward
    用于处理对另一个JSP或SERVLET的请求和响应。控制权永远不会交还给当前JSP页。相当于Servlet服务端跳转的简化,即:
    request.getRequestDispatcher("XXX.jsp").forward(request, response);
  • jsp:plugin
    Netscape Navigator的老版本和Internet Explorer使用不同的标签以嵌入一个applet。这个动作产生为嵌入一个APPLET所需要的指定浏览器标签。
  • jsp:fallback
    如果浏览器不支持APPLETS则会显示的内容。
  • jsp:getProperty
    从指定的JavaBean中获取一个属性值。
  • jsp:setProperty
    在指定的JavaBean中设置一个属性值。
  • jsp:useBean
    创建或者复用一个JavaBean变量到JSP页。

作用域

JSP有4个作用域,分别是 :

  • pageContext
    pageContext表示当前页面作用域,只能在当前页面访问,在其他页面不能访问
    常用写法是:
    pageContext.setAttribute(key,value);
    pageContext.getAttribute(key)
  • requestContext
    requestContext 表示一次请求。随着本次请求结束,其中的数据也就被回收。
    常用写法是:
    request.setAttribute(key,value);
    request.getAttribute(key)
  • sessionContext
    sessionContext 指的是会话,从一个用户打开网站的那一刻起,无论访问了多少网页,链接都属于同一个会话,直到浏览器关闭。 所以页面间传递数据,也是可以通过session传递的。但是,不同用户对应的session是不一样的,所以session无法在不同的用户之间共享数据。
    常用写法是:
    session.setAttribute(key,value);
    session.getAttribute(key)
  • applicationContext
    applicationContext 指的是全局,所有用户共享同一个数据,在JSP中使用application对象, application对象是ServletContext接口的实例也可以通过request.getServletContext()来获取。所以 application == request.getServletContext() 会返回true,application映射的就是web应用本身。
    常用写法是:
    application.setAttribute(key,value);
    application.getAttribute(key)

隐式对象

JSP的隐式对象指的是不需要显示定义,直接就可以使用的对象,比如request,response
JSP一共有9个隐式对象,分别是 :

  • request
    请求
  • response
    响应
  • out
    输出
  • pageContext
    当前页面作用域
  • session
    会话作用域
  • application
    全局作用域
  • page
    page 对象即表示当前对象,JSP 会被编译为一个Servlet类 ,运行的时候是一个Servlet实例。 page即代表this
  • config
    config可以获取一些在web.xml中初始化的参数。
    在JSP中使用config比较复杂,一般较少使用。需要如下几个步骤:
    1. 在web.xml中进行配置
    2. 创建一个jsp文件,通过config.getInitParameter(param-name) 获取参数
    3. 访问路径,获取web.xml中配置的参数
  • exception
    exception 对象只有当前页面的<%@page 指令设置为isErrorPage=”true”的时候才可以使用。
    同时,在其他页面也需要设置 <%@page 指令 errorPage=”” 来指定一个专门处理异常的页面。

JSTL标准标签库

JSP标准标签库(JSP Standard Tag Library)是Java EE网络应用程序开发平台的组成部分。它在JSP规范的基础上,扩充了一个JSP的标签库来完成一些通用任务,比如XML数据处理、条件执行、数据库访问、循环和国际化。JSTL允许开人员可以像使用HTML标签 那样在JSP中开发Java功能。
JSTL库有core, i18n, fmt, sql 等等,jar包放在web/WEB-INF/lib 下。
下面是全部六个JSTL标签库的描述:

  1. 核心库,如和。
  2. 格式化库,具有国际化功能。
  3. 数据库标签库,包括查询、创建和更新数据库表的标签。
  4. XML库。
  5. 函数库。
  6. TLV(允许JSP页面的XML视图在翻译时验证。JSTL提供的TLV允许标签库作者根据JSP页面中脚本元素的使用和被允许的标签库来执行限制条件。
  • 常用核心库指令
    在页面中使用JSTL需要在jsp中 通过指令进行设置,<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    • set
      <c:set var="name" value="${'gareen'}" scope="request" />
      在作用域request中设置name,相当于
      <%request.setAttribute("name","gareen")%>
    • out
      <c:out value="${name}" />
      相当于 <%=request.getAttribute("name")%>
    • remove
      <c:remove var="name" scope="request" />
      在作用域request中删掉name,相当于
      <%request.removeAttribute("name")%>
      作用域可以是pageContext, request, session, application
    • if else
      JSTL通过<c:if test=""> 进行条件判断,但是JSTP没有<c:else,所以常用的办法是在<c:if的条件里取反
      配合if使用的还有通过empty进行为空判断,empty可以判断对象是否为null,字符串长度是否为0,集合长度是否为0
    • choose
      虽然JSTL没有提供else标签,但是提供了一个else功能的标签
      1. <c:choose>
      2. <c:when test="${hp<5}">
      3. </c:when>
      4. <c:otherwise>
      5. </c:otherwise>
      6. </c:choose>
    • forEach
      可以在JSP中使用for循环,但是其可读性很差。 借助JSTL的c:forEach标签,可以改善可读性。
      <c:forEach items="${lists}" var="name" varStatus="st" >
      items=”${key}” 表示遍历,此处key是集合
      var=”name” 表示把每一个集合中的元素放在name上
      varStatus=”st” 表示遍历的状态,特性如下:
    • forTokens
      <c:forTokens items="${key} " delims="...." var="name">专门用于字符串拆分,并且可以指定多个分隔符
      items=”${key}”是分割前字符串
      delims=”….” 表示分隔符
      var=”name”表示分割后新字符串名称
  • 常用格式化库指令
    fmt 标签常用来进行格式化,使用之前要加上
    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix='fmt' %>

    • fmt:formatNumber
      格式化数字,例:
      <fmt:formatNumber type="number" value="${money}" minFractionDigits="2"/>
      <fmt:formatNumber type=”number” 表示格式化数字
      minFractionDigits 小数点至少要有的位数
      maxFractionDigits 小数点最多能有的位数
    • fmt:formatDate
      格式化日期,例:
      <fmt:formatDate value="${now}" pattern="G yyyy年MM月dd日 E"/>
      <fmt:formatDate value="${now}" pattern="a HH:mm:ss.S z"/>
      <fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss"/>

      <fmt:formatDate 表示格式化日期
      yyyy 表示年份
      MM 表示月份
      dd 表示日期
      E 表示星期几
      a 表示是上午还是下午
      HH 表示小时
      mm 表示分钟
      ss 表示秒
      S 表示毫秒
      z 表示时区
  • 常用函数库指令
    fn标签提供各种实用功能,首先使用之前使用加入如下指令:
    <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

函数 描述
fn:contains(string, substring) 如果参数string中包含参数substring,返回true
fn:containsIgnoreCase(string, substring) 如果参数string中包含参数substring(忽略大小写),返回true
fn:endsWith(string, suffix) 如果参数 string 以参数suffix结尾,返回true
fn:escapeXml(string) 将有特殊意义的XML (和HTML)转换为对应的XML character entity code,并返回
fn:indexOf(string, substring) 返回参数substring在参数string中第一次出现的位置
fn:join(array, separator) 将一个给定的数组array用给定的间隔符separator串在一起,组成一个新的字符串并返回。
fn:length(item) 返回参数item中包含元素的数量。参数Item类型是数组、collection或者String。如果是String类型,返回值是String中的字符数。
fn:replace(string, before, after) 返回一个String对象。用参数after字符串替换参数string中所有出现参数before字符串的地方,并返回替换后的结果
fn:split(string, separator) 返回一个数组,以参数separator 为分割符分割参数string,分割后的每一部分就是数组的一个元素
fn:startsWith(string, prefix) 如果参数string以参数prefix开头,返回true
fn:substring(string, begin, end) 返回参数string部分字符串, 从参数begin开始到参数end位置,包括end位置的字符
fn:substringAfter(string, substring) 返回参数substring在参数string中后面的那一部分字符串
fn:substringBefore(string, substring) 返回参数substring在参数string中前面的那一部分字符串
fn:toLowerCase(string) 将参数string所有的字符变为小写,并将其返回
fn:toUpperCase(string) 将参数string所有的字符变为大写,并将其返回
fn:trim(string) 去除参数string 首尾的空格,并将其返回

EL表达式语言

  • 概述
    表达式语言(Expression Language),是Java中的一种特殊的通用编程语言,借鉴于JavaScript和XPath。主要作用是在Java Web应用程序嵌入到网页(如JSP)中,用以访问页面的上下文以及不同作用域中的对象 ,取得对象属性的值,或执行简单的运算或判断操作。EL在得到某个数据时,会自动进行数据类型的转换。
    不同版本的tomcat是否默认开启对EL表达式的支持,是不一定的。为了保证EL表达式能够正常使用,需要在<%@page 标签里加上isELIgnored=”false”
  • 语法
    • 以“${”开始,以“}”作为结束:${EL表达式}
    • 获取某对象的值可以直接写入对象的名称,如获取对象名为“user”的对象的值:${user}
    • 获取某对象的属性的值使用点操作符(“.”操作符),如获取对象user的name属性和age属性的值的语法如下:${user.name} ${user.age}
  • 作用域优先级
    EL表达式可以从pageContext,request,session,application四个作用域中取到值,如果4个作用域共有属性,EL会按照从小到大的优先级顺序获取 :
    pageContext>request>session>application
  • JavaBean
    EL可以很方便的访问JavaBean的属性
    • JavaBean概念
      JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性。名称中的“Bean”是用于Java的可重用软件组件的惯用叫法。特点:
      1. 供无参public的构造方法(默认提供)
      2. 每个属性,都有public的getter和setter
    • 获取JavaBean属性
      获取JavaBean的属性,只需要通过.符号操作就可以,如:${Student.name}
  • eq
    进行条件判断,大大简化了 JSTL的 c:if 和 c:choose 代码
    格式:${key键 判断符 值? 条件1:条件2 }
    常见判断符:
    eq相等 ne、neq不相等,
    gt大于, lt小于
    gt大于, lt小于
    gte、ge大于等于
    lte、le 小于等于
    not非 mod求模
    is [not] div by是否能被某数整除
    is [not] even是否为偶数
    is [not] odd是否为奇

发表评论

电子邮件地址不会被公开。 必填项已用*标注