八、EL表达式
什么是EL表达式
EL(Expression Language)是一种表达式语言。是为了使JSP写起来更加简单,减少java代码,可以使得获取存储在Java对象中的数据变得非常简单。在JSP2.0版本后开始支持EL表达式。
语法结构
${表达式}
${对象.属性名}
EL表达式中的操作符
操作符 | 描述 |
( ) | 优先级 |
+ | 加 |
- | 减或负 |
* | 乘 |
/ 或div | 除 |
% 或 mod | 取模 |
== 或 eq | 测试是否相等 |
!= 或 ne | 测试是否不等 |
< 或 lt | 测试是否小于 |
> 或gt | 测试是否大于 |
<= or le | 测试是否小于等于 |
>= 或 ge | 测试是否大于等于 |
&& 或 and | 测试逻辑与 |
|| 或 or | 测试逻辑或 |
! 或not | 测试取反 |
empty | 测试是否空值 |
EL表达式的隐含对象
隐含对象 | 描述 |
pageScope | page 作用域 |
requestScope | request 作用域 |
sessionScope | session 作用域 |
applicationScope | application 作用域 |
param | Request 对象的参数,字符串 |
paramValues | Request对象的参数,字符串集合 |
header | HTTP 信息头,字符串 |
headerValues | HTTP 信息头,字符串集合 |
initParam | 上下文初始化参数 |
cookie | Cookie值 |
pageContext | 当前页面的pageContext |
使用EL表达式取出作用域中的值
${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
获取作用域属性中的数据时,也可以只写属性名,EL表达式会按照pageScope、requestScope、sessionScope、applicationScope的顺序查找该属性的值。
${name}
十、JSTL标签库与EL表达式的使用
10.1 JSTL标签库的使用步骤
添加jstl.jar
在JSP页面中添加taglib指令标签。
10.2 JSTL核心标签的使用
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
10.3 c标签中的if标签的使用
标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Title</title> </head> <body> <%--test中只能存放true(显示标签中的内容)或者false(不显示标签中的内容),可以书写EL表达式--%> <c:if test="${1 == 1}"> hello JSTL </c:if> </body> </html>
10.4 c标签中的choose标签的使用
< c:choose >, < c:when >, < c:otherwise >
< c:choose >标签与Java switch语句的功能一样,用于在众多选项中做出选择。
switch语句中有case,而< c:choose >标签中对应有< c:when >,switch语句中有default,而< c:choose >标签中有< c:otherwise >。
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Title</title> </head> <body> <%--如果多个条件都满足的话,只返回第一个;条件都不满足的话返回otherwise中的结果--%> <c:choose> <c:when test="${1 == 1}"> Hello when1 </c:when> <c:when test="${1 == 1}"> Hello when2 </c:when> <c:otherwise> hello otherwise </c:otherwise> </c:choose> </body> </html>
10.5 c标签中的foreach标签的使用
迭代器,用于迭代集合。
属性 | 描述 |
items | 被迭代的集合 |
begin | 迭代器的起始因子 |
end | 迭代器的结束因子 |
step | 迭代因子的增长数 |
var | 代表当前迭代元素的变量名称 |
varStatus | 代表循环状态的变量名称 |
varStatus 属性
current: 当前这次迭代的(集合中的)项
index: 当前这次迭代从 0 开始的迭代索引
count: 当前这次迭代从 1 开始的迭代计数
first: 用来表明当前这轮迭代是否为第一次迭代的标志
last: 用来表明当前这轮迭代是否为最后一次迭代的标志
begin: 属性值
end: 属性值
step: 属性值
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Title</title> </head> <body> <%--表示0~9循环10次,step表示每次循环结束后迭代因子加2,varStatus为迭代器取的名称,可以获取迭代器的属性--%> <c:forEach begin="0" end="9" step="2" varStatus="suibian"> forEach ${suibian.count},${suibian.first},${suibian.last},${suibian.index} <br> </c:forEach> </body> </html>
10.5.1 使用foreach标签迭代List
需求:
创建Users对象,含有userid,username属性。
创建一个Servlet,在Servlet中创建多个Users对象并放到List集合中,在showUsers.jsp的页面中显示所有的Users对象的信息。
package cn.it.pojo; public class User { private int userId; private String username; public User() { } public User(int userId, String username) { this.userId = userId; this.username = username; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }
package cn.it.Servlet; import cn.it.pojo.User; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.List; @WebServlet("/find.do") public class FindUsersServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建测试数据 User user1 = new User(1,"张三"); User user2 = new User(2,"李四"); User user3 = new User(3,"王五"); User user4 = new User(4,"赵六"); List<User> userList = new ArrayList<>(); userList.add(user1); userList.add(user2); userList.add(user3); userList.add(user4); req.setAttribute("userList",userList); req.getRequestDispatcher("showUsers.jsp").forward(req,resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Title</title> </head> <body> <table border="1" align="center"> <tr> <th>userId</th> <th>userName</th> </tr> <c:forEach var="user" items="${requestScope.userList}"> <tr> <td>${user.userId}</td> <td>${user.username}</td> </tr> </c:forEach> </table> </body> </html>
10.5.2 使用foreach标签迭代Map
需求:
创建Users对象,含有userid,username属性。
创建一个Servlet,在Servlet中创建多个Users对象并放到Map集合中,在showUsers2.jsp的页面中显示所有的Users对象的信息。
package cn.it.Servlet; import cn.it.pojo.User; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @WebServlet("/find.do") public class FindUsersServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建测试数据 User user1 = new User(1,"张三"); User user2 = new User(2,"李四"); User user3 = new User(3,"王五"); User user4 = new User(4,"赵六"); Map<String,User> userMap = new HashMap<String,User>(); userMap.put("user1",user1); userMap.put("user2",user2); userMap.put("user3",user3); userMap.put("user4",user4); req.setAttribute("userMap",userMap); req.getRequestDispatcher("showUsers2.jsp").forward(req,resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Title</title> </head> <body> <table border="1" align="center"> <tr> <th>map的key</th> <th>userId</th> <th>userName</th> </tr> <c:forEach var="userMap" items="${requestScope.userMap}"> <tr> <td>${userMap.key}</td> <td>${userMap.value.userId}</td> <td>${userMap.value.username}</td> </tr> </c:forEach> </table> </body> </html>
10.6 fmt标签的使用
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
对日期的格式化处理
<fmt:formatDate value="${data}" pattern="yyyy-MM-dd"/>
对数字格的式化处理
<fmt:formatNumber value="${balance}" type="currency"/>
package cn.it.Servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Date; @WebServlet("/format.do") public class FormatServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //时间 req.setAttribute("date",new Date()); //数字 req.setAttribute("balance",36546.445); req.getRequestDispatcher("/date.jsp").forward(req, resp); } }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <html> <head> <title>Title</title> </head> <body> ${requestScope.date} <br /> <fmt:formatDate value="${requestScope.date}" pattern="yyyy-MM-dd"/> <br /> <%-- 四舍五入保留两位小数,货币符号取决于浏览器的语言--%> <fmt:formatNumber value="${requestScope.balance}" type="currency"/> </body> </html>
十一、MVC模式
11.1 什么是MVC模式
MVC模式:Model、View、Controller即模型、视图、控制器。是软件的一种架构模式(Architecture pattern)。MVC要实现的目标是将软件的用户界面和业务逻辑分离,可提高代码可扩展性、可复用性、可维护性、以及灵活性。
View(视图):用户的操作界面。如:html、jsp。
Model(模型):具体的业务模型与数据模型。如:service、dao、pojo。
Controller(控制):处理从视图层发送的请求,并选取模型层的业务模型完成响应的业务实现,并产生响应。如:Servlet。
11.2 MVC模式与应用程序分层的区别
MVC模式是一种软件的架构方式,而应用程序分层这是一种代码的组织方式。MVC模式与应用程序分层的目标都是一致的:为了解耦和、提高代码复用性。