Servlet学习总结(8)EL表达式和JSTL标签库

EL和JSTL标签库

EL表达式

EL表达式学习教程

servlet和jsp数据流获取方式,获取作用域数据对象

servlet请求数据初始化和请求转发

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        String uname = req.getParameter("uname");
        String pwd = req.getParameter("pwd");
        System.out.println(uname + ":" + pwd);

        //存储普通字符
        req.setAttribute("str","今天天气很好!");

        //存储对象
        User u = new User(1,"张三","123","man",18,"2000-01-01");
        req.setAttribute("user",u);

        //List存储普通字符
        List<String> list = new ArrayList<>();
        list.add("刘德华");
        list.add("周星驰");
        list.add("梁朝伟");
        req.setAttribute("list",list);

        //List存储对象
        List<User> list2 = new ArrayList<>();
        User u2= new User(2,"李四","456","woman",20,"1998-01-01");
        list2.add(u2);
        req.setAttribute("list2",list2);

        //Map存储普通字符
        Map<String,String> map = new HashMap<>();
        map.put("a","北京");
        map.put("b","上海");
        map.put("c","广州");
        req.setAttribute("map",map);

        //Map存储对象
        Map<String,Object> map2 = new HashMap<>();
        map2.put("a",new User(3,"王五","789","woman",20,"1998-01-01"));
        req.setAttribute("map2",map2);


        //请求转发
        req.getRequestDispatcher("/el.jsp").forward(req,resp);
        return;
    }

传统方法

<h3>传统方法获取作用域数据</h3>
<b>普通字符:<%=request.getParameter("uname")%></b><br>
<b>普通字符:<%=request.getAttribute("str")%></b><br>
<b>存储对象:<%=((User)request.getAttribute("user")).getUname()%></b><br>
<b>List存储普通字符:<%=((ArrayList)request.getAttribute("list")).get(2)%></b><br>
<b>List存储对象:<%=((ArrayList<User>)request.getAttribute("list2")).get(0).getUname()%></b><br>
<b>Map存储普通字符:<%=((Map)request.getAttribute("map")).get("a")%></b><br>
<b>Map存储对象:<%=((User)((Map)request.getAttribute("map2")).get("a")).getUname()%></b><br>

缺点:

  1. 需要导包
  2. 需要强制转换数据类型
  3. 获取数据代码繁琐

EL表达式获取

和传统方法获取数据内容一样

<b>普通字符:${param.uname}</b><br>
<b>普通字符:${str}</b><br>
<b>存储对象:${user.uname}</b><br>
<b>List存储普通字符:${list[2]}</b><br>
<b>List存储对象:${list2[0].uname}</b><br>
<b>Map存储普通字符:${map.a}</b><br>
<b>Map存储对象:${map2.a.uname}</b><br>

EL表达式作用域查找顺序

1、默认查找顺序

会按照如下顺序获取作用域数据(从小到大)

pageContext(min) > request > session > application(max)

session需要重启客户端(浏览器)后才会清空,因此注释掉session.setAttribute以后仍然能获取到作用域数据

application需要重启服务器后才会清空,因此注释掉application.setAttribute并重启浏览器以后以后仍然能获取到作用域数据

2、自定义查找顺序

${pageScope.健名}

${requestScope.健名}

${sessionScope.健名}

${applicationScope.健名}

<h3>作用域的查找顺序</h3>
<%
    pageContext.setAttribute("hello","Hello PageContext");
    request.setAttribute("hello","Hello Request");
    session.setAttribute("hello","Hello Session");
    application.setAttribute("hello","Hello Application");
%>
<b>${hello}</b><br>
<b>${pageScope.hello}</b><br>
<b>${requestScope.hello}</b><br>
<b>${sessionScope.hello}</b><br>
<b>${applicationScope.hello}</b><br>

EL表达式运算符

${逻辑运算}

${算数运算}

注意项:+表示算数运算,不表示字符连接,用EL表示字符连接会报错,如果字符为数字,会默认转换为数字进行计算(${1+'2'}结果为3,${1+'a'}直接报错)

<h3>EL的逻辑表达式</h3>
<b>1+2=${1+2}</b><br>
<b>1-2=${1-2}</b><br>
<b>1*2=${1*2}</b><br>
<b>4/3=${4/3}</b><br>
<b>5%3=${5%3}</b><br>
<b>4==2=${4==2}</b><br>
<b>1>2=${1>2}</b><br>
<b>1==1?"男":"女"=${1==1?"男":"女"}</b><br>
<b>4+'3'=${4+'3'}</b><br>

EL表达式空值判断

