EL表达式,jstl标签库,三层架构
一.EL表达式
1.概述:
表达式语言(Expression Language)
作用:主要用来代替jsp中脚本的功能,简化对java代码的操作。
语法:${表达式}
2.使用
获取值:获取域中的值: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.wsl.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>
2.执行运算
算数运算符
语法: + - * /(div) %(mod)
比较运算符
语法:> < >= <= ==(eq) !=(ne)
逻辑运算符
语法:&&(and) ||(or) !(not)
三元运算符
语法:${条件表达式?为真:为假}
------------------------------
空运算符
语法:${not empty 对象}
功能:
可以判断字符串和对象是否为空
可以判断一个集合的长度是否为0
<%@ page import="cn.wsl.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>
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>
注意事项:
* jsp默认支持el表达式
servlet2.3规范中,默认不支持el表达式* 如果要忽略el表达式
1)忽略当前jsp页面中所有的el表达式
设置jsp中page指令中:isELIgnored="true" 属性
2)忽略单个el表达式
\${表达式}
isELIgnored="false"
<%@ 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>
JavaBean:他其实就是一个普通的java类
使用规范
所有字段(成员变量)为private
提供无参构造方法
提供getter、setter和is方法
实现serializable接口
二.JSTL标签库
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.jstl标签的使用:
使用步骤:当前web项目导入jar包,在当前的jsp页面tablib指令引入 即可
2.常用标签:
① c:if标签
就相当于,java中 if(){}
语法
<c:if test="boolean值"></c:if>
true:显示标签体内容
false:隐藏标签体内容
通常与el表达式一起使用
注意:此标签没有else功能,如果想实现else效果,请让条件取反
<%@ page import="cn.wsl.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("jck");
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.wsl.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>demo</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>demo</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>
三.三层架构
1.概述:
通常意义上的三层架构就是将整个业务应用划分为:表示(现)层、业务逻辑层、数据访问层。
区分层次的目的 为了高内聚低耦合的思想
表示(现)层:又称为web层,与浏览器进行数据交互(控制器和视图)
业务逻辑层:又称为service层,处理业务数据(if判断,for循环)
数据访问(持久)层:又称为dao层,与数据库进行交互的(每一条(行)记录与javaBean实体对应)
项目目录建立规则:
* com.wsl.基本包(公司域名倒写)
* com.wsl.dao 持久层
* com.wsl.service 业务层
* ccom.wsl.web 表示层
* com.wsl.domain 实体(JavaBean)
* com.wsl.util 工具
mvc架构:
各层之间会传递一些实体对象,cn.wsl.项目名.domain(pojo,vo)
优点:降低各层之间的耦合性,提高各层代码的复用性
一个项目的完整的分包如下:
cn.wsl公司域名倒写
cn.wsl.xxx 项目名称
cn.wsl.xxx.yyy 子模块
cn.wsl.xxx.yyy.dao 子模块dao层接口
cn.wsl.xxx.yyy.dao.impl 子模块dao层实现类
cn.wsl.xxx.yyy.service 子模块service层接口
cn.wsl.xxx.yyy.service.impl 子模块service层实现类
cn.wsl.xxx.yyy.domain 子模块JavaBean (子模块yyy可省略)
cn.wsl.xxx.yyy.web.servlet 子模块web层,servlet
cn.wsl.xxx.yyy.web.filter 子模块web层,filter
cn.wsl.xxx.util 工具
cn.wsl.xxx.exception 自定义异常
cn.wsl.xxx.constant 常量
四.案例:
coding:
进行简单的分包
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>索引</title>
</head>
<body>
<h1><a href="${pageContext.request.contextPath}/FindAllServlet">用户列表查询</a></h1>
</body>
</html>
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>列表</title>
<style type="text/css">
#content {
margin: 0 auto;
border: red solid 1px;
width: 800px;
height: 600px;
}
table {
width: 800px;
}
td{
border: red solid 1px;
}
</style>
</head>
<body>
<div id="content">
<table>
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>性别</td>
<td>QQ</td>
</tr>
<c:forEach items="${list}" var="user" varStatus="sl">
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.age}</td>
<td>${user.sex}</td>
<td>${user.QQ}</td>
</tr>
</c:forEach>
</table>
</div>
</body>
</html>
User.java
package com.wsl.demo.domain;
public class User {
private String id;
private String name;
private String age;
private String sex;
private String QQ;
public User() {
}
public User(String id, String name, String age, String sex, String QQ) {
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
this.QQ = QQ;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getQQ() {
return QQ;
}
public void setQQ(String QQ) {
this.QQ = QQ;
}
}
UserDao.java
package com.wsl.demo.dao;
import com.wsl.demo.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","王明明","32","男","9876543"));
list.add(new User("1","李天一","39","女","8756543"));
list.add(new User("1","张明天","26","女","4566543"));
list.add(new User("1","董永","31","男","1298743"));
list.add(new User("1","李明","35","女","9456743"));
list.add(new User("1","尚明","22","男","3890543"));
}
public List<User> findAll() {
return list;
}
}
UserService.java
package com.wsl.demo.service;
import com.wsl.demo.dao.UserDao;
import com.wsl.demo.domain.User;
import java.util.List;
public class UserService {
public List<User> findAll() {
UserDao userDao = new UserDao();
List<User> list = userDao.findAll();
return list;
}
}
FindAllServlet.java
package com.wsl.demo.web;
import com.wsl.demo.domain.User;
import com.wsl.demo.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 doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
UserService userService = new UserService();
List<User> list = userService.findAll();
request.setAttribute("list",list);
request.getRequestDispatcher("/list.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
资料