jsp、EL表达式及jstl的介绍与注意事项

我怕爱的太早我们不能终老 提交于 2020-03-06 09:12:15

Jsp(是一个简化的servlet设计)

servlet技术:在java代码中嵌套html.擅长java代码编写

Jsp技术:  html输出时比较便捷,在html中嵌套java代码.擅长页面显

Jsp的传统标签:脚本、指令、标签

脚本:是jsp中嵌入的java代码

指令作用就是申明页面的属性

标签分为jsp子代内置标签和通过taglib指令来使用jsp标签库,或自定义标签

jsp脚本和注释

1.jsp脚本:

1)<%java代码%> ---内部的java代码翻译到service方法的内部

2)<%=java变量或表达式> ---会翻译成service方法内部out.print()

3)<%!java代码,方法,属性%> ----会被翻译成service的成员内容,声明方法和属性(全局变量)

jsp注释:(不同的注释可见范围不同)

1) Html注释:<!--注释内容-->

    可见范围jsp源码、翻译后的servlet、页面显示html源码

2) java注释://单行注释 /*多行注释*/

   可见范围jsp源码、翻译后的servlet

3 )  jsp注释<%--注释内容--%>

 可见范围jsp源码

2.jsp运行原理----jsp本质就是servlet

  jsp在第一次被访问时会被Web容器翻译成servlet,再执行

 过程:

       第一次访问--->helloServlet.jsp---->helloServlet_jsp.java---->编译运行

        Tomcat获得jsp文件后,先将jsp转为servlet,变成xxx.java(servlet源码),再将java文件编译成.class文件。被翻译后的servlet在Tomcat的work目录中可以找到

       1.> jsp就是特殊的servlet,编写在jsp中的html静态内容最终都是以输出对象一句句输出出去,这是jsp技术自动生成并完成响应的,程序员不需要关注这些,我们只要明白它的执行原理.

       2.> jsp在运行时会生成对应的servlet源码并编译,在客户端第一次请求时编译jsp为class文件,之后的请求不再重新编译。

       3.> jsp内容修改之后会重新编译

3.jsp指令(3个)

jsp的指令是指导jsp翻译和运行的命令.jsp包括三大指令:

1)page指令(属性最多,实际开发中page指令默认)设置页面  属性最多的一个指令,根据不同的属性,指导整个页面特性

格式:<%@ page属性名="属性值" 属性名2="属性值2"...%>

  <%@page language="java" contentType="text/html; charset=gbk" pageEncoding="gbk"%>

            language:java唯一值,表示脚本中使用的编程语言。jsp脚本中可以嵌入的语言种类

           contentType:设置了内容的类型和静态页面的编码 (告诉浏览器以什么编码显示)

           pageEncoding:页面本身的编码格式 (写页面时用的编码格式)

     import导包:<%@page import="java.util.Date"%> //具体的包和类

    session:是否jsp在翻译时自动创建session

    errorPage:

        isErrorPage:Jsp页面中出现异常的处理方式,代表当前页面是一个处理错误的页面

        对于有可能出现异常的页面:

            <%@page errorPage="error.jsp"%> //异常时会跳转到处理异常的页面;这页面自己写

       对于处理异常的页面(error.jsp)里:

            <%@page isErrorPage="true"%>,其中使用<%=exception.getMessage() %>把异常信息打印出来

2)include指令(包含页面)

页面包含(静态包含)指令,可以讲一个jsp页面包含到另一个jsp页面中

格式: <%@ include file="被包含的文件地址" %>

3)taglib指令(引入标签库)

在jsp页面中引入标签库(jstl标签库,struts2标签库)

格式:<%@ taglib uri="标签库地址" prefix="前缀"%>

4.  jsp标签(动作)

 4.1.<jsp:forward>动作

     形式:<jsp:forward page="要转发的资源"/>

    等价于 Servlet中通过RequestDispatcher.forward();

     可以传参数

         <jsp:forward  page="要转发的资源">

            <jsp:param name="name" value="angle"/>

            <jsp:param name="age" value="18" />

         </jsp:forward>

   4. 2.<jsp:Include>动作(动作包含)

     形式:<jsp:include page="被包含的页面"/>

          等价于 Servlet中通过RequestDispatcher.include();

      Include动作也可以传参数

          <jsp:include  page="被包含的页面" flush="true">

             <jsp:param name="name" value="angle"/>

          </jsp:include>

     flush 指示在读入包含内容之前是否清空任何现有的缓冲区。

