EL&&JSTL&&ThreadLocal

1.EL

1.1.什么是El表达式

​ Expression Language: 表达式语言, jsp2.0之后内置在jsp里面

​ 目的:为了使JSP写起来更加简单, 取值(取的域对象里面存的值)更加简单。(代替脚本 <% %>)
1.2. EL表达式的用途

​ 1.获取数据. 获取的是域(request,session,ServletContext)对象中存储的数据

2.EL执行运算
3. 使用EL表达式获取cookie中的数据

1.3 el获取域对象的值

语法:${requestScope|sessionScope|applicationScope.属性名};

​ 快捷写法:${属性名}, 属性名就是存在域对象里面的key
如果request,session,application同时存在且同名的话,快捷写法是从小到大获取的,但是在项目中一般不会这样子写。el表达式是直接写在body里面的,不需要写在jsp的java代码块里面
1.4 el表达式对数组,list,map,User对象的代码描述
数组和list集合都可以通过: ${域名[元素下标]}
map集合可以通过: ${域名.get(“key”)}
user对象的属性可以通过: ${域名.属性值}获取
1.4 使用el获取cookie里面的值

语法:${cookie.cookie的name.value}

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>使用el表达式获取存储在cookie中的数据</title>
</head>
<body>
    <%--
        jsp里面是内置session对象,有了session对象,那么浏览器就会携带一个名为"JSESSIONID"的cookie
        我们的目标就是获取"JSESSIONID"的值
    --%>
    <%
        Cookie[] cookies = request.getCookies();
        String cookieValue = null;
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("JSESSIONID")) {
                    cookieValue = cookie.getValue();
                }
            }
        }
    %>
    使用原始方式获取的JSESSIONID的值为: <%=cookieValue%><br>

    <%--
        ${cookie}表示获取这次请求中的所有cookie对象
        ${cookie.JSESSIONID}表示获取名为"JSESSIONID"的cookie对象
        ${cookie.JSESSIONID.value}表示获取名为"JSESSIONID"的cookie对象的value
    --%>
    使用EL表达式获取JSESSIONID的值为: ${cookie.JSESSIONID.value}
</body>
</html

JSTL表达式

1.1 什么是JSTL标签库
JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。这个JSTL标签库没有集成到JSP的, 要使用的话, 需要导jar包.
jar包如下链接
链接:https://pan.baidu.com/s/1onIX3N3ARDJ_qESllCtHow
提取码:o7rf
1.2 JSTL标签库的作用
为了简化在jsp页面上操作数据; eg: 遍历数据 判断数据等
jstl简单遍历数据

 <%--
        jstl中的forEach标签是用来代替for循环语句

        目标1: 在浏览器上显示0-9的数字
            begin属性: 从哪个下标开始遍历, 如果不写默认是从0开始
            end属性: 到哪个下标结束遍历,如果不写默认是遍历到集合/数组的最后一个元素
            step属性: 表示遍历时候的步长,默认步长是1
            var属性: 表示将遍历的结果存放进域对象时候的key
            items:要遍历的数据
    --%>
<c:forEach begin="0" end="9" step="1" var="i">
	${i}
</c:forEach><br>

jstl使用foreach遍历集合

<head>
    <title>使用forEach标签遍历集合中的数据</title>
</head>
<body>
<%
    ArrayList<String> list = new ArrayList<>();
    list.add("金");
    list.add("木");
    list.add("水");
    list.add("火");
    list.add("土");
    request.setAttribute("list",list);
%>
<c:forEach items="${list}" var="name">
    ${name} <%--金 木 水 火 土 --%>
</c:forEach>
</body>

展示到前端数据样例

  <title>展示页面</title>
</head>
<body>
<table border="1" cellspacing="0" width="800px" align="center">
    <tr>
        <th>序号</th>
        <th>用户名</th>
        <th>语文</th>
        <th>数学</th>
        <th>英语</th>
    </tr>
    <%--
        遍历出域对象里面的list中的每一个user
    --%>
    <c:forEach items="${queryAll}" var="user" varStatus="vst">
        <tr>
            <td>${vst.index}</td>
            <td>${user.username}</td>
            <td>${user.chinese}</td>
            <td>${user.math}</td>
            <td>${user.english}</td>
        </tr>
    </c:forEach>
</table>

取出域对象中的集合,然后将集合中的数据展示到表格中
varStatus属性:
遍历出来的每一个元素都拥有这一些状态,比如: index(下标)、count(序号、计数)、first(是否是第一个)
last(是否是最后一个)、current(当前元素)
这些状态会被封装到一个对象中,这个对象又会被存储到page域对象中,而varStatus就是指定这个封装了
状态的对象存储进域对象时候的key

ThreadLocal

在“事务传递参数版”中,我们必须修改方法的参数个数,传递链接,才可以完成整个事务操作。如果不传递参数,是否可以完成?在JDK中给我们提供了一个工具类:ThreadLocal,此类可以在一个线程中共享数据。

​ java.lang.ThreadLocal,该类提供了线程局部 (thread-local) 变量,用于在当前线程中共享数据。ThreadLocal工具类底层就是一个Map,key存放的当前线程,value存放需要共享的数据
DBUtil的update方法,如果不传入connection,只能使用默认的事务提交方式,如果传入connection又不能保证connection对象完全一致,所以需要使用到ThreadLocal来控制,DruidUtil代码如下:

public class DruidUtil {
    private static ThreadLocal<Connection> threadLocal = new ThreadLocal<>();
    private static DataSource dataSource;
    static {
        try {
            //1. 创建Properties对象
            Properties properties = new Properties();
            //2. 将配置文件转换成字节输入流
            InputStream is = DruidUtil.class.getClassLoader().getResourceAsStream("druid.properties");
            //3. 使用properties对象加载is
            properties.load(is);
            //druid底层是使用的工厂设计模式,去加载配置文件,创建DruidDataSource对象
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static DataSource getDataSource(){
        return dataSource;
    }

    /**
     * 让该方法获取的连接对象是同一个对象
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        Connection connection = threadLocal.get();
        if (connection == null) {
            //说明threadLocal中还没有存储连接
            connection = dataSource.getConnection();
            //将连接存储到threadLocal中
            threadLocal.set(connection);
        }
        return connection;
    }

    public static void clear() throws SQLException {
        //先将conn的autoCommit属性设置回true
        threadLocal.get().setAutoCommit(true);
        threadLocal.get().close();
        //将conn从ThreadLocal中移除
        threadLocal.remove();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值