4/22day39_el&jstl&三层架构
2020-04-24 本文已影响0人
蹦蹦跶跶的起床啊
回顾
1. jsp介绍
特殊页面,可以编写html标签,也可以编写java代码
本质上就是一个servlet
2. jsp脚本和注释
<% 脚本片段 %>
<%! 声明片段 %>
<%=输出片段 %> 相当于 out.print()方法
<%-- 注释一切 --%>
3. jsp指令
page:配置jsp页面
contentType 指定响应体的mime类型和编码方式
import 导入jar包
include:静态包含技术
taglib:导入jstl标准标签库
4. jsp内置对象
pageContext:是一个域对象
request
response
out
5. jsp动作标签
<jsp:include>:动态包含
<jsp:forward>:请求转发
<jsp:param>:携带参数
6. mvc设计思想【感知】
实现业务逻辑和视图的分离
m:模型,javaBean(1.处理业务逻辑 2.封装实体)
v:视图 jsp(展示内容 el+jstl)
c:控制器 servlet(1.接收请求 2.调用模型 3.转发视图)
EL&JSTL&三层架构
今日目标
1. el表达式
2. jstl标签库
3. 三层架构(mvc升级版...)
4. 用户信息列表展示 大作业
一 EL
1.1 概述
表达式语言(Expression Language)
作用:主要用来代替jsp中脚本的功能,简化对java代码的操作。
语法:${表达式}
1.2 使用
1.2.1 获取(域中的)值
EL表达式==只能==从域对象(4个域)中获取数据
语法
* 标准(了解)
1. ${pageScope.键名}
从page域中获取指定键名对应的值
2. ${requestScope.键名}
从request域中获取指定键名对应的值
3. ${sessionScope.键名}
从session域中获取指定键名对应的值
4. ${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>
练习【作业】
1. 获取字符串
${键名}
2. 获取对象(User)
${键名.属性名}
3. 获取List(Array)集合
${键名[索引]}
4. 获取Map集合
${键名.key}
${键名["key"]}
5. 补充
el不会出现null和索引角标越界问题
<%@ page import="cn.itcast.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo2</title>
</head>
<body>
<h3>获取user对象</h3>
<%
User user = new User("大雄", 13, "男");
request.setAttribute("user", user);
%>
${user} <br> <%--执行该对象的toString方法--%>
${user.username} | ${user.age} | ${user.sex} <br>
<h3>获取list集合</h3>
<%
List<Object> list = new ArrayList<>();
list.add("胖虎");
list.add("小夫");
list.add("静香");
list.add(user);
request.setAttribute("list", list);
%>
${list}<br><%--执行该对象的toString方法--%>
${list[0]} | ${list[1]} | ${list[2]} | ${list[3].username} | ${list[10]} <br> <%--el表达式不会出现 集合(数组)角标越界异常--%>
<h3>获取map集合</h3>
<%
Map<String, Object> map = new HashMap<>();
map.put("key1", "盲僧");
map.put("key2", "瞎子");
map.put("key3", "李青");
map.put("key.4", user);
request.setAttribute("map", map);
%>
${map}<br><%--执行该对象的toString方法--%>
${map.key1} | ${map.key2} | ${map.key3} | ${map["key.4"].username}<br>
</body>
</html>
1.2.2 执行运算
* 算数运算符
语法: + - * /(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>
1.2.3 隐式对象
* el表达式中有11个隐式对象
掌握
pageContext
就是jsp九大内置对象之一,这哥们可以获得其他八个内置对象
cookie
可以获取浏览器指定cookie名称的值
<%@ 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>
1.2.4 补充
* jsp默认支持el表达式
servlet2.3规范中,默认不支持el表达式
* 如果要忽略el表达式
1)忽略当前jsp页面中所有的el表达式
设置jsp中page指令中:isELIgnored="true" 属性
2)忽略单个el表达式
\${表达式}
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>demo4</title>
</head>
<body>
<h3>el隐式对象..</h3>
${pageContext.request.contextPath} 动态获取:项目名称(虚拟路径) <br>
\${cookie.JSESSIONID.value} 获取指定cookie名称的值... <br>
</body>
</html>
1.3 JavaBean
这哥们其实就是一个普通的java类
使用规范
- 所有字段(成员变量)为private
- 提供无参构造方法
- 提供getter、setter和is方法
- 实现serializable接口
例如:下面User类,有四个字段(成员变量),有无参构造方法,有一个属性(username)
public class User implements Serializable {
private String username;
private Integer age;
private String sex;
private boolean success; // 是否操作成功
public User() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
二 JSTL
2.1 概述
Jsp 标准标签库(Jsp Standard Tag Library),是由Apache组织提供的开源的jsp标签库
作用:替换和简化jsp页面中java代码的编写
JSTL标准标签库有5个子库,但随着发展,目前常使用的是它的核心库(Core)
标签库 | 标签库的URI | 前缀 |
---|---|---|
Core | http://java.sun.com/jsp/jstl/core | c |
国际化(几乎不用) | http://java.sun.com/jsp/jstl/fmt | fmt |
SQL(过时) | http://java.sun.com/jsp/jstl/sql | sql |
XML(过时) | http://java.sun.com/jsp/jstl/xml | x |
Functions(几乎不用) | http://java.sun.com/jsp/jstl/functions | fn |
2.2 Core标签使用
2.2.1 使用步骤
① 当前web项目引入jar包
② 当前jsp页面tablib指令引入
2.2.2 常用标签
① 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">
${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("dilireb", 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>
</html>
③ 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升级版)
改造了MVC以后的架构,就称为三层架构
3.1 概述
通常意义上的三层架构就是将整个业务应用划分为:表示(现)层、业务逻辑层、数据访问层。
区分层次的目的 为了高内聚低耦合的思想
表示(现)层:又称为web层,与浏览器进行数据交互(控制器和视图)
业务逻辑层:又称为service层,处理业务数据(if判断,for循环)
数据访问(持久)层:又称为dao层,与数据库进行交互的(每一条(行)记录与javaBean实体对应)
包目录结构
* com.itheima 基本包(公司域名倒写)
* com.itheima.dao 持久层
* com.itheima.service 业务层
* ccom.itheima.web 表示层
* com.itheima.domain 实体(JavaBean)
* com.itheima.util 工具
3.2 案例:用户信息列表展示
需求
使用MVC模式升级版(三层架构)开发代码,完成用户显示列表功能。
3.2.1 需求分析
3.2.2 环境搭建
① 创建web项目
② 导入第三方依赖jar包(jstl)
③ 创建三层包目录结构
④ 最终项目结构(必须跟讲师包名一致...否则过后果自负...)
3.2.3 代码实现
① 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>
② User实体类
public class User {
private String id;
private String name;
private String sex;
private Integer age;
private String address;
private String qq;
private String email;
public User() {
}
public User(String id, String name, String sex, Integer age, String address, String qq, String email) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
this.address = address;
this.qq = qq;
this.email = email;
}
// 省略getter/setter方法...
}
③ FindAllServlet
package cn.itcast.dzb.web;
import cn.itcast.dzb.domain.User;
import cn.itcast.dzb.service.UserService;
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.List;
@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
package cn.itcast.dzb.service;
import cn.itcast.dzb.dao.UserDao;
import cn.itcast.dzb.domain.User;
import java.util.List;
public class UserService {
public List<User> findAll() {
// 调用dao,查询
UserDao userDao = new UserDao();
List<User> list = userDao.findAll();
return list;
}
}
⑤ UserDao
package cn.itcast.dzb.dao;
import cn.itcast.dzb.domain.User;
import java.util.ArrayList;
import java.util.List;
public class UserDao {
private static List<User> list = new ArrayList<>();
static {
list.add(new User("1", "如花", "女", 18, "香港", "123456", "123456@qq.com"));
list.add(new User("2", "甄姬", "女", 17, "扬州", "123436", "123436@qq.com"));
list.add(new User("3", "马大脚", "女", 28, "北京", "223456", "223456@qq.com"));
list.add(new User("4", "波多老师", "女", 35, "日本", "423456", "423456@qq.com"));
}
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>