11 JSP/EL表达式/EL函数

时间:2024-01-03 18:45:14
JSP
     * 概述: JSP(Java Server Pages)与Java Servlet一样,是在服务器端执行的不同的是先由服务器编译部署成Servlet执行
     * JSP的运行原理
          * JSP -- 翻译servlet文件 --  编译.class -- 执行

* JSP脚本元素
11 JSP/EL表达式/EL函数
<%! int x = 0; %> :定义全局变量 x=0
<%=x %> :输出全局变量
<% x=5; %> :改变全局变量x=5
<% int x = 10; %> :定义局部变量x=10
<% this.x = 20; %> :修改全局变量x=20
<%=x %> :输出局部变量x=10
* 有两行输出
* 答案:1)报错 2)0  10

* JSP页面的注释     
     JSP注释:<%-- … --%>,转化阶段消失,只能被开发人员看到,在Tomcat编译成.java文件时都看不到
     JAVA注释://、/**/、/***/,编译阶段消失
     HTML注释:<!-- … -->, 不会消失,在页面中也能看到

* JSP的指令元素
     功能
          用于指示JSP执行某些步骤
          用于指示JSP表现特定行为
* 写法:
          <%@ directive [ attribute =“value” ] * %>
分类
     page指令标记
     include指令标记
     taglib指令标记 

一: page指令标记(用来定义JSP文件的全局属性)
     格式: <%@ page aa="bb" cc="dd"%>
     这些属性可以单独使用,也可以几个或多个同时使用.*
     注意:import可以出现多次,其他属性只能出现一次。
* language:JSP的页面允许嵌入的语言。 language="java" 目前只能嵌入java语言。不需要修改。
* extends:JSP翻译成servlet文件,自己指定继承的类。自己编写的继承HttpServlet。也不需要修改。
* session:默认值true JSP的页面中可以直接使用session对象。如果是false,不能使用session。
* import:导入java的包 引入多次。
* buffer :JSP控制页面的缓冲区的大小 默认值8KB
* autoFlush :缓冲区如果满了,自动刷新(true)
* errorPage : 如果程序出现了错误,指定错误的页面。
     在web.xml配置全局错误页面
     <error-page>
     <error-code>404</error-code>
     <location>/404.jsp</location>
      </error-page>
     * 如果想要使用全局错误页面,需要把errorPage属性干掉。
* isErrorPage : 显示错误的信息。默认值是false,想要显示错误信息,true。使用exception对象。
* ContentType :设置浏览器默认打开文件的编码 等价于翻译后的的response.setConentType("xxxxx");
* pageEncoding :文件默认保存的编码
* isELIgnored :是否忽略EL(默认false) 改成true,不能使用el表达式
* 重点的:
     ContentType pageEncoding import

二: include指令的作用是在JSP页面中静态包含一个文件,同时由JSP解析包含的文件内容
* 包含页面
     <%@ include file=“filename” %> //相对于webroot
file不能为一变量
     <% String url="index.html" ; %>
     <%@ include file = "<%= url %>" %>
不可以在file 所指定的文件后接任何参数
     <%@ include file = "jw.jsp?nm=browser" %>
特点: 包含的是目标文件的源码;包含过来,一起翻译, 最终只要合乎语法规则,部分页面单独定义一些内容也不打紧.

三: taglib指令标记(于在JSP页面中导入标签库)
格式:
     <%@ taglib uri="文件的地址" prefix="前缀" %>
常用标签库JSTL
常用属性
     uri  标签文件的URI地址
     prefix  标签组的命名空间前缀

JSP的内置对象
11 JSP/EL表达式/EL函数
内置对象的类型
request HttpServletRequest
response HttpServletResponse
session HttpSession
application ServletContext
config ServletConfig
page this (HttpServlet)
pageContext PageContext
exception           Throwable (所有异常父类)
out           JspWriter      

exception对象(是java.lang.Trowable类的实例)
     (使用前 isErrorPage=“true”)
     exception对象用来处理JSP文件在执行时所有发生的错误和异常
     exception对象可以和page指令一起使用,通过指定某一个页面为错误处理页面,对错误进行处理
<%@ page isErrorPage=”true “%>的页面内使用
page 当前的对象(一般不建议使用)
     page对象是指向当前JSP程序本身的对象this
     page对象其实是java.lang.Object类的实例对象
out对象
     向客户端输出数据
     管理服务器输出缓冲区
     内部使用PrintWriter对象来输出文本级数据 
     通过page指令的buffer属性来调整缓冲区的大小,默认的缓冲区是8kb
