07-EL&JSTL

时间:2020-07-28 10:59:08   收藏:0   阅读:69

EL 表达式

最初出现的目的是为了取代 JSP 页面中的 "脚本表达式<%= %>",格式:${...}。但随着 EL 的发展,其功能已不限于此。

获取数据

执行运算

获取常用开发对象

EL 中内置了 11 个对象,这些对象不需要提前定义就可以直接使用

  1. pageContext:可以很方便的获取 JSP 页面中的 9 大隐式对象;如 ${pageContext.request|session|...}
  2. pageScope:page域中属性组成的 Map
  3. requestScope:request域中属性组成的 Map
  4. sessionScope:session域中属性组成的 Map
  5. applicationScope:application域中属性组成的 Map
  6. param:所有请求参数组成的 Map<String,String>
  7. paramValues:所有请求参数组成的 Map<String,String[]>;如 ${paramValues.hobbies[2]}
  8. header:所有请求头组成的 Map<String,String>
  9. headerValues:所有请求头组成的 Map<String,String[]>
  10. cookie:所有 Cookie 信息组成的 Map<String,Cookie>;如 ${cookie.JSESSIONID.value}
  11. initParam:web 应用的所有初始化参数组成的 Map<String,String>;如 ${initParam.name1}
    《web.xml》
    <context-param>
        <param-name>name1</param-name>
        <param-value>value1</param-value>
    </context-param>
    

调用方法

不是任意方法都可以被调用,需要满足如下 3 个条件:

  1. 静态方法
  2. 写一个 tld 文件,在其中对要被调用的静态方法进行描述
  3. 用 taglib 指令将 tld 文件引入当前 JSP 页面,从而在 JSP 页面中调用描述好的方法

举例:对给定的 URL 进行 URL 编码

ELFunc.java

public class ELFunc {
    public static String encode(String str, String encode) {
        try {
            return URLEncoder.encode(str, encode);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}

MyELFunc.tld(放在 WEB-INF 目录下)

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" 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">
    <tlib-version>1.0</tlib-version>
    <short-name>MyELFunc</short-name>
    <uri>http://www.nuist.edu.cn/MyELFunc</uri>
    <function>
        <name>urlEncode</name>
        <function-class>cn.edu.nuist.util.ELFunc</function-class>
        <function-signature>
            java.lang.String encode(java.lang.String, java.lang.String)
        </function-signature>
    </function>
</taglib>

el3.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.nuist.edu.cn/MyELFunc" prefix="MyELFunc" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title>使用EL表达式调用方法</title>
    </head>
    <body>
        调用自定义函数:${MyELFunc:urlEncode("徐州","utf-8") }
        调用JSTL函数库中的函数:${fn:toLowerCase("JAFIOjifeoFIAWfjiof") }
    </body>
</html>

JSTL 中提供了一套 EL 自定义函数,这些函数包含了 JSP 页面制作者经常要用到的字符串操作。例如, fn:toLowerCase 将字符串中的字符变为小写,fn:indexOf 返回一个指定字符串在另一个字符串中第一次出现的索引位置。JSTL 中提供的 EL 自定义函数必须在 EL 表达式中使用。

  1. fn:toLowerCase
  2. fn:toUpperCase
  3. fn:trim
  4. fn:escapeXml
  5. fn:length
  6. fn:split
  7. fn:join
  8. fn:indexOf
  9. fn:contains
  10. fn:containsIgnoreCase
  11. fn:startsWith
  12. fn:startsWith
  13. fn:replace
  14. fn:substring
  15. fn:substringAfter
  16. fn:substringBefore

JSTL 标签库

全称:JavaServer Pages Standard Tag Library。提供给 Java Web 开发人员一个标准通用的标签函数库和 EL 配合来取代传统直接在页面上嵌入 Java 程序(Scripting)的做法,以提高程序可读性、维护性和方便性。

导入 [核心标签库c]<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

自定义标签

技术分享图片

传统标签

生命周期

第一次被使用时创建出来, 后续一直驻留在内存中, 为后续请求服务

开发步骤

以显示客户机 IP 为例

简单标签

开发步骤

执行过程

当 JSP 在执行的过程中,每当遇到一个简单标签时,都会创建一个处理类对象(如下步骤是实现接口方式的;若是继承默认实现类方式,则父类会把前几步替你做了,你就只需要提供属性声明、属性对应 setXxx()doTag() 即可)

案例

案例

If 标签

public class IfTag extends SimpleTagSupport {
    private boolean test;

    public void setTest(boolean test) {
        this.test = test;
    }

    @Override
    public void doTag() throws JspException, IOException {
        if(test) getJspBody().invoke(null);
    }
}
<tag>
    <name>if</name>
    <tag-class>cn.edu.nuist.simpletag.IfTag</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
        <name>test</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
        <type>boolean</type>
    </attribute>
</tag>

防盗链标签

public class RefTag extends SimpleTagSupport {
    @Override
    public void doTag() throws JspException, IOException {
        PageContext pC = (PageContext) getJspContext();
        HttpServletRequest request = (HttpServletRequest) pC.getRequest();
        HttpServletResponse response = (HttpServletResponse) pC.getResponse();
        String ref= request.getHeader("referer");
        if(ref == null || "".equals(ref) || !ref.startsWith("http://localhost")) {
            response.sendRedirect(request.getContextPath() + "/index.jsp");
            return;
        }
    }
}
<tag>
    <name>ref</name>
    <tag-class>cn.edu.nuist.simpletag.RefTag</tag-class>
    <body-content>empty</body-content>
</tag>

转义标签

public class TranHTMLTag extends SimpleTagSupport {
    @Override
    public void doTag() throws JspException, IOException {
        StringWriter writer = new StringWriter();
        getJspBody().invoke(writer);
        String str = writer.toString();
        // 转义
        str = filter(str);
        getJspContext().getOut().write(str);
    }

    private String filter(String message) {
        if (message == null) return (null);

        char content[] = new char[message.length()];
        message.getChars(0, message.length(), content, 0);
        StringBuffer result = new StringBuffer(content.length + 50);
        for (int i = 0; i < content.length; i++) {
            switch (content[i]) {
                case ‘<‘:
                    result.append("&lt;");
                    break;
                case ‘>‘:
                    result.append("&gt;");
                    break;
                case ‘&‘:
                    result.append("&amp;");
                    break;
                case ‘"‘:
                    result.append("&quot;");
                    break;
                default:
                    result.append(content[i]);
            }
        }
        return (result.toString());
    }
}
<tag>
    <name>tran</name>
    <tag-class>cn.edu.nuist.simpletag.TranHTMLTag</tag-class>
    <body-content>scriptless</body-content>
</tag>

分页查询功能

功能分析

分页技术

逻辑分页

物理分页

代码实现

原文:https://www.cnblogs.com/liujiaqi1101/p/13388631.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!