${empty 键名}

判断对象是否存有数据

User对象为false,因为User对象默认有值,其他类型判断为空

        req.setAttribute("s1","");
        req.setAttribute("s2",new User());
        req.setAttribute("s3",new ArrayList<>());
        req.setAttribute("s4",new HashMap<>());
<h3>EL表达式的空值判断</h3>
<b>${empty s1}---${empty s2}---${empty s3}---${empty s4}</b>

EL表达式获取请求头和Cookie数据

${header}------返回所有的请求头数据

${header["键名"]}------返回指定的键名的请求头数据

${headerValues["键名"]}------返回指定的键名(同键不同值)的值的数组

${cookie}------返回存储了所有的cookie对象的map集合

${cookie.键名}------返回指定的cookie对象

${cookie.键名.name}------返回指定的cookie对象存储的数据的键名

${cookie.键名.value}------返回指定的cookie对象存储的数据的值

<h3>EL获取请求头数据和Cookie数据</h3>
<b>header:${header}</b><br>
<b>header:${header["accept-encoding"]}</b><br>
<b>headerValues:${headerValues}</b><br>
<b>accept-language:${headerValues["accept-language"][0]}</b><br>
<b>cookie:${cookie}</b><br>
<b>cookie:${cookie.JSESSIONID}</b><br>
<b>cookieName:${cookie.JSESSIONID.name}</b><br>
<b>cookieValue:${cookie.JSESSIONID.value}</b><br>

JSTL标签库

JSTL标签学习教程

JSTL作用

提高在jsp中的逻辑代码的编写效率,使用标签

JSTL使用

  1. 导入jar包
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
        </dependency>

    pom文件引入;或者直接下载后jar包导入

  2. 声明jstl标签库的引入
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    uri有多种,引入后可以使用

JSTL核心标签库

引入成功后可以使用核心标签

常用标签:<c:out><c:set><c:remove><c:if><c:choose>

标签描述
<c:out>用于在JSP中显示数据,就像<%= ... >
<c:set>用于保存数据
<c:remove>用于删除数据
<c:catch>用来处理产生错误的异常状况,并且将错误信息储存起来
<c:if>与我们在一般程序中用的if一样
<c:choose>本身只当做<c:when>和<c:otherwise>的父标签
<c:when><c:choose>的子标签,用来判断条件是否成立
<c:otherwise><c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行
<c:import>检索一个绝对或相对 URL,然后将其内容暴露给页面
<c:forEach>基础迭代标签,接受多种集合类型
<c:forTokens>根据指定的分隔符来分隔内容并迭代输出
<c:param>用来给包含或重定向的页面传递参数
<c:redirect>重定向至一个新的URL.
<c:url>使用可选的查询参数来创造一个URL
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<%
    request.setAttribute("str","学习JSTL!");
%>
<h3>核心标签学习</h3>
<h4>基本标签</h4>
<c:out value="JSTL测试"></c:out><br>
<c:out value="${str}" default="默认值"></c:out><br>
<%--scop可以指定作用域,不指定的话默认为page--%>
<c:set var="hello" value="hello PageContext" scope="page"></c:set>
<c:set var="hello" value="hello Request" scope="request"></c:set>
<c:set var="hello" value="hello Session" scope="session"></c:set>
<c:set var="hello" value="hello Application" scope="application"></c:set>
<c:out value="${hello}"></c:out><br>
<c:out value="${sessionScope.hello}"></c:out><br>
<%--如果不指定作用域,默认删除所有作用域符合var值的数据--%>
<c:remove var="hello" scope="page"></c:remove>
<c:out value="${hello}"></c:out><br>
<h4>逻辑标签</h4>

<%--传统方式if判断--%>
<%
    int a = 4;
    if (a > 3){
%>
<i>今天天气很热</i>
<%}%><br>

<%--JSTL方式单分支if判断
    逻辑判断标签依赖于EL逻辑运算,因此表达式中的涉及到的数据必须从作用域中获取
--%>
<c:set var="a" value="4"></c:set>
<c:if test="${a > 3}">
    <i>今天天气很热</i>
</c:if><br>

<%--JSTL多分支语句判断--%>
<c:set var="score" value="55"></c:set>
<c:choose>
    <c:when test="${score >= 90}">
        <i>成绩优秀</i>
    </c:when>
    <c:when test="${score >= 80}">
        <i>成绩中等</i>
    </c:when>
    <c:when test="${score >= 70}">
        <i>成绩一般</i>
    </c:when>
    <c:when test="${score >= 60}">
        <i>成绩及格</i>
    </c:when>
    <c:otherwise>
        <i>成绩不及格</i>
    </c:otherwise>