pageContext对象★★★★★
     pageContext也是域对象,代表当前的页面范围,在当前的页面范围内获取数据。
     向JSP的四个作用域范围内存数据。
     Servlet中有三个域,而JSP有四个域。
     JSP中多了pageContext的域范围,代表当前页面范围。
     获取其他8个内置对象。
     编写框架、通用性较高的代码。

 JSP的四个域
     对象         scope
     pageContext page范围,代表当前页面 
     request 请求范围
     session 会话范围, 都是和用户自己的数据有关的。
     application 应用范围,代表整个的web应用,所有的共享。

pageContext对象可以直译为“页面上下文”对象,代表的是当前页面运行的一些属性
它是javax.servlet.jsp.PageContext类的实例对象,可以使用PageContext类的方法。pageContext对象提供了对JSP页面所有的对象及命名空间的访问
PageContext对象提供了page范围的存取方法,向JSP的四个域对象中存入值
     * setAttribute(String name, Object value) 
     * setAttribute(String name, Object value, int scope) 
     * getAttribute(String name) 
     * getAttribute(String name, int scope) 
     * removeAttribute(String name) 
     * removeAttribute(String name, int scope) 
     * findAttribute(String name) 
* 获取其他的8个内置对象
     getException方法返回exception隐式对象 
     getPage方法返回page隐式对象
     getRequest方法返回request隐式对象 
     getResponse方法返回response隐式对象 
     getServletConfig方法返回config隐式对象
     getServletContext方法返回application隐式对象
     getSession方法返回session隐式对象 
     getOut方法返回out隐式对象
* 编写框架,通用性较高代码。

JSP的动作(JSP的标签)
     JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。
* 写法: <jsp: 元素 >
<jsp:include>  
     文件包含(服务器端路径,没有项目名称)
<jsp:forward page=“转发路径” > 
     在JSP的页面中完成转发(服务器端路径,没有项目名称),将请求传递给另一个JSP页面(转发)。
<jsp:param>
     需要写在<jsp:forward>的中间(用的比较少), 可以使用request.getParameter();来接收参数
<jsp:useBean> 
     使用一个ID和一个给定作用范围和同一ID的JavaBean相关联
<jsp:setProperty> 
     设置JavaBean的属性值
<jsp:getProperty> 
     取得JavaBean的属性值

JavaBean是一个遵循特定写法的Java类,它通常具有如下特点:
     这个Java类必须具有一个无参的构造函数
     属性私有化。
     私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。
在JSP中使用JavaBean 
     JSP技术提供了三个关于JavaBean组件的动作元素,即JSP标签,它们分别为:
          <jsp:useBean>标签:用于在JSP页面中查找或实例化一个JavaBean组件。如果存在则直接返回该JavaBean对象的引用。如果不存在则实例化一个新的JavaBean对象并将它以指定的名称存储到指定的域范围中。           
               例:<jsp:useBean id="stu" class="cn.itcast.vo.Student" scope="page|request|session|application"/> //默认是page
          <jsp:setProperty>标签:用于在JSP页面中设置一个JavaBean组件的属性。
               语法格式:
                    <jsp:setProperty name="beanName" 
                         { 
                    property="propertyName" value="{string | <%= expression %>}" |
                    property="propertyName" [ param="parameterName" ] |      只支持八种基本数据类型
                    property= "*"                               javabean 和 传入的参数 保持一致 property和value ,可以简写为* 例如: http://127.0.0.1/day11/03bean/NewFile.jsp?stuName=li&stuAge=22
                         }/>
               例: <jsp:setProperty name="stu" property="name" value="likai"/>
          <jsp:getProperty>标签:用于在JSP页面中获取一个JavaBean组件的属性。
                例: <jsp:getProperty name="stu" property="name" /> 输出的结果是"likai"
//不过EL表达式才好用,这个用的不多...
* BeanUtil的使用:需要两个jar包
     案例:设置一个表单提交,然后populate成一个对象.

EL表达式(Expression Language)。
EL主要作用:
     获取数据:
          EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
     执行运算:
          利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
     获取web开发常用对象并操作其方法
          EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
     调用Java方法
          EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。

获取数据
* 可以获取域对象的数据
* 先从域中取数据
     * 从数组中取
          ${arrs[1]}
     * 从集合中取值
          ${list[1]}
     * 从map集合中取值        //map.key即可获得value的对象.
          ${map.aaa}
     * 如果特殊的字符            //在中括号中"xxx"修饰,或'xxx'修饰    
          ${map["aaa-bbb"]}   
     * 从对象中取值         //根据getter方法直接"点"获得.
          ${user.username}
获取当前页面所在项目名称:  ${pageContext.request.contextPath }

