El
基础
<!-- 在jsp中是默认支持EL表达式的 在page指令中添加 isELInor ed="true"会忽略当前页面中的EL表达式 -->
<!-- \${ }也可以, 意思是忽略当前EL表达式 -->
<tr>
<td><%=request.getAttribute("name") %></td>
</tr>
<tr>
<!-- 这两种方式是一样的 -->
<!-- El表达式, Express Language : 最原始的jsp需要在html页面中嵌入/</% Java /%/>语句 -->
<!-- 这样写的话, 权限太大功能太强, 不符合MVC模式轻量级的理念, 在jsp页面中应该尽可能少的或者完全不出现Java代码 -->
<!-- 所以就出现了${ } 这样的EL表达式来替换简化Java代码 -->
<!-- 可以通过${name }的方式获取内容 设置值的放是还是原来的setAttribute -->
<td>${name }</td>
</tr>
</tr>
语法
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 设置编码和响应
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
// 设置数据
req.setAttribute("name", "杜智慧");
// 创建对象
User user = new User(1, "张三");
// 将对象当做数据传入
req.setAttribute("user", user);
// 集合
List<User> users = new ArrayList<User>();
users.add(new User(1, "张三"));
users.add(new User(2, "李四"));
users.add(new User(3, "王五"));
req.setAttribute("users", users);
// map
@SuppressWarnings("rawtypes")
Map map = new HashMap();
map.put("a1", "杜智慧1");
map.put("a2", "杜智慧2");
map.put("a3", "杜智慧3");
req.setAttribute("map", map);
// 跳转
req.getRequestDispatcher("operation.jsp").forward(req, resp);
}
<body>
<!-- EL的语法 -->
<!-- 可以用过 ${域名.键名 }的方式获取指定域中的指定键的值 -->
<!-- 域名 -->
<!-- 1. pageScope -> pageContext -->
<!-- 2. requestScope -> request -->
<!-- 3. sessionScope -> session -->
<!-- 4. applicationScope -> application(ServletContext) -->
<!-- 示例, 从requestScope域中获取值 -->
${name }<br> ${requestScope.name }
<!-- ${name }这种${键名 }的方式是从最小的域开始依次开始找, 直到找到为止 -->
<br> 获取对象、List集合、Map集合的值
<br> 1. 对象:${域名称.键名.属性名}
<br> 本质上会去调用对象的getter方法
<br> ${requestScope.user.name }
<br> 2. List集合:${域名称.键名[索引]}
<br> ${users[1].name } ${users.get(1).name }
<br> <c:forEach items="${users }" var="user">${user.id } : ${user.name }</c:forEach>
<br> 3. Map集合:
<br> ${域名称.键名.key名称}
<br> ${map.a1 }
<br> ${域名称.键名["key名称"]}
<br> ${map["a2"] }
</body>
JSTL
概述
EL表达式只是用于获取简单数据和存储简单数据
如果后端传递一个集合过来,需要进行遍历,或者有需要进行逻辑判断的操作,EL表达式就不可以了,但是可以使用<% java语句 %>解决
于是有出现了新的想法
最初的想法是写JSP的人是美工或者前端(不一定懂得java语言),引入JSTL标签表示方法后,这些人就不需要懂Java代码也可以写JSP. 但是这个想法基本落空了
JSTL技术标准是由JCP(lava Community Process)组织的JSR052专家组发布,Apache组织将其列入Jakarta项目,Sun公司将JSTL的程序包加入互联网服务开发工具包内 (Web Services Developer Pack(WSDP)),作为JSP技术应用的一个标准。
JSTL标识库的作用是减少JSP文件的Java代码,使Java代码与HTML代码分离,所以JSTL标识库符合MVC设计理念。MVC设计理念的优势是将动作控制、数据处理、结果显示三者分离
并且JSTL中可以做一些循环遍历和逻辑判断等操作,可以更好的替换<% java语句 %>,使jsp页面中不再出现java代码
用于简化和替换jsp页面上的java代码
操作相关的数据库
1、核心标签:核心标签库是整个JSTL中最常用的部分,主要由以下几部分组成:基本输入输出、流程控制、迭代操作和URL操作。负责Web应用的常见工作,如:循环、表达式赋值、基本输入输出等。
2、I18N格式标签库:用来格式化显示数据的工作如:对不同区域的日期格式化等。
3、XML标签库:用来访问XML文件的工作,支持JSP对XML文档的处理。
4、数据库标签库:SQL标签库包括了大部分访问数据库的逻辑操作,包括查询、更新、事务处理、设置数据源等。可以做访问数据库的工作。
5、函数标签库:用来读取已经定义的某个函数
我们一般不会使用JSTL来进行数据库相关操作,和XML处理,经常使用到的就是核心标签库和格式化以及函数标签库
导包和引入
想要使用核心数据库这些东西就需要将这两个包导入, 然后再页面引入某一个库, 比如下面的三个, 在页面加入这句话就是引入
核心标签库 <%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
格式化 <%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt” %>
函数库 <%@ taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions” %>
示例
核心标签库
if语句在JSTL里就是这样, 但是if在这里面是单分支, 所以想多分支的可以使用switch语句也就是c:choose
格式化标签库
自定义函数标签库
创建一个tld文件
自己写一个方法, 然后按照上图信息编辑好之后就可以向核心标签库那样使用了