JSP学习

JSP

1. 基本概念

    JSP全名为Java Server Pages,中⽂名叫java服务器页面,其根本是⼀个简化的Servlet设计,它 是由 Sun Microsystems公司倡导、许多公司参与⼀起建⽴的⼀种动态网页技术标准。

    JSP技术有点类似ASP技术(加强市场),它是在传统的页面HTML文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成 JSP文件,后缀名为(*.jsp)。 ⽤JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。 JSP将网页逻辑与网页设计的显示分离,⽀持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。


2. JSP和HTML的区别

  • HTML是静态页面,只给用户提供静态的数据;JSP是动态页面,可以嵌入JAVA代码,为用户提供动态数据。

  • html注释内容,查看源码时能看到;jsp注释,查看页面源码时看不到。

    
    <%-- jsp注释 --%>
    

3. JSP嵌套java代码

  • <% java代码%>

    • 声明标签

      <%!变量或者⽅法声明%>
      
    • 表达式标签,在页面上显示的效果

      <%= 表达式%> 
      
    • 程序代码标签,页面上动态展示内容

      <%java代码%>
      

4. JSP工作原理

JSP学习_第1张图片

  • 服务器启动(以tomcat为例),当浏览器访问页面(例如http://localhost:8080/test/index.jsp),服务器发现后缀为.jsp,它会根据路径(webapps目录下部署的项目)找到 index.jsp文件;

  • 会在work目录对应的项目中,将index.jsp翻译成index_jsp.java文件,将JSP中的所有的HTML代码通过流进行输出;

  • 对这个java文件进行编译,产⽣⼀个 index_jsp.class文件,被虚拟机加载;

  • jsp本质是servlet,服务器端是把JSP中的HTML代码以流的方式写回浏览器进行响应,用户真正拿到的是服务器处理完毕的class对象(Servlet)。

    • Servlet的方法(jsp的java文件是继承实现了HttpJspBase这个抽象类,而HttpJspBase又继承了HttpServlet,这也就是Jsp和Servlet的联系)

      //初始化
      public void _jspInit() {
      }
      //销毁
      public void _jspDestroy() {
      }
      //JSPService
      public void _jspService(.HttpServletRequest request,HttpServletResponse response){
      }    
      
    • 判断请求;

    • 内置一些对象,前端可以拿到

      final javax.servlet.jsp.PageContext pageContext; //页面上下文
      javax.servlet.http.HttpSession session = null; //session
      final javax.servlet.ServletContext application; //applicationContext
      final javax.servlet.ServletConfig config; //config
      javax.servlet.jsp.JspWriter out = null; //out
      final java.lang.Object page = this; //page:当前
      HttpServletRequest request //请求
      HttpServletResponse response //响应
      
    • 输出页面前增加的代码

      response.setContentType("text/html"); //设置响应的页面类型
      pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;
      



5. JSP的九大内置对象

    在说工作原理的时候其实提到了JSP内部内置了一些预定义对象,分别为:request、response、session、application、out、 pagecontext、config、page、exception,共九个。

JSP学习_第2张图片

  1. request 对象

    是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为⼀次请求。例如:

    <%request.setAttrbute("name","abc");%>
    <%=request.getAttrbute("name")%>
    
  2. response对象

    response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response 对象也具有作用域,它只在JSP页面内有效。所属类型为HttpServletResponse,例如:

    <%response.sendRedirect("/index.jsp")%>
    
  3. session对象

    session 对象是由服务器自动动创建的与用户请求相关的对象。服务器为每个用户都⽣成⼀个 session对象,⽤于保存该⽤户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。所属类型为HttpSession ,例如:

    <%session.setAttrbute("name","abc");%>
    <%=session.getAttrbute("name")%>
    
  4. application对象

    application 对象可将信息保存在服务器中,直到服务器关闭,application对象中保存的信息会在整个应用中都有效

    <%application.setAttrbute("name","abc");%>
    <%=application.getAttrbute("name")%>
    

    与session对象相比,application对象⽣命周期更长,类似于系统的“全局变量”: ServletContext

    区别:

    • request:单次请求
    • session:浏览器访问期间(会话期间)
    • application:服务器启动期间,所存的数据可以跨浏览器
  5. out 对象

    out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使⽤ out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据(字符输出流),为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。 例如:

    
    out.print("");
    
  6. pageContext 对象

    pageContext 对象的作用是取得任何范围的参数(作用域只能在当前页面),通过它可以获取 JSP页面的out、 request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。

    <%pageContext.setAttrbute("name","abc");%>
    <%=pageContext.getAttrbute("name")%>
    
  7. config 对象

    config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() ⽅法 可以获取⼀个config对象。当⼀个Servlet 初始化时,容器把某些信息通过config对象传递给这个 Servlet。 开发者可以在web.xml ⽂件中为应⽤程序环境中的Servlet程序和JSP页面提供初始化参数。

    
    String url= config.getServletContext().getRealPath("/image");
    

    url=<%=url %>

  8. page 对象

    page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet 接⼝引用的变量,类似于Java编程中的 this 指针。

  9. exception 对象

    exception 对象的作⽤是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用, 在⼀般的JS页面中使⽤该对象将⽆法编译JSP⽂件。excepation对象和Java的所有对象⼀样,都具有系统提供的继承结构。exception 对象⼏乎定义了所有异常情况。在Java程序中,可以使⽤try/catch关键 字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会⽣成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对 象。

    (1)在error.jsp页面中设置isErrorPage=“true” 的属性 (使⽤exception对象之前,需要先将当前页面设置成错误页面)。

    <%@ page language="java" isErrorPage="true" import="java.util.*" pageEncoding="UTF-8"%>
    

    (2) 在可能发⽣错误的页面中添加errorPage属性,指向发生错误时需要跳转的页面。

    
    <%@ page pageEncoding="utf-8" errorPage="error.jsp" contentType="text/html;charset=UTF-8" language="java" %>
    



6. JSP指令

     JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语⾔。

1.6.1语法格式

<%@ directive attribute="value" %>

1.6.2常见指令
指令名称 描述
page 定义⽹⻚依赖属性,⽐如脚本语⾔、error⻚⾯、缓存需求等等
include 包含其他⽂件
taglib 引⼊标签库的定义
  1. Page指令

    Page指令为容器提供当前页面的使用说明,⼀个JSP页面可以包含多个page指令。

    属性名 属性值 描述
    language java 解释该JSP⽂件时采⽤的语⾔,⼀般为java语⾔,默认为java
    extends 任何类的全名 编译该JSP⽂件时继承哪个类,JSP为Servlet,因此当指明继承普通类时需要实现Servlet的init、destroy等⽅法
    import 任何包名、类名 引⼊该JSP中⽤到的类、包等,import是唯⼀可以声明多次的page 指令属性,⼀个import可以引⽤多个类,中间⽤英⽂逗号隔开 <%@ page import=包名.类名,包名.类名%>
    session boolean 该JSP内是否内置Session对象,如果为true,则内置Session对象,可直接使用,否则反之,默认为true
    autoFlush boolean 是否运⾏缓存,如果为true,则使⽤out.println()等⽅法输出的字 符串并不是⽴刻到达客户端服务器的,⽽是暂时存到缓存⾥,缓存 满了或者程序⾏完毕或者执⾏out.flush()操作时才到客户端,默认 为true。
    buffer none 或者数字(单位KB) 指定缓存⼤⼩,当autoFlush设为true时有效,例如<%@ page buffer=10kb%>
    isThreadSafe boolean 是否线程安全,如果为true,则运⾏多个线程同时运行该jsp程序,否则只运⾏⼀个线程,其余线程等待,默认为false
    isErrorPage boolean 指定该页面是否为错误显示页面,如果为true,则该JSP内置有⼀ 个Exception对象exception,可直接使⽤,否则没有,默认为 false
    errorPage 某个 JSP页面的相对路径 指明⼀个错误⻚⾯,如果该JSP程序抛出⼀个未捕捉的异常,则转 到errorPage指定的⻚⾯,errorPage指定的⻚⾯通常 isErrorPage属性为true,且内置的exception对象为未捕捉的异常
    contentType 有效的⽂档类型 客户端浏览器根据该属性判断⽂档类型,例如 HTML格式为 text/html、纯⽂本格式为text/plain、JPG图像为image/jpeg、 GIF图像为image/gifWORD⽂档为application/msword,该属性常跟着charset设置编码⼀起,作⽤是通知服务器和浏览器都使用同⼀个码表
    pageEncoding UTF8,ISO8859- 1等 设置当前页面的编码格式

    例如jsp的头:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
  2. include指令

    JSP可以通过include指令来包含其他文件。被包含的⽂件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP⽂件的⼀部分,会被同时编译执行。例如:

    <%@include file="common/header.jsp"%>
    
  3. Taglib指令

    JSP API允许用户⾃定义标签,⼀个⾃定义标签库就是⾃定义标签的集合。 Taglib指令引⼊⼀个⾃定义标签集合的定义,包括库路径、自定义标签。

    
    <%@ taglib uri="uri" prefix="" %>
    



7. EL表达式

    EL(Expression Language )表达式语⾔最初定义于JSTL1.0部分,在JSP2.0中,EL从JSTL中剥离出来,放置在JSP规范中,称为JSP2.0规范的⼀部分。

    在JSP中使用EL表达式,可以简化对象和变量的访问。

1.7.1 EL表达式语法
${需要展示信息的名字}

${requestScope.key}

    如果不同的作用域中有相同的key,当表达式没有指定变量或者对象的范围时, 那么容器会依次从pageContext—>request—>session—>application中(作用范围由小到大)查找该变量或对象。

  • pageScope对象

    用于获取当前页面的属性值。

  • requestScope对象

    用于获取请求范围的属性值。

  • sessionScope对象

    用于获取会话范围的属性值。

  • applicationScope对象

    用于获取程序范围的属性值。


1.7.2 EL中的基础操作符
术语 定义
算术操作符 + 、-、 * 、/(div) 除 、 %(mod) 余数
逻辑操作符 and、&&、or、||、!、not
关系操作符 ==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。
条件操作符 A ?B :C。根据 A 赋值的结果来赋值 B 或 C。
Empty Empty操作符是⼀个前缀操作符用于判断⼀个值是否为null或者为empty。如String str = “”; ${empty str} 返回值为true。

单个变量:${a+10}
单个变量:${s}
单个对象:${key.属性名} <% //对象类型 Users u=new Users(); u.setName("王⽼五"); u.setPass("abc"); pageContext.setAttribute("u1",u); %> user.name=${u1.name} user.pass=${u1.pass} <% // list集合对象: List list=new ArrayList(); list.add("刘能"); list.add(30); list.add(u); pageContext.setAttribute("list2",list); %> list1=${list2[0]}
list2=${list2[1]}
list3=${list2[2].pass}
<% // map集合: Map map = new HashMap(); map.put("k1","key"); pageContext.setAttribute("map1",map); %> k1=${map1.k1}
判断变量是否有值或是否存在:${empty key值} List list2=new ArrayList(); list2.add("aa"); request.setAttribute("list222",list2); 判断list中是否有数据:${empty list222}



1.8 JSTL表达式

    JSP标准标签库(JSTL)是⼀个JSP标签集合,它封装了JSP应用的通用核心功能。

    JSTL⽀持通用的、结构化的任务,⽐如迭代、条件判断、XML文档操作、国际化标签、SQL标签。 除了 这些,它还提供了⼀个框架来使⽤集成JSTL的⾃定义标签。

1.8.1 标签种类

​ 根据JSTL标签所提供的功能,可以将其分为5个类别:

  • 核心标签,前缀为c,功能范围为core;

    http://java.sun.com/jsp/jstl/core
    
  • 格式化标签,前缀为fmt,功能范围为i18n;

    http://java.sun.com/jsp/jstl/fmt
    
  • sql标签,前缀为sql,功能范围为sql;

    http://java.sun.com/jsp/jstl/sql
    
  • xml标签,前缀为x,功能范围为xml;

    http://java.sun.com/jsp/jstl/xml
    
  • jstl函数,前缀为fn,功能范围为functions;

    http://java.sun.com/jsp/jstl/function
    

1.8.2 使用前提
  1. 需要下载 jakarta-taglibs-standard-版本号.zip 包并解压;

  2. 将 jakarta-taglibs-standard-版本号/lib/ 下的两个jar文件(standard.jar 和 jstl.jar ⽂件)导入;

  3. 在jsp页面中引入。

    <%@ taglib prefix=”jstl前缀” uri=”功能范围的路径”%>
    

1.8.3语法格式
  1. 核心标签(最常用)

    1. <c:out>主要用来显示数据的内容

      名称 说明 是否必须 默认值
      Value 需要显示出来的值
      default 如果value的值为null,则显示default的值
      escapeXml 是否转换特殊字符,如:<转换成 & lt; True

      例如:

      
      
    2. <c:set> 主要用来将变量存储⾄JSP范围中 或是JavaBean的属性或Map对象中

      名称 说明 是否必须 默认值
      Value 要被存储的值
      var 存⼊的变量名称
      scope var变量的JSP范围 Page
      target JavaBean或Map对象
      property 指定target对象的属性

      例如:

      
      
    3. <c:remove> 主要负责移除变量

      名称 说明 是否必须 默认值
      Var 欲移除的变量名称
      Scope var变量的jsp范围 Page

      例如:

      
      
    4. <c:if> 主要用于进行if判断,如果为true,则输出标签体中的内容

      名称 说明 是否必须 默认值
      test 表达式的结果为true,则执⾏体内容,false则相反
      var 如果用来存储test运算的结果(true或false)
      scope Var变量的JSP范围 page

      例如:

      
      	是的
      
      
    5. <c:choose>,<c:when>,<c:otherwise> 作⽤相当于if-else

      名称 说明 是否必须 默认值
      test 表达式的结果为true,则执⾏体内容,false则相反

      例如:

      
      	
      		是的
      	
          
          	不是
          
      
      
    6. <c:forEach> 循环控制,它可以将数组,集合(Collection)中的成员循序浏览⼀遍。

      名称 说明 是否必须 默认值
      var ⽤来存放现在指定的成员
      items 被迭代的集合对象
      varStatus ⽤来存放现在指的相关成员信息,例如count从1开始计数,index就是下标从0开始。
      begin 开始的位置 0
      end 结束的位置 最后⼀个成员
      step 每次迭代的间隔数 1

      例如:

      <%
      	// list集合对象:
          List list=new ArrayList();
          list.add("刘能");
          list.add("a");
          list.add("u");
          pageContext.setAttribute("list",list);
      %>
      
      
      	${sta.count}-${sta.index}-${user}
  2. 格式化标签

    1. ,将日期类型格式化为指定模式的字符串
      1. value:将要被格式化的数据
      2. pattern:格式化的模式,与SimpleDateFormat的参数设置⼀样
      3. var:格式化后的字符串所要存放的变量,若不指定var,则会将格式化的结果直接显示在页面
      4. scope:变量存放的域属性空间,默认page
      5. type:其取值为date、time、both,表示给出的value是日期、时间、还是两者都包含,默认是date
    2. ,用于将指定字符串转化为日期类型
      1. Value服务器获取的时间
      2. Pattern:转换的格式
      3. Var:页面显示的变量
    3. ,按照指定格式对数字进行格式化
      1. maxIntegerDigits:整数部分最多的位数

      2. minIntegerDigits:整数部分最少的位数

      3. maxFrctionDigits:小数部分最多的位数

      4. minFrctionDigits:⼩数部分最少的位数

      5. var:存储格式化结果的变量

      6. scope:var属性的作用域

      7. integerOnly:是否只解析整型数true或者浮点数false

      8. var:格式化后的字符串所要存放的变量,若不指定var,则会将格式化的结果直接显示在页面

      9. scope:变量存放的域属性空间,默认page

      10. type:其取值为date、time、both,表示给出的value是日期、时间、还是两者都包含,默认是date

    4. ,用于将指定字符串转化为日期类型
      1. Value服务器获取的时间
      2. Pattern:转换的格式
      3. Var:页面显示的变量
    5. ,按照指定格式对数字进行格式化
      1. maxIntegerDigits:整数部分最多的位数
      2. minIntegerDigits:整数部分最少的位数
      3. maxFrctionDigits:小数部分最多的位数
      4. minFrctionDigits:⼩数部分最少的位数
      5. var:存储格式化结果的变量
      6. scope:var属性的作用域
      7. integerOnly:是否只解析整型数true或者浮点数false

你可能感兴趣的:(JavaWeb,java,jsp)