一.EL
1.1 概述
表达式语言(Expression Language)
作用:
主要用于代替jsp中脚本的功能,简化对java代码对操作
语法:
${表达式}
1.2 使用
1.2.1 获取值
EL表达式只能从域对象(4个域)中获取数据
标准写法
${pageScope.键名} 从page域中获取指定键名对应的值
${requestScope.键名} 从request域中获取指定键名对应的值
${sessionScope.键名} 从session域中获取指定键名对应的值
${applicationScope.键名} 从servletContext域中获取指定键名对应的值
简化写法
${键名} 特点:默认从最小域开始找,找到后直接显示,不在继续寻找
注意:要求四个域键名唯一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Demo01</title> </head> <body> <h3>EL 表达式基本语法</h3> <% /*模拟Servlet向域中存值*/ pageContext.setAttribute("Username", "Jack"); request.setAttribute("Age", "50"); session.setAttribute("Gender", "Male"); application.setAttribute("Address", "NY"); %> <h5>标准语法</h5> ${pageScope.Username}<br><%--不会提示空指针异常--%> ${requestScope.Age}<br> ${sessionScope.Gender}<br> ${applicationScope.Address}<br> <h5>简化语法</h5> ${Username}<br> ${Age}<br> ${Gender}<br> ${Address}<br> </body> </html>
|
练习
获取字符串 ${键名}
获取对象(User) ${键名.属性名}
获取List(Array)集合 ${键名[索引]}
获取Map集合 ${键名.key}
${键名[“key”]}
——–
注意 El不会出现null和数组角标越界问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Demo02</title> </head> <body> <h3>获取User对象</h3> <% User user = new User("Jack", 13, "Male"); request.setAttribute("user",user); %> ${user}<br><%--执行该对象对toString方法--%> ${user.username} |${user.age} |${user.gender}<br>
<h3>获取List集合</h3> <% List<Object> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); list.add(user); request.setAttribute("list",list);
%>> ${list}<br><%--执行该对象对toString方法--%> ${list[0]} | ${list[1]} | ${list[2]} | ${list[3].username} |${list[3].age}<br> ${list[3].gender}<%--EL表达式不会出现集合(数组)角标越界异常--%>
<h3>获取map集合</h3> <% Map<String, Object> map = new HashMap<>(); map.put("key1","A"); map.put("key2","B"); map.put("key3","C"); map.put("key.4",user); request.setAttribute("map",map); %> ${map}<br><%--执行该对象对toString方法--%> ${map.get("key1")} | ${map.key2} | ${map.key3}<br> ${map['key.4']}<br> ${map['key.4'].username} | ${map['key.4'].age} | ${map['key.4'].gender} </body> </html>
|
1.2.2 执行运算
运算符 语法
算数运算符 + - * /(div) %(mod)
比较运算符 > < >= <= ==(eq) !=(ne)
逻辑运算符 &&(and)
三元运算符 ${条件表达式?为真:为假}
——– ————————–
空运算符 ${not empty 对象}
功能:
可以判断字符串和对象是否为空
可以判断一个集合的长度是否为0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Demo03</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?"Y":"N"}<br>
<h5>非空判断</h5> <% User user = new User(); request.setAttribute("user", user);
List list = new ArrayList(); list.add("aa"); request.setAttribute("list", list); %> ${not empty user}<%--if(user != null){}--%> ${not empty list}<%--if(list != null && list.size()>0)--%><br>
<h5>空值判断</h5> ${empty user}<%--if(user == null){}--%> ${empty list}<%--if(list == null && list.size()==0)--%><br> </body> </html>
|
1.2.3 隐式对象
EL表达式中有11个隐藏对象
掌握
pageContext
cookie
对象 作用
pageContext 就是jsp九大内置对象之一,可以通过它获得其他八个内置对象
cookie 可以获取浏览器指定cookie名称的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html>
<head> <title>Demo04</title> </head>
<body>
<h3>EL隐式对象</h3>
${pageContext.request.contextPath}<%--动态获取:项目名称(虚拟路径)--%><br> ${cookie.JSESSIONID.value}<%--获取指定cookie名称的值--%> </body> </html> 1.2.4 补充 jsp默认支持el表达式 servlet2.3规范中,默认不支持el表达式 忽略el表达式 方法 忽略当前jsp页面中所有的el表达式 isELIgnored=”true” 属性 忽略单个el表达式 ${表达式}
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>Demo04</title> </head> <body> <h3>EL隐式对象</h3> ${pageContext.request.contextPath}<%--动态获取:项目名称(虚拟路径)--%><br> ${cookie.JSESSIONID.value}<br><%--获取指定cookie名称的值--%> \${cookie.JSESSIONID.value}<%--获取指定cookie名称的值--%> </body> </html>
|
1.3 JavaBean
实际上是一个普通Java类
使用规范
所有字段(成员变量)为private
提供无参构造方法
提供getter,setter和is方法
实现Serializable接口
例如:如下User类有4个字段(成员变量),有全参和无参构造方法,有一个属性(username)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| public class User implements Serializable { private String Username; private Integer Age; private String Gender;
private boolean success;
public boolean isSuccess() { return success; }
public void setSuccess(boolean success) { this.success = success; }
public User() { }
public String getUsername() { return Username; }
public void setUsername(String username) { Username = username; }
public Integer getAge() { return Age; }
public void setAge(Integer age) { Age = age; }
public String getGender() { return Gender; }
public void setGender(String gender) { Gender = gender; } }
|
二.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页面使用taglib指令引入core核心标签
1 2 3 4 5 6 7 8 9
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Demo01</title> </head> <body> </body> </html>
|
2.2.2 常用标签
标签 语法
c:if 相当于Java中的if(){} <c:if test=”boolean值>
true:显示标签体内容
false:隐藏标签体内容
注意:此标签没有else功能,需要使用就取反
c:forEach 1)普通for循环for(int i=1;i<=5;i++){i}
<c:forEach>
begin=”1”起始值(包含)
end=”5”结束值(包含)
step=”1”步长1
var=”i” 当前输出临时变量
- 增强for循环 for(User user:list){user} <c:forEach items=”${list}” var=”user” varStatus=”vs”>
${user}
items=”list” 集合
var=”user” 当前输出的临时变量
varStatus=”vs” 变量状态
index 当前索引 从0开始
count 计数器 从1开始
c:choose 相当于java中的switch语句 <c:choose>等价于switch
<c:when>等价于case+break
<c:otherwise>等价于default1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Demo01</title> </head> <body> <% User user = new User(); user.setUsername("Jack"); request.setAttribute("user",user); %>
<c:if test="${empty user}"> Welcome ,Please Login </c:if> <c:if test="${not empty user}"> Welcome, ${user.username} </c:if> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Demo02</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 list = new ArrayList(); list.add(new User("A",1,"F")); list.add(new User("B",1,"F")); list.add(new User("C",1,"M")); list.add(new User("D",1,"M")); request.setAttribute("list",list); %>> ${requestScope.list}
<c:forEach items="${list}" var="user" varStatus="vs"> 索引:${vs.index}<br> 计数器:${vs.count}<br> ${user}<br> ${user.username}<br> </c:forEach> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Demo03</title> </head> <body> <h3>Choose标签</h3> <% Integer money=30000; request.setAttribute("money",money); %> <c:choose> <c:when test="${money==7000}">AAA</c:when> <c:when test="${money==8000}">BBB</c:when> <c:when test="${money==9000}">CCC</c:when> <c:when test="${money==30000}">DDD</c:when> <c:otherwise> ZZZZZZ </c:otherwise> </c:choose> </body> </html>
|
三.三层架构
3.1 概述
通常意义上的三层架构就是将整个业务应用划分为:表示层、业务逻辑层、数据访问层
区分层次的目的为了高聚合低耦合思想
表示层:称为web层,与浏览器进行数据交互(控制器合视图)
业务逻辑层:又称为service层,处理业务数据(if判断,for循环)
数据访问(持久)层:称为Dao层,与数据库进行交互(每一条记录与JavaBean实体产生对应关系)
包目录结构
com.xxx 基本包(公司域名倒写)
com.xxx.dao 持久层
com.xxx.service 业务层
com.xxx.web 表示层
com.xxx.domain 实体(JavaBean)
com.xxx.util 工具
3.2 案例:用户信息列表显示
需求:MVC模式开发代码,完成用户显示列表功能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| public class UserDao { private static List<User> list = new ArrayList<>();
static { list.add(new User("1","A","Male",18,"NY","123","sd@qq.com")); list.add(new User("2","B","Female",18,"NY","234","ad@qq.com")); list.add(new User("3","C","Male",18,"NY","345","sv@qq.com"));
}
public List<User> findAll() { return list; }}public class User { private String SID; private String Name; private String Gender; private Integer Age; private String Address; private String QQ; private String EMAIL;
public class UserService { public List<User> findAll() { UserDao userDao = new UserDao(); List<User> list = userDao.findAll(); return list; } } @WebServlet("/FindAllServlet") public class FindAllServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { UserService userService = new UserService(); List<User> list=userService.findAll(); req.setAttribute("list",list); req.getRequestDispatcher("/list.jsp").forward(req,resp); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>List</title> </head> <body> <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.SID}</td> <td>${user.name}</td> <td>${user.gender}</td> <td>${user.age}</td> <td>${user.address}</td> <td>${user.QQ}</td> <td>${user.EMAIL}</td> </tr> </c:forEach> </table> </body> </html>
|