EL&JSTL&综合案例
案例一、显示所有用户案例
一、案例需求
二、技术分析
1、EL表达式
1.1.El概述
Expression Language:表达式语言, jsp2.0之后内置在jsp里面
目的:为了使JSP写起来更加简单。(代替脚本 <% %>)
1.2.EL语法
${el表达式}
1.3.EL表达式的用途
1.获取数据. 获取的是域对象中存储的数据(先把数据存到域对象里面, 再通过el来获得)
2.EL执行运算
1.4.El获取数据
1.4.1获取简单数据类型数据
语法:${requestScope|sessionScope|applicationScope.key};
快捷写法:${key},
属性名就是存在域对象里面的key
<body>
<%
request.setAttribute("rKey","rrr");
session.setAttribute("sKey","sss");
/*application就是Servlet里面的ServletContext*/
application.setAttribute("aKey","aaa");
%>
获得request里面存的数据:<br/>
老方式:<%=request.getAttribute("rKey")%><br/>
el方式: ${requestScope.rKey}<br/>
<hr/>
获得session里面存的数据:<br/>
老方式:<%=session.getAttribute("sKey")%><br/>
el方式: ${sessionScope.sKey}<br/>
<hr/>
获得application里面存的数据:<br/>
老方式:<%=application.getAttribute("aKey")%><br/>
el方式:${applicationScope.aKey}
<hr/>
简单方式的写法:<br/>
<%--${rKey}: 依次的从最小的域往最大的域找,能找到就返回--%>
获得request里面的数据:${rKey}<br/>
获得session里面的数据:${sKey}<br/>
获得servletContext里面的数据:${aKey}<br/>
</body>
1.4.2获取数组
语法: ${数组属性名[index]}
;数组属性名就是存入域对象里面的key
1.4.3获取list
语法: ${list属性名.get(index)} 或者 ${list属性名[index]};
list属性名就是存入域对象里面的key
1.4.4获取Map
语法: ${map属性名.get(键)}或者${map属性名.键}
,map属性名就是存入域对象里面的key
<%
String[] array = {"aaa","bbb","ccc"};
request.setAttribute("a",array);
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
session.setAttribute("l",list);
Map<String,String> map = new HashMap<String,String>();
map.put("akey","aaa");
map.put("bkey","bbb");
map.put("ckey","ccc");
request.setAttribute("m",map);
%>
获得数组里面的第2个值:<br/>
老方式:<%=((String[])request.getAttribute("a"))[1]%><br/>
el方式: ${a[1]} <br/>
<hr/>
获得list里面的第1个值:<br/>
老方式:<%=((List<String>)session.getAttribute("l")).get(0)%><br/>
el方式: ${l[0]} <br/>
<hr/>
获得map里面的akey对应值:<br/>
老方式:<%=((Map<String,String>)request.getAttribute("m")).get("akey")%><br/>
el方式:${m.akey} <br/>
1.4.5 获取bean
语法:${key.javabean属性}
依赖getxxx()方法; eg: getPassword()—去掉get–>Password()----首字母小写—>password
<%
User user = new User("zs", "123456", 18);
request.setAttribute("u",user);
%>
获得密码:<br/>
老方式:<%=((User)request.getAttribute("u")).getPassword()%><br/>
el方式:${u.password} <br/>
<hr/>
[ ]和.方式的区别
只要是能用.的都可以使用[ ]
带下标(数组,list)要用[ ]
有特殊字符的要用[ ]
-
获取的是三个域范围的值,存入三个域中
-
能获取到则获取,获取不到返回" "字符串 ,不是返回null
-
${域中属性名}:依次从requestScope|sessionScope|applicationScope中查找指定的属性
若找到,立即返回,且结束该次查找
若找不到返回""
-
若属性名中出现了".""+""-"等特殊的符号的时候,快捷获取的方式不好使,必须使用以下方式:
${xxxScope[“属性名”]}
特殊情况:
<%
request.setAttribute("a.b.c.d","rrr");
Map<String,String> map = new HashMap<String,String>();
map.put("a.akey","aaa");
map.put("bkey","bbb");
map.put("ckey","ccc");
request.setAttribute("m",map);
%>
${a.b.c.d}
${requestScope['a.b.c.d']}<br/>
#{m['a.akey']}
<br/>
1.4.EL执行运算
1.4.1算数运算
+,-,*,/
- +不能拼接字符串.
1.4.2逻辑运算
< >= <= != ==
1.4.3关系运算
&& || !
1.4.4非空判断(重点)
empty,判断一个对象是否为null,判断集合长度是否为0, 判断一个字符串是否为""
not empty
语法: ${empyt key};属性名 就是域对象里面的key值
<body>
<%
//request.setAttribute("a",10);
User user = null;
request.setAttribute("u",user);
User user1 = new User();
request.setAttribute("u1",user1);
List list = new ArrayList();
request.setAttribute("l",list);
List list02 = null;
request.setAttribute("l2",list02);
%>
<%--a就是从域里面获得的a
${a+19}
${a>20}
--%>
<%--1.判断对象(user是)否为null--%>
${empty u} <%--true--%>
${empty u1} <%--false--%>
${not empty u}<%--false--%>
<hr/>
<%--2.判断一个集合的长度是否为0--%>
${empty l} <%--true--%>
${empty l2} <%--true--%>
</body>
注意的地方:
+只能做加法运算,不能拼接字符串
2,JSTL标签库
2.1.JSTL概述
JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。
目的: 为了简化在jsp页面上展示数据 (遍历数据 判断数据)
2.2JSTL五大标签库
jstl的标签内容有很多,现在目前还常用的标签只有核心标签库里面的 if、choose、foreach标签,接下来我们一个一个学习。
jstl标签库,JSP并没有内置进来, 所以我们要使用的话, 就需要导入标签库的jar包
2.3.核心标签库
2.3.1使用步骤:
- 导入jar包
- 在页面上导入核心标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2.3.2if标签【重点】
- 语法
<c:if test="${el表达式}" [var="给之前的表达式的结果起个名字"] [scope="将结果保存在那个域中 默认page"]>
</c:if>
- 实例
<%request.setAttribute("a", 3); %>
<c:if test="${a>1}" var="i" scope="page">
a大于1
</c:if>
<c:if test="${a<=1}">
a不大于1
</c:if>
${i }
2.3.2choose标签
- 实例
<%
request.setAttribute("a", "前端");
%>
<c:choose>
<c:when test="${a == 'java' }">
java
</c:when>
<c:when test="${a == 'Android' }">
Android
</c:when>
<c:when test="${a == 'IOS' }">
IOS
</c:when>
<c:otherwise>
其它
</c:otherwise>
</c:choose>
2.3.3foreach标签【重点】
-
简单的使用:
-
复杂的使用:
-
c:forEach中的varStatus属性。
指向一个字符串,该字符串引用一个对象。 map.put("vs",一个对象);
这个对象记录着当前遍历的元素的一些信息:
index:返回索引。从0开始
count:返回计数。从1开始
last:是否是最后一个元素
first:是否是第一个元素
三、思路分析
四、代码实现
1.准备工作
- 数据库的创建
CREATE TABLE user (
id int primary key auto_increment,
name varchar(50),
sex varchar(50),
age int,
address varchar(50),
qq varchar(50),
email varchar(50)
);
INSERT INTO `user` (`id`, `name`, `sex`, `age`, `address`, `qq`, `email`) VALUES
(null, '张三', '男', 11, '广东', '766335435', '766335435@qq.com'),
(null, '李四', '男', 12, '广东', '243424242', '243424242@qq.com'),
(null, '王五', '女', 13, '广东', '474574574', '474574574@qq.com'),
(null, '赵六', '女', 18, '广东', '77777777', '77777777@qq.com'),
(null, '钱七', '女', 15, '湖南', '412132145', '412132145@qq.com'),
(null, '王八', '男', 25, '广西', '412132775', '412132995@qq.com');
- JavaBean的创建
public class User {
private int id;
private String name;
private String sex;
private int age;
private String address;
private String qq;
private String email;
// getter and setter and toString
}
- 导入页面
- 导入jar(连接池,JDBCTemplate,jstl标签库,驱动)和工具类
2.代码
- 页面
<a href="${pageContext.request.contextPath}/userServlet">查询所有的用户</a>
- UserServlet
@WebServlet(name = "UserServlet",value = "/userServlet")
public class UserServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//1.调用业务
UserService userService = new UserService();
List<User> list = userService.findAll();
//2. 把list存到域对象里面
request.setAttribute("list",list);
request.getRequestDispatcher("/list.jsp").forward(request,response);
} catch (Exception e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
- UserService
public class UserService {
public List<User> findAll() throws Exception {
UserDao userDao = new UserDao();
return userDao.findAll();
}
}
- UserDao
public class UserDao {
public List<User> findAll() throws Exception {
JdbcTemplate jdbcTemplate = new JdbcTemplate(C3P0Utils.getDataSource());
return jdbcTemplate.query("select * from user",new BeanPropertyRowMapper<>(User.class));
}
}
五,开发模式
1.JSP的开发模式一
JSP + JavaBean
javaBean:实体类。特点:私有化的属性、公共的getter setter方法、无参的构造。
2.JSP的开发模式二
JSP + Servlet + JavaBean 称为MVC的开发模式.
MVC:开发模式、
M:model 模型 (javaBean:封装数据)
V:View 视图 (JSP:展示数据)
C:controller 控制器 (Servlet:处理逻辑代码,做为控制器)
3.三层架构
高内聚,低耦合
三层架构包名:
简单:
com.viking.service
com.viking.dao
com.viking.domain/bean/pojo
com.viking.utils
com.viking.constants
…
复杂:
com.viking.项目名.模块名.service
com.viking.项目名.模块名.dao