JavaWeb基础篇(五)--JSP基础(EL&jstl)

一、EL表达式介绍

1.介绍

(1)一组特殊的工具类

(2)EL表达式专门用在JSP文件

(3)简化从域对象读取数据并输出的流程

(4)EL表达式依赖的工具包存在于Tomcat的lib目录下,开发时不需要额外导包。

2.作用

(1)从域对象中获取值

(2)执行运算

(3)提供了一些常用的web对象

(4)可以调用Java方法

二、EL表达式

       1.语法:    ${ 域对象别名.关键字 }

 2.EL表达式[ 域对象别名 ]

(1)applicationScope                 获取application域中值

(2)sessionScope                      获取session域中值

(3)requestScope                      获取request域中值

(4)pageScope                          获取page域中值

(5)param                                获取表单提交过来的参数 (相当于 request.getParameter())

(6)paramValues                       获取表单提交过来的参数

                                                 (相当于Map<String,String[]> map = request.getParameterMap())

(7)header                               获取请求头信息

(8)headerValues                      获取请求头信息

(9)initParam                           获取全局初始化的参数

(10)cookie                              获取cookie对象的引用,可以使用cookie对象的引用获取cookie的名称和值

                                                前提是在Servlet中创建了一个Cookie对象。

   eg:
     Cookie cookie = new Cookie("day","2019-02-09");

     ${ cookie.day }     获取cookie的名称为day的对象

     ${ cookie.day.name }  获取cookie对象的名称就是day

     ${ cookie.day.value }  获取cookie对象的值 2019-02-09

(11)pageContext                  获取项目的虚拟路径

     ${ pageContext.request.contextPath }       //获取项目名称

     ${ pageContext.requestremoteAddr. }       //获取ip地址等

三、EL表达式获取域对象中的属性值

1.如果域对象中的名称有相同的,适应EL表达式默认从最小的域中取值。

2.list 和 数组使用下标取值。

3.如果是map集合集合或对象 ${ map.aaa }

       如果Map集合的key是特殊字符的话,使用 ${ map["bbb.ccc"] }

四、EL表达式支持运算

五、JSTL 标签

1.JSP的内置标签

2.JSP的标签在服务器中,和HTML标签分开

3.JSP的标签出现就是为了简化编程。目的是去除 <%=  %>的方式。

4.引入jstl的标签库,使用 taglib指令

       (1)<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

              *  prefix      前缀

              *  uri            地址

       (2)直接在JSP页面使用jstl的标签

              * 使用必须先前缀 <c:标签名  属性>  输出内容(直接在HTML里面的标签)

5.jstl提供的核心标签

(1)核心标签库    ---c

(2)fn.tld          ---EL函数库

6.注意:

       EL表达式和jstl标签库,记住一点,操作都是域对象中的属性和属性的值 。

六、jstl标签详解

1.<c:out ></c:out>            输出域对象的值

       value                         输出的内容

       default              默认值(如果输出没找到值,输出默认值)

       escapeXml           设置是否转义,默认是true,设置成false就不转义

      

2.<c:set ></c:set>              向域中存入值

       var                              属性名称

       value                          属性值

       scope                          域的范围(page,request,session,application)    

       target                          目标(用于指定要设置属性的对象,这个对象必须是JavaBean                                            对象或者是java.util.Map对象)

       property                      属性(JavaBean属性 或Map 属性)

使用target和 property 修改JavaBean或者Map集合属性的值

      

3.<c:remove></c:remove> 删除域对象中的属性

       var                              要删除的属性的名称

       scope                          域的范围

 

4.<c:catch></c:catch>       捕获异常

       var                              如果发生异常,则会把异常的信息保存到 var中

 

5.<c:if></c:if>                    判断,没有else标签。

       test                             判断条件,返回true,false

       var                              test的返回结果会保存到var中

       scope                          域的范围

 