执行运算
11 JSP/EL表达式/EL函数

EL表达式语言中定义了11个隐含对象
     使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据。
     语法:${隐式对象名称}  :获得对象的引用
11 JSP/EL表达式/EL函数
11 JSP/EL表达式/EL函数
注意事项
     测试headerValues时,如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]
     测试cookie时,例${cookie.key}取的是cookie对象,如访问cookie的名称和值,须${cookie.key.name}或${cookie.key.value}
总结: 较为重要的六个隐含对象
     pageContext, pageScope, requestScope, sessionScope, applicationScope, param
param在表单提交的应用.
11 JSP/EL表达式/EL函数

EL Function开发步骤
     1.编写一个Java类的静态方法
     2.编写标签库描述符(tld)文件,在tld文件中描述自定义函数。
          编写完标签库描述文件后,需要将它放置到<web应用>\WEB-INF目录中除了classes和lib目录之外的任意子目录中。 
          //起名字的话可以与taglib中的prefix的属性保持一致.
     3.在JSP页面中导入和使用自定义函数
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <tlib-version>1.0</tlib-version>
    <short-name>likai</short-name>
    <uri>/www.likai.cn</uri>    
    <function>
        <name>toMyString</name>
        <function-class>cn.itcast.elfunction.StringUtil</function-class>
        <function-signature>java.lang.String toMyString( java.lang.String )</function-signature>
    </function>
</taglib>
//其中shrot-name表示定义自己的标签名, uri可以定义自己唯一的网址, 
function中name表示自己函数的名称, function-class找到自己编写的类,function-signature表示函数的方法声明的全程.

SUN公司JSTL之 EL函数库
     由于在JSP页面中显示数据时,经常需要对显示的字符串进行处理,SUN公司针对于一些常见处理定义了一套EL函数库供开发者使用。这些EL函数在JSTL开发包中进行描述,因此在JSP页面中使用SUN公司的EL函数库,需要导入JSTL开发包,并在页面中导入EL函数库,如下所示:
     在页面中使用JSTL定义的EL函数:
     <%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
boolean contains(java.lang.String, java.lang.String)
          Tests if an input string contains the specified substring.
案例:${fn:contains("itheima","Heima") }
boolean containsIgnoreCase(java.lang.String, java.lang.String)
          与上个函数相比忽略了大小写
boolean endsWith(java.lang.String, java.lang.String)
java.lang.String escapeXml(java.lang.String)
     以原始样式输出,而不进行解释
fn:toUpperCase 将一个字符串中包含的所有字符转换为大写形式,并返回转换后的字符串,它接收一个字符串类型的参数
fn:toUpperCase  转小写
fn:trim函数
     删除一个字符串的首尾的空格,它接收一个字符串类型的参数。注意的是,fn:trim函数不能删除字符串中间位置的空格。
fn:length函数
     返回一个集合或数组大小,或返回一个字符串中包含的字符的个数,返回值为int类型。fn:length函数接收一个参数,这个参数可以是<c:forEach>标签的items属性支持的任何类型,包括任意类型的数组、java.util.Collection、java.util.Iterator、java.util.Enumeration、java.util.Map等类的实例对象和字符串。
fn:join函数  
     以一个字符串作为分隔符,将一个字符串数组中的所有元素合并为一个字符串并返回合并后的结果字符串。fn:join函数接收两个参数,第一个参数是要操作的字符串数组,第二个参数是作为分隔符的字符串。
     如果fn:join函数的第二个参数是空字符串,则fn:join函数的返回值直接将元素连接起来。例如:
假设stringArray是保存在Web域中的一个属性,它表示一个值为{"www","it315","org"}的字符串数组,则fn:join(stringArray, “.")返回字符串
“www.it315.org”fn:join(fn:split("www,it315,org", ","), ".") 的返回值为字符串“www.it315.org”
fn:indexOf函数
     返回指定字符串在一个字符串中第一次出现的索引值,返回值为int类型。fn:indexOf函数接收两个字符串类型的参数,如果第一个参数字符串中包含第二个参数字符串,那么,不管第二个参数字符串在第一个参数字符串中出现几次,fn:indexOf函数总是返回第一次出现的索引值;如果第一个参数中不包含第二个参数,则fn:indexOf函数返回-1。如果第二个参数为空字符串,则fn:indexOf函数总是返回0。
fn:startsWith 
fn:replace 
     接收3个参数,将一个字符串中包含指定字串替换成目标字符串.
fn:substring 
fn:substringAfter
     用于截取并返回一个字符串中的指定子字符串第一次出现之后的子字符串。