静态包含<%@ include  file=””%>先将内容合在一起,在运行。只有一个class文件

动态包含<jsp:include page=””>先运行,需要时合并,有两个class文件,运行时把页面插进去

4.3 <jsp:param>动作

当使用 <jsp:include> 动作标记引入的是一个能动态执行的程序时,如 Servlet 或 JSP 页面,可以通过使用 <jsp:param> 动作标记向这个程序传递参数信息

以下4个JSP动作与JavaBean有关

<jsp:plugin>动作

<jsp:useBean>动作

<jsp:setProperty>动作

<jsp:getProperty>动作

5. jsp内置/隐式对象(9个)

jsp被翻译成servlet之后,service方法中有9个对象定义并初始化完毕,我们在jsp脚本中 可以直接使用这9个对象

page  pageContext  Out  exception   config  request  response  application  session(饿汉式创建)  

    1. Page:page对象代表当前jsp页面,是当前jsp编译后的servlet类对象.相当于this。

    2. pageContext:表示jsp页面上下文(jsp管理者) pageContext

    3. Out:输出体响应  JspWriter

    4. Exception:异常对象

    5. Config:标识Servlet配置, 类型ServletConfig

    6. Request:请求对象   HttpServletRequest

    7. Response:响应对象HttpServletResponse

    8. Application:标识web应用上下文 ServletContext

    9. Session:一次会话

注意:在page指令中,一个isErrorPage属性,默认false,被关闭了,所以无法再jsp转换后的servlet文件中看到exception对象。

1.out对象

out的类型:jspWriter

out作用就是想客户端输出内容----out.write()

out缓冲区默认8kb,可以设置成0(buffer=0),代表关闭out缓冲区,内容直接写到 response 缓冲区

Tomcat引擎会从response缓冲区获得内容,再等out缓冲区内容刷到response缓冲区时,输出相应out缓冲区的内容.所以先显示response写出的内容,在按上下文顺序显示其它写出的内容

2.pageContext对象(作用域为当前页面)

 jsp页面的上下文对象,作用如下:

1)pageContext是一个域对象

    setAttribute(name,obj);

    getAttribute(name);

    removeAttribute(name,int scope);

pageContext可以向指定的其他域中存取数据

提供作用域常量

PageContext.PAGE_SCOPE   PageContext.REQUEST_SCOPE  PageContext.SESSION_SCOPE...

findAttribute(String name)  一次性获得指定名称的内容,依次从pageContext域、request域、session域、application域中获取属性,在某个域中获取后将不在向后寻找

2)可以获得其他8大隐式对象

eg:

    pageContext.getRequest();

    pageContext.getSession();

    PageContext.getOut();

    pageContext.getResponse();

    pageContext.getServletContext();

    pageContext.getServletConfig();

    pageContext.getPage();

    pageContext.getException();

jsp的四大作用域总结的作用范围:

       page域:当前jsp页面范围

       request域:一次请求

      session:一次会话

      application域:整个web应用

EL

1.EL表达式概述(表达式言)

EL(Expression Language) 表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要代替jsp页面脚本的编写

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

在page属性中 isELIgnored=”false”  默认就是false,不忽略

2.EL从域中取出数据(EL最重要的作用)

jsp脚本:<%=request.getAttribute(name)%>

EL表达式:${requestScope.name}

EL最重要的作用是获得四大域中的数据,格式${EL表达式}

EL获得pageContext域中的值:${pageScope.key};

EL获得request域中的值:${requestScope.key};

${sessionScope.key};

${applicationScope.key};

EL从四个域中获得某个值${key} 同样是依次从pageContext域,request域,session域,application域中获取属性,在某个域中获取后将不在向后寻找

3.EL的内置对象11个

隐含对象 类型 说明
PageContext javax.servlet.ServletContext 表示此jsp的PageContext
PageScope java.util.Map 取得Page范围的属性名称所对应的值
RequestScope java.util.Map 取得request范围的属性名称所对应的值
sessionScope java.util.Map 取得Sessiont范围的属性名称所对应的值
applicationScope java.util.Map 取得Applicationt范围的属性名称所对应的值
param java.util.Map 如同ServletRequest.getParameter(String name)。回传String类型的值
paramValues java.util.Map 如同ServletRequest.getParameterValues(String name)。回传String[]类型的值
header java.util.Map 如同ServletRequest.getHeader(String name)。回传String类型的值
headerValues java.util.Map 如同ServletRequest.getHeaders(String name)。回传String[]类型的值
cookie java.util.Map 如同HttpServletRequest.getCookies()
initParam java.util.Map 如同ServletContext.getInitParameter(String name)。回传String类型的值