6.<c:choose>

       <c:when>

              如果满足。输出

       </c:when>

       <c:when>

              如果满足。输出

       </c:when>

       <c:otherwise>

              上面都不满足,输出

       </c:otherwise>

  </c:choose>                   判断数据,属性与if一样

 

 

7.<c:forEach></c:forEach> 迭代数据(list集合,set集合,Map集合...)

       用例子来解释属性。eg: for(String str:集合)

       用forEach标签:

       var                              循环遍历的数据保存到var声明变量中(相当于str)

       items                           要遍历的集合,注意是从域对象中取值(相当于集合)

      

              eg:         for(int i=0;i<10;i++)                  

 

       begin                          从哪里开始(相当于int i=0;)

       end                             到哪里结束(相当于i<10)

       step                             步长(相当于i+=step)

 

       varstatus                     循环遍历的过程,产生内容

              -index                  下标值

              -count                 计数器

              -first                     判断是否有第一个

              -last                      判断是否有最后一个

 

8.<c:url></c:url>                与提交的地址相关(超链接,from表单,img的src属性)

       value                           可以不写项目名   form表单为例:action="<c:url                                                         value='/servletTest'>"  注意单双引号

                                          默认拼接sessionid

       var

       scope

 

9.<c:import></c:import>   引入一个文件

       url

       var 

       context                        虚拟路径

 

10.<c:redirect></c:redirect>重定向

       url

       context

11<c:param></c:param>   参数标签

       name                          参数名称

       value                          参数值

12.<c:forTokens></c:forTokens>切分字符串    也是一个循环

       var

       item                            要切分的集合

       delims                         定义用来分割字符串的字符(切分的规则)

       varStatus

       begin   end

七、Jstl中常用的EL函数

使用之前需要引入函数库 <%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

1fn:toLowerCase         把字符串转换为小写

fn:toLowerCase("ILoveYou") 的返回值为字符串"iloveyou”

2fn:toUpperCase         把字符串转换为大写

fn:toUpperCase("ILoveYou") 的返回值为字符串“ILOVEYOU”

3.fn:trim          删除字符串首尾的空格,并返回结果字符串

例如,fn:trim("  I Love You  ") 的返回值为字符串“I Love You”。

4.fn:length      返回集合或者数组的大小

5.fn:split         以指定字符串作为分隔符分割字符串,返回字符串数组

例如,fn:split("str.split", ".")[1]的返回值为字符串“split”。

6.fn:join        以一个字符串作为分隔符,将一个字符串数组中的所有元素合并为一个字符串并返回合并后的结果字符串

fn:join(fn:split("str.join", ","), ".") 的返回值为字符串“str.join”

7.fn:indexOf   返回指定字符串在一个字符串中第一次出现的索引值。

fn:indexOf("Iloveyou","y") 的返回值为5

8.fn:contains 检测一个字符串中是否包含指定的字符串

9.fn:containsIgnoreCase 忽略大小写

10.fn:startsWith函数用于检测一个字符串是否是以指定字符串开始的

       对应 fn:endWith

11.fn:replace 将一个字符串中包含的指定子字符串替换为其它的指定字符串

fn:replace("I love you", " ", ".")的返回值为字符串“I.Love.You”

12fn:substring    用于截取一个字符串的子字符串并返回截取到的子字符串

fn:substring("ILoveYou", 1, 5) 的返回值为字符串“Love”

13.fn:substringAfter函数用于截取并返回一个字符串中的指定子字符串第一次出现之后的子字符串

       对应的是 fn:substringBefore

八、自定义EL 函数

1.开发EL函数的步骤

    * 编写一个Java类,提供一个方法,方法必须静态方法。方法必须有返回值。

  package ELbymyself;
    public class Demo1 {
     public static String sayHello(String str){
         return "你好啊  "+str;
     }
    }

    * 在WEB-INF目录下,编写.tld结尾的文件(xml文件),进行配置。

        * 在WEB-INF的目录下,不要在lib或者classes目录下

        * 创建.tld的文件(XML的文件,XML的约束的)

 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
 1.0
 myFn
 http://zhouchenming.top/el/demo1

        * 编写配置文件

