复习
-
JSP
-
jsp 三大指令
page
include
taglib
-
jsp 三个动作标签
<jsp:include>
<jsp:forward>
<jsp:param>
-
jsp 九个内置对象
pageContext
request
session
application
out
exception
response
page
config
-
-
EL
${ 表达式 }
取4个作用域中的值
有11个内置对象。
pageContext
pageScope
requestScope
sessionScope
applicationScope
header
headerValues
param
paramValues
cookie
initParam
-
JSTL
使用1.1的版本, 支持EL表达式, 1.0不支持EL表达式
拷贝jar包, 通过taglib 去引入标签库
一、EL表达式
全名为Expression Language,用来替代<%= %>脚本表达式。
作用是为了简化咱们的jsp代码,具体一点就是为了简化在jsp里面写的那些java代码
1.写法格式
基本结构:
${ 表达式 }
EL只能获取域中的数据!!
EL只能获取不能设置!!!
EL只能获取不能遍历!!!
2.常见的取值
- 获取数据
-
获取常量: 支持 数字/字符串/布尔值, 整个el表达式的值就是当前常量的值
-
获取变量:
el表达式可以获取变量的值,在获取时它的底层会调用pageContext的findAttribut e()方法按照由小到大的顺序在四大作用中搜寻指定名称的值,如果找到就直接返回该值, 如果找不到就什么也不输出
-
获取数组中的数据: 可以通过
数组变量名[数字]
来获取域中数组中的内容 -
获取集合中的数据: 可以通过
集合变量名[数字]
来获取域中集合中的内容 -
获取map中的数据: 可以通过
map变量名[键]
或者是map变量名.键
获取map中的数据需要注意,map变量名.键的形式,可能产生歧义,比如map.wife.another,因此这种情况下优先使用map变量名[“键”]
-
获取javaBean中的属性: 在获取javaBean中的属性值时, 点什么就相当于get什么。
-
比如: p.username <==> p.getUsername())
之前获取web应用的名称是通过 <%= request.getContextPath() %>
但是这种写法不推荐, 推荐使用el表达式来获取:
${ pageContext.request.contextPath }
3.${表达式 }
如果从作用域中取值,会先从小的作用域开始取,如果没有,就往下一个作用域取。 一直把四个作用域取完都没有, 就没有显示。
- 取出4个作用域中存放的值方式比较 。
<%
pageContext.setAttribute("name", "page");
request.setAttribute("name", "request");
session.setAttribute("name", "session");
application.setAttribute("name", "application");
%>
按普通手段取值
<%= pageContext.getAttribute("name")%>
<%= request.getAttribute("name")%>
<%= session.getAttribute("name")%>
<%= application.getAttribute("name")%>
使用EL表达式取出作用域中的值
${ pageScope.name }
${ requestScope.name }
${ sessionScope.name }
${ applicationScope.name }
- 如果域中所存的是数组
<%
String [] a = {"aa","bb","cc","dd"};
pageContext.setAttribute("array", a);
%>
使用EL表达式取出作用域中数组的值<br>
${array[0] } , ${array[1] },${array[2] },${array[3] }
- 如果域中锁存的是集合
使用EL表达式取出作用域中集合的值
${li[0] } , ${li[1] },${li[2] },${li[3] }
- 取出Map集合的值
<------------Map数据---------------->
<%
Map map = new HashMap();
map.put("name", "zhangsna");
map.put("age",18);
map.put("address","北京..");
map.put("address.aa","深圳..");
pageContext.setAttribute("map", map);
%>
使用EL表达式取出作用域中Map的值
${map.name } , ${map.age } , ${map.address } , ${map["address.aa"] }
5.取值细节:
- 从域中取值。 得先存值。
<%
//pageContext.setAttribute("name", "zhangsan");
session.setAttribute("name", "lisi...");
%>
- 直接指定说了,到这个作用域里面去找这个name
${ pageScope.name }
- 先从page里面找,没有去request找,去session,去application
${ name }
- 指定从session中取值
${ sessionScope.name }
- 取值方式
- 如果这份值是有下标的,那么直接使用[]
<%
String [] array = {"aa","bb","cc"}
session.setAttribute("array",array);
%>
${ array[1] } --> 这里array说的是attribute的name
- 如果没有下标, 直接使用 .的方式去取
<%
User user = new User("zhangsan",18);
session.setAttribute("u", user);
%>
//取值
${ u.name } , ${ u.age }
一般使用EL表达式,用的比较多的,都是从一个对象中取出它的属性值,比如取出某一个学生的姓名。
${ 对象名.成员 }
二、EL表达式的内置对象。
-
el中内置了11个常用对象, 可以不用预先存入域中就可以使用
pageContext
---->代表当前JSP页面环境的pageContext对象有了它就意味着el中就有了其他八大隐式对象,
-
四大作用域的隐式对象
pageScope
----> pageContextrequestScope
----> requestsessionScope
----> sessionapplicationScope
----> ServletContext- 注意: 上面这四个对象只能代表四大作用域对象身上的那个域!用来明确指定从哪个域中查找数据
-
头信息相关对象
header
headerValues
-
参数信息相关对象
param
paramValues
-
cookie
cookie -- Map<String, Cookie>
key为Cookie的名字, 值为Cookie对象
Cookie cookie1 = new Cookie("c1", "xxx")
Cookie cookie2 = new Cookie("c2", "xxx")
Cookie cookie3 = new Cookie("c3", "xxx")
c1:cookie1
c2:cookie2
c3:cookie3
${ cookie.c1.value }
- 全局初始化参数
initParam
三、EL表达式的运算规则
- 1.算术运算
- 在El表达式中, 加号只是一个运算符, 不能作为连接符使用.
- 在进行算术运算时, 对于非数字会试图先转换成数字再参与运算, 如果转换不成功就会抛异常!!
- 2.关系运算
> gt
< lt
>= ge
<= le
!= ne
== eq
3.逻辑运算
&& and
|| or
! not
4.三元表达式
表达式 ? "xx" : "xx"
5.empty运算:
◇ 判断对象是否为null,
◇ 判断字符串是否为空字符串,
◇ 判断数组是否为空数组,
◇ 判断集合中是否没有任何元素,
◇ 判断域对象中是否没有任何属性
四、JSTL表达式
全称 : JSP Standard Tag Library jsp标准标签库
简化jsp的代码编写。 替换 <%%> 写法。 一般与EL表达式配合
为javaweb开发人员提供的一套标准通用的标签库,可以和el配合起来替JSP页面中的大部分的java代码
1.JSTL怎么使用
- 导入jar文件到工程的
WebContent/Web-Inf/lib
jstl.jar
standard.jar
- 在jsp页面上,使用taglib 指令,来引入标签库
- javaee4.0及其之前的版本中, 在使用前需要导入jstl开发包;
在javaee5.0及其以后版本中内置了jstl开发包,所以不需要我们手动导入就可以直接使用了 - 注意: 如果想支持 EL表达式,那么引入的标签库必须选择1.1的版本,1.0的版本不支持EL表达式。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2.常用标签
c:set
签用于把某一个对象存在指定的域范围内,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的属性。
向四大作用域中增加域属性
向map中增加、修改键值对
修改javabean的属性
<!-- 声明一个对象name, 对象的值 zhangsan , 存储到了page(默认) , 指定是session -->
<c:set var="name" value="zhangsan" scope="session"></c:set>
${sessionScope.name }
-
c:remove 标签用于删除各种Web域中的属性
如果不指定scope属性,会删除所有作用域中的该属性 -
c:if
构造简单的“if-then”结构的条件表达式- test 写判断表达式
- scope 声明将test的结果存入哪个域
- var 写入域时的属性名
判断test里面的表达式是否满足,如果满足,就执行c:if标签中的输出 , c:if 是没有else的。
<c:set var="age" value="18" ></c:set>
<c:if test="${ age > 26 }">
年龄大于了26岁...
</c:if>
<c:if test="${ age <= 26 }">
年龄小于了26岁...
</c:if>
------------------------------
定义一个变量名 flag 去接收前面表达式的值,然后存在session域中
<c:if test="${ age > 26 }" var="flag" scope="session">
年龄大于了26岁...
</c:if>
c:forEach
用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。
从1 开始遍历到10 ,得到的结果 ,赋值给 i ,并且会存储到page域中, step , 增幅为2,
<c:forEach begin="1" end="10" var="i" step="2">
${i }
</c:forEach>
-----------------------------------------------
<!-- items : 表示遍历哪一个对象,注意,这里必须写EL表达式。
var: 遍历出来的每一个元素用user 去接收。 -->
<c:forEach var="user" items="${list }">
${user.name } ----${user.age }
</c:forEach>
c:url
用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。URL重写就是将会话标识号以参数形式附加在URL地址后面
学生信息管理系统
- 需求分析
- 先写 login.jsp , 并且搭配一个LoginServlet 去获取登录信息。
- 创建用户表, 里面只要有id , username 和 password
- 创建UserDao, 定义登录的方法 , 该dao定义了对用户表的访问规则
public interface UserDao {
//这里简单就返回一个Boolean类型, 成功或者失败即可。
//但是开发的时候,登录的方法,一旦成功。这里应该返回该用户的个人信息
//@return true : 登录成功, false : 登录失败。
boolean login(String userName , String password);
}
4.创建UserDaoImpl , 实现刚才定义的登录方法。
public class UserDaoImpl implements UserDao {
@Override
public boolean login(String userName , String password) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1. 得到连接对象
conn = JDBCUtil.getConn();
String sql = "select * from t_user where username=? and password=?";
//2. 创建ps对象
ps = conn.prepareStatement(sql);
ps.setString(1, userName);
ps.setString(2, password);
//3. 开始执行。
rs = ps.executeQuery();
//如果能够成功移到下一条记录,那么表明有这个用户。
return rs.next();
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtil.release(conn, ps, rs);
}
return false;
}
}
5.在LoginServlet里面访问UserDao, 判断登录结果。 以区分对待
6.创建stu_list.jsp , 让登录成功的时候跳转过去。
7.创建学生表 , 里面字段随意。
8.定义学生的Dao . StuDao
public interface StuDao {
//查询出来所有的学生信息
List<Student> findAll();
}
9.对上面定义的StuDao 做出实现 StuDaoImpl
public class StuDaoImpl implements StuDao {
@Override
public List<Student> findAll() {
List<Student> list = new ArrayList<Student>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1. 得到连接对象
conn = JDBCUtil.getConn();
String sql = "select * from t_stu";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
//数据多了,用对象装, 对象也多了呢? 用集合装。
while(rs.next()){ //10 次 ,10个学生
Student stu = new Student();
stu.setId(rs.getInt("id"));
stu.setAge(rs.getInt("age"));
stu.setName(rs.getString("name"));
stu.setGender(rs.getString("gender"));
stu.setAddress(rs.getString("address"));
list.add(stu);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtil.release(conn, ps, rs);
}
return list;
}
}
-
在登录成功的时候,完成三件事情。
-
查询所有的学生
-
把这个所有的学生集合存储到作用域中。
-
跳转到stu_list.jsp
-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//post提交过来的数据有可能有中文, 怎么处理。
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
//1. 获取客户端提交的信息
String userName = request.getParameter("username");
String password = request.getParameter("password");
//2. 去访问dao , 看看是否满足登录。
UserDao dao = new UserDaoImpl();
boolean isSuccess = dao.login(userName, password);
//3. 针对dao的返回结果,做出响应
if(isSuccess){
//response.getWriter().write("登录成功.");
//1. 查询出来所有的学生信息。
StuDao stuDao = new StuDaoImpl();
List<Student> list = stuDao.findAll();
//2. 先把这个集合存到作用域中。
request.getSession().setAttribute("list", list);
//2. 重定向
response.sendRedirect("stu_list.jsp");
}else{
response.getWriter().write("用户名或者密码错误!");
}
}
- 在stu_list.jsp中,取出域中的集合,然后使用c标签 去遍历集合。
<table border="1" width="700">
<tr align="center">
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>性别</td>
<td>住址</td>
<td>操作</td>
</tr>
<c:forEach items="${list }" var="stu">
<tr align="center">
<td>${stu.id }</td>
<td>${stu.name }</td>
<td>${stu.age }</td>
<td>${stu.gender }</td>
<td>${stu.address }</td>
<td><a href="#">更新</a> <a href="#">删除</a></td>
</tr>
</c:forEach>
</table>