EL
概述
表达式语言(Expression Language)
作用:主要用来代替jsp中脚本的功能,简化对java代码的操作。
语法:${表达式}
使用
EL表达式只能从域对象(4个域)中获取数据
获取域中的值
- 标准(了解)
-
${pageScope.键名}
从page域中获取指定键名对应的值 -
${requestScope.键名}
从request域中获取指定键名对应的值 -
${sessionScope.键名}
从session域中获取指定键名对应的值 -
${applicationScope.键名}
从servletContext域中获取指定键名对应的值
-
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo1</title>
</head>
<body>
<h3>el表达式基本语法</h3>
<%
/*模拟servlet向域中存值....*/
// pageContext.setAttribute("username", "饭岛爱老师");
request.setAttribute("username", "小泽老师");
request.setAttribute("age", 33);
session.setAttribute("sex", "女");
application.setAttribute("address", "日本");
%>
<h5>标准语法</h5>
${pageScope.username} <br> <%--不会出现空指针异常问题--%>
${requestScope.age} <br>
${sessionScope.sex}<br>
${applicationScope.address}<br>
<h5>简化语法</h5>
${username} <br>
${age} <br>
${sex}<br>
${address}<br>
</body>
</html>
执行运算
-
算数运算符
语法: + - * /(div) %(mod) -
比较运算符
语法:> < >= <= ==(eq) !=(ne) -
逻辑运算符
语法:&&(and) ||(or) !(not) -
三元运算符
语法:${条件表达式?为真:为假}
- 空运算符
语法:${not empty 对象}
功能:
可以判断字符串和对象是否为空
可以判断一个集合的长度是否为0
<%@ page import="cn.itcast.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo3</title>
</head>
<body>
<%
int a = 4;
int b = 3;
request.setAttribute("a", a);
request.setAttribute("b", b);
%>
<h5>算数运算符</h5>
${a / b} | ${a div b} <br>
${a % b} | ${a mod b}<br>
<h5>比较运算符</h5>
${a == b} | ${a eq b}<br>
${a !=b } | ${a ne b} <br>
<h5>三元运算符</h5>
${a == b ? "a相等b" : "a不等b"} <br>
<h5>非空判断</h5>
<%
User user = new User();
request.setAttribute("user", user);
List list = new ArrayList();
list.add("aa" );
request.setAttribute("list", list);
%>
user对象:${not empty user} <br> <%-- if(user !=null ){} --%>
list集合:${not empty list} <br> <%-- if(list !=null && list.size>0 ){}--%>
<h5>空值判断</h5>
user对象:${empty user} <br> <%-- if(user ==null ){} --%>
list集合:${empty list} <br> <%-- if(list ==null || list.size==0 ){}--%>
</body>
</html>
隐式对象
-
el表达式中有11个隐式对象
掌握
pageContext
就是jsp九大内置对象之一,这哥们可以获得其他八个内置对象
cookie
可以获取浏览器指定cookie名称的值 -
jsp默认支持el表达式
servlet2.3规范中,默认不支持el表达式 -
如果要忽略el表达式
1)忽略当前jsp页面中所有的el表达式
设置jsp中page指令中:isELIgnored=“true” 属性
2)忽略单个el表达式
${表达式}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo4</title>
</head>
<body>
<h3>el隐式对象..</h3>
${pageContext.request.contextPath} 动态获取:项目名称(虚拟路径) <br>
${cookie.JSESSIONID.value} 获取指定cookie名称的值... <br>
</body>
</html>
JavaBean
就是一个普通的java类
使用规范
- 所有字段(成员变量)为private
- 提供无参构造方法
- 提供getter、setter和is方法
- 实现serializable接口
JSTL
概念
Jsp 标准标签库(Jsp Standard Tag Library),是由Apache组织提供的开源的jsp标签库
作用:替换和简化jsp页面中java代码的编写
JSTL标准标签库有5个子库,但随着发展,目前常使用的是它的核心库(Core)
Core标签使用
使用步骤:
- 当前web项目引入jar包
- 当前jsp页面taglib指令引入
常用标签
c:if标签
- 就相当于,java中 if(){}
语法
<c:if test=“boolean值”></c:if>
true:显示标签体内容
false:隐藏标签体内容
通常与el表达式一起使用
注意:此标签没有else功能,如果想实现else效果,请让条件取反
<%@ page import="cn.itcast.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>demo1</title>
</head>
<body>
<%
User user = new User();
user.setUsername("jack");
request.setAttribute("user", user);
%>
<c:if test="${empty user}">
你好,请登录...
</c:if>
<c:if test="${not empty user}">
你好,${user.username}
</c:if>
</body>
</html>
c:forEach标签
- 相当于java中的for循环
1)普通for
for(int i=1; i<=5; i++){
i
}
<c:forEach begin=“1” end=“5” step=“1” var=“i”>
</c:forEach>
begin=“1” 起始值(包含)
end=“5” 结束值(包含)
step=“1” 步长为1
var=“i” 当前输出临时变量
2)增强for
for(User user : list){
user
}
<c:forEach items="${list}" var=“user” varStatus=“vs”>
${user}
</c:forEach>
items=“list” 集合
var=“user” 当前输出的临时变量
varStatus=“vs” 变量状态
index 当前索引 从0开始
count 计数器 从1开始
<%@ page import="java.util.List" %>
<%@ page import="cn.itcast.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>demo2</title>
</head>
<body>
<h3>普通for循环</h3>
<c:forEach begin="1" end="5" step="1" var="i"> <%--for循环将临时变量存储到了 pageContext域空间--%>
${i} <br>
</c:forEach>
<h3>增强for循环</h3>
<%
List<User> list = new ArrayList<>();
list.add(new User("拉克丝", 27, "女"));
list.add(new User("金克斯", 23, "女"));
list.add(new User("马尔扎哈", 127, "中"));
request.setAttribute("list", list);
%>
<c:forEach items="${list}" var="user" varStatus="vs">
索引:${vs.index} | 计数器: ${vs.count} | ${user.username} <br>
</c:forEach>
</body>
c:choose标签
- 相当于java中switch语句
<c:choose> 等价于 switch
<c:when> 等价于 case+break
<c:otherwise> 等价于 default
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>demo3</title>
</head>
<body>
<h3>choose标签</h3>
<%
Integer money = 7000;
request.setAttribute("money", money);
%>
<c:choose>
<c:when test="${money == 7000}">
单身汪....
</c:when>
<c:when test="${money == 15000}">
买房
</c:when>
<c:when test="${money > 30000}">
买车
</c:when>
<c:otherwise>
奋斗吧骚年....
</c:otherwise>
</c:choose>
</body>
</html>
三层架构(MVC升级版)
通常意义上的三层架构是将整个业务应用划分为:表现层、业务逻辑层、数据访问层
区分
表现层:又称web层,与浏览器进行数据交互(控制器和视图)
业务逻辑层:又称为service层,处理业务数据(if判断、for循环等)
数据访问层(持久层):又层为dao层,与数据库进行交互的(每一行记录与JavaBean实体对应)
包目录结构
-
com.itheima 基本包(公司域名倒写)
-
com.itheima.dao 持久层
-
com.itheima.service 业务层
-
ccom.itheima.web 表示层
-
com.itheima.domain 实体(JavaBean)
-
com.itheima.util 工具
案例练习
- index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>${NAME}</title>
</head>
<body>
<h3><a href="${pageContext.request.contextPath}/FindAllServlet">用户列表查询</a></h3>
</body>
</html>
- FindAllServlet
@WebServlet("/FindAllServlet")
public class FindAllServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.调用service查询
UserService userService = new UserService();
List<User> list = userService.findAll();
// 2.将list存储request域
request.setAttribute("list", list);
// 3.转发list.jsp
request.getRequestDispatcher("/list.jsp").forward(request, response);
}
}
- UserService
public class UserService {
public List<User> findAll() {
// 调用dao,查询
UserDao userDao = new UserDao();
List<User> list = userDao.findAll();
return list;
}
}
- UserDao
public class UserDao {
private static List<User> list = new ArrayList<>();
static {
list.add(new User("1", "如花", "女", 18, "香港", "123456", "[email protected]"));
list.add(new User("2", "甄姬", "女", 17, "扬州", "123436", "[email protected]"));
}
public List<User> findAll() {
return list;
}
}
- list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>list.jsp</title>
</head>
<body>
<%--<c:forEach items="${list}" var="user">
${user} <br>
</c:forEach>--%>
<table border="1" cellpadding="0" cellspacing="0" width="500px" align="center">
<tr>
<th>编号</th>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>地址</th>
<th>QQ</th>
<th>邮箱</th>
</tr>
<c:forEach items="${list}" var="user">
<tr align="center">
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.sex}</td>
<td>${user.age}</td>
<td>${user.address}</td>
<td>${user.qq}</td>
<td>${user.email}</td>
</tr>
</c:forEach>
</table>
</body>
</html>