<tlib-version>1.0</tlib-version>
<short-name>
myFn</short-name>
<uri>
http://zhouchenming.top/el/demo1</uri>

    * 在JSP的页面上引入自己编写的EL函数库

    <%@ taglib prefix="myFn" uri="http://zhouchenming.top/el/demo1" %>

2.作用:如果你编写一个EL的函数,JSP页面上处理不了的逻辑,你把它扔到后台使用java代码进行处理。对外提供就是一个EL函数。

九、自定义标签

1.没有标签主体

(1)编写类

public class demo2 extends SimpleTagSupport {
    private PageContext pc;
    private JspFragment jspBody;

    public void doTag() throws JspException, IOException {
        pc.getOut().write("自定义标签");
    }

      public void setJspContext(JspContext pc) {
        this.pc = (PageContext) pc;
    }

       public void setJspBody(JspFragment jspBody) {
        this.jspBody = jspBody;
    }
}

(2)编写配置文件

<tlib-version>1.0</tlib-version>
<short-name>
myTl</short-name>
<uri>
http://zhouchenming.top/jstl/demo2</uri>
<tag>
    <name>
myT</name>
    <tag-class>
ELbymyself.demo2</tag-class>
    <body-content>
empty</body-content>
</tag>

(3)在JSP文件直接使用

   <%@ taglib prefix="mytl" uri="http://zhouchenming.top/jstl/demo2" %>    
<mytl:myT/>

2.带有标签主体

(1).编写代码

public class demo3 extends SimpleTagSupport{
    private PageContext pc;
    private JspFragment jspbody;


    @Override
    public void doTag() throws JspException, IOException {
        jspbody.invoke(pc.getOut());
    }

    @Override
    public void setJspContext(JspContext pc) {
        this.pc = (PageContext) pc;
    }

    @Override
    public void setJspBody(JspFragment jspBody) {
        this.jspbody = jspBody;
    }
}

(2).编写配置文件
<tag>
    <name>out</name>
    <tag-class>ELbymyself.demo3</tag-class>
    <body-content>scriptless</body-content>
</tag>

(3).在JSP使用

  <mytl:out>

    <c:out value="你码的"></c:out>

</mytl:out>
(4).注意(标签主体的配置)

    * empty:不能有标签体内容。

    * scriptless:标签体内容不能是Java代码段,但可以是EL、JSTL等;

3.带有属性的自定义标签

(1).编写类

public class JstlDemo3 extends SimpleTagSupport{

    private PageContext pc;

    private JspFragment jspBody;

    // test和JSP页面上的if test属性名称必须是相同的

    // 你必须给我提供test属性的set方法

    private boolean test;

    public void setTest(boolean test) {

        this.test = test;

    }

    public void doTag() throws JspException, IOException {

        // 直接调用JspFragment的invoke(Writer out) ,标签主体向外输出

        if(test){

            jspBody.invoke(pc.getOut());

        }

    }



    public void setJspContext(JspContext pc) {

        this.pc = (PageContext) pc;

    }



    public void setJspBody(JspFragment jspBody) {

        this.jspBody = jspBody;

    }

}



(2)配置(包含配置属性)

 <tag>

    <name>if</name>

    <tag-class>cn.itcast.jstl.JstlDemo3</tag-class>

    <body-content>scriptless</body-content>

    <attribute>

        <name>test</name>

        <required>true</required>

        <rtexprvalue>true</rtexprvalue>

        <type>boolean</type>

    </attribute>

 </tag>



(3)使用标签

<myc:if test="${ requestScope.num eq 10 }">

    我草你麻痹

</myc:if>

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/weixin_43815050/article/details/87002581