pageScope,requestScope,sessionScope,applicationScope 获取jsp中域的数据  $(param/paramValues.接收参数)

相当于request.getParameter()     request.getParameterValues()

$(header/headerValues.)获取请求头信息  相当于request.getHeader(name)

initParam 获取全局初始化参数   相当于this.getServletContext().getInitParameter(name)

cookie   相当于request.getCookies()--cookie.getName()---cookie.getValue()

pageContext ---web开发中的pageContext(pageContext获得其它八大对象)

${pageContext.request.contextPath}---获得在web项目中的路径

4.EL执行表达式

   ${1+1}  进行运算

   ${empty user}  判断对象是否为null,是null对象返回true,

   ${user==null?true:false}三目运算

.与[]运算符

  1.  .与[]可以混合使用

    ${sessionScope.user.sex}等于${sessionScope.user[“sex”]}

   ${sessionScope.shoppingCart[0].price}回传结果为shoppingCart中第一项物品价格

以下情况会有差异

  2. 当要存取的属性名称中包含一些特殊字符,如.或- 等非字母或数字的符号,就一定使用[]

${user[“my-name”]} 

JSTL

jsp标准标签库(JSTL)是一个jsp标签集合,它封装了jsp应用的通用核心功能。jstl是apache提供的,使用时需要导两个jar包.[jstl.jar  standard.jar]

使用jsp的taglib指令导入核心标签库< %@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

核心标签 core

jstl 函数  fn

格式化标签 fmt

sql标签  sql

xml标签 xml

  1. 核心标签  jstl常用标签,包括判断,循环等流程语句

         <标签名称:功能>

 第一类:表达式控制标签

        <c:out value=””> 用于在jsp中输出数据,就像<%=...>

        <c:set var=”” value=”” scope=””> 保存数据,可以指定保存的范围(域)

       <c:remove var=”” value=”” scope=””> 删除数据

       <c:catch> 用来处理产生错误的异常状况,并且将错误信息储存起来.

 第二类:流程控制标签

<c:if>  与我们在一般程序中用的if一样   

     如: 

          <c:if test="${p.emp_property_issuedby=='1'}">通过</c:if>

          判断字符串相等         <c:if test="${a == b}">

         多个条件判断 ,用and或者&&       <c:if test="${a!=b and a >1 }">

<c:choose> 本身只当做<c:when>和<c:otherwise>的父标签

choose相当于if{}else if{}else{}  when可以出现1次或多次,当test属性为true时,会执行该分支。Otherwise可以出现0次或1次,表示例外。

  <c:choose>

     <c:when test=”${user.sex==’m’}”>男</c:when>

    <c:when test=”${user.sex==’f’}”>女</c:when>

    <c:otherwise>保密</c:otherwise>

  </c:choose>

<c:when> <c:choose>的子标签,用来判断条件是否成立

 第三类:循环标签

<c:forEach > 迭代标签,接受多种集合类型

 

<c:param>  用来给包含或重定向的页面传递参数  获取的话:从请求中获取req.getParameter("")

<c:redirect> 重定向至一个新的url

标签详解:

1.  <c:if test="">标签test是返回boolean的条件

2.  <c:forEach var=”” items=”” varStatus=”” >标签

    var:迭代参数的名称

   Items:要进行迭代的集合

   varStatus =”num”:迭代变量的名称,可以通过num.index获得相应的下标(从0开始)

   begin:如果指定了items,迭代就从items[begin]开始进行迭代。

   end: items从index[end]结束, 没有指定items从end结束

   step:迭代的步长,类型为整型

  使用方式有两种组合形式:

1<c: forEach begin="0" end="5" var="i">

      ${i}<br/>

</c:forEach>   ==for(int i=0;i<=5;i++){syso(i)}

2.String[] ss=new String["a","b","c"];

<c: forEach items="${ss}" var="str">

      ${str}

</c:forEach> for(String str:ss){syso(str)}

Fmt:

   <fmt:formatDate value=”${}” pattern=”yyyy-mm-dd HH:mm:ss”/>格式化时间

   <fmt:formaNum value=””  pattern=”#.00”/>格式化数字,#.00指定保留的小数位

字符串取子串:

   ${fn:substring(a, 0, 2)}

以上就是关于jsp相关的介绍,如有不足,欢迎留言指正。望不吝赐教。。。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!