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();
}
}