</c:choose><br>

<%--JSTL循环
       begin:声明循环开始位置
       end:声明循环结束位置
       step:设置步长
       varStatus:声明变量记录每次循环的数据(数据存储在作用域中)
            ${vs.index}:角标
            ${vs.count}:次数
            ${vs.first}:是否第一次循环
            ${vs.last}:是否最后一次循环
       items:声明要遍历的对象。结合EL表达式获取对象
       var:声明变量记录每次循环的结果
--%>

<%
    ArrayList<String> list = new ArrayList<String>();
    list.add("aaaa");
    list.add("bbbb");
    list.add("cccc");
    request.setAttribute("list",list);
    HashMap<String,String> map = new HashMap<String,String>();
    map.put("a1","aaaa");
    map.put("b1","bbbb");
    request.setAttribute("map",map);
%>
<table border="1px">
    <tr>
        <td>uid</td>
        <td>姓名</td>
        <td>性别</td>
        <td>年龄</td>
    </tr>
    <%--常量循环--%>
    <c:forEach begin="0" end="4" step="1" varStatus="vs">
        <tr>
            <td>${vs.index}---${vs.count}---${vs.first}---${vs.last}</td>
            <td>张三</td>
            <td>男</td>
            <td>20</td>
        </tr>
    </c:forEach>
    <%--List动态循环--%>
    <c:forEach items="${list}" var="str">
        <tr>
            <td>${str}</td>
            <td>${str}</td>
            <td>${str}</td>
            <td>${str}</td>
        </tr>
    </c:forEach>
    <%--Map动态循环
            ${m.key} :获取map的键
            ${m.value}:获取map的值
    --%>
    <c:forEach items="${map}" var="m">
        <tr>
            <td>${m.key}</td>
            <td>${m.key}</td>
            <td>${m.value}</td>
            <td>${m.value}</td>
        </tr>
    </c:forEach>
</table>

JSTL格式化标签库

常用标签:<fmt:formatNumber><fmt:formatDate><fmt:parseDate><fmt:requestEncoding>

标签描述
<fmt:formatNumber>使用指定的格式或精度格式化数字
<fmt:parseNumber>解析一个代表着数字,货币或百分比的字符串
<fmt:formatDate>使用指定的风格或模式格式化日期和时间
<fmt:parseDate>解析一个代表着日期或时间的字符串
<fmt:bundle>绑定资源
<fmt:setLocale>指定地区
<fmt:setBundle>绑定资源
<fmt:timeZone>指定时区
<fmt:setTimeZone>指定时区
<fmt:message>显示资源配置文件信息
<fmt:requestEncoding>设置request的字符编码

JSTLSQL标签库

标签描述
<sql:setDataSource>指定数据源
<sql:query>运行SQL查询语句
<sql:update>运行SQL更新语句
<sql:param>将SQL语句中的参数设为指定值
<sql:dateParam>将SQL语句中的日期参数设为指定的java.util.Date 对象值
<sql:transaction>在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行

JSTL函数标签库

函数描述
fn:contains()测试输入的字符串是否包含指定的子串
fn:containsIgnoreCase()测试输入的字符串是否包含指定的子串,大小写不敏感
fn:endsWith()测试输入的字符串是否以指定的后缀结尾
fn:escapeXml()跳过可以作为XML标记的字符
fn:indexOf()返回指定字符串在输入字符串中出现的位置
fn:join()将数组中的元素合成一个字符串然后输出
fn:length()返回字符串长度
fn:replace()将输入字符串中指定的位置替换为指定的字符串然后返回
fn:split()将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回
fn:startsWith()测试输入字符串是否以指定的前缀开始
fn:substring()返回字符串的子集
fn:substringAfter()返回字符串在指定子串之后的子集
fn:substringBefore()返回字符串在指定子串之前的子集
fn:toLowerCase()将字符串中的字符转为小写
fn:toUpperCase()将字符串中的字符转为大写
fn:trim()移除首位的空白符

JSTLXML标签库

标签描述
<x:out>与<%= ... >,类似,不过只用于XPath表达式
<x:parse>解析 XML 数据
<x:set>设置XPath表达式
<x:if>判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体
<x:forEach>迭代XML文档中的节点
<x:choose><x:when>和<x:otherwise>的父标签
<x:when><x:choose>的子标签,用来进行条件判断
<x:otherwise><x:choose>的子标签,当<x:when>判断为false时被执行
<x:transform>将XSL转换应用在XML文档中
<x:param>与<x:transform>共同使用,用于设置XSL样式表
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值