目录
通过servlet跳转到一个jsp,在jsp中拿到用户数据的集合
一、session会话技术
定义:
session是存放在服务器端,用于保存整个会话过程中会话数据的对象。
种差(内涵):
1、信息保存在服务器端
2、信息以对象的形式存放
session的创建、获取
HttpSession session = request.getSession();
获取request中的HttpSession对象。
返回值若为null,创建session。
HttpSession session = request.getSession(boolean b);
参数为true,用法等同于方法无参。
参数为false,返回值若为null,即返回null,不会创建session。
session值的存取、删除语法分析
以键值对的形式存数据:
session.setAttribute(String name,Object obj);
通过key值取数据:
session.getAttribute(String name);
通过key值删除数据:
session.removeAttribute(String name);
案例:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置字符编码
request.setCharacterEncoding( "utf-8");
response.setCharacterEncoding("utf-8");
//设置生成的属性
response.setContentType("text/html");
PrintWriter pw = response.getWriter();
//创建Session对象
HttpSession session = request.getSession();
//向session中保存数据
session.setAttribute("username","张三");
//从session中删除数据
session.removeAttribute("username");
//从session中获取数据并打印数据到网页上
pw.print(session.getAttribute("username"));
pw.flush();
pw.close();
}
二、EL
为什么使用EL?
提出问题:
一般JSP页面中是不是嵌入大量的Java代码?访问结构比较复杂的数据时,代码繁琐,是不是经常需要强制类型转换?
<%
Employee employee =(Employee) request.getAttribute("employee");
Computer comp = employee.getComputer();
String brand= comp.getBrand();
%>
如何解决?
EL从域对象中获取数据,自动进行类型转换,使JSP的开发变得更加简单
${requestScope.employee.computer.brand}
定义:
EL是嵌入到JSP页面中,从域或内置对象中获取数据并且进行操作的表达式语言
种差(内涵):
1、嵌入到JSP页面中
2、从域或内置对象中获取数据3、可以对获取数据进行操作
EL语法:
${EL expression }
通过变量名取值
获取对象的属性值.
获取集合元素
执行表达式
EL语法-通过变量名取值
${ 变量名 } 例如:${ username }
//在Servlet或JSP中保存数据
request.setAttribute("username", "LiYang");
//在JSP中访问数据
姓名: ${username}
指定作用域:
作用域名称 | EL中的名称 |
page | pageScope |
request | requestScope |
session | sessionScope |
application | applicationScope |
案例:
通过servlet跳转到一个jsp,在jsp中拿到用户数据的集合
用两种方法:
1.不用el
TestELServlet.java里
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置字符编码
request.setCharacterEncoding( "utf-8");
response.setCharacterEncoding("utf-8");
//设置生成的属性
response.setContentType("text/html");
List<User> users=new ArrayList<User>();
User u1=new User(1,"张三","123");
User u2=new User(2,"李四","123");
User u3=new User(3,"王五","123");
User u4=new User(4,"赵六","123");
users.add(u1);
users.add(u2);
users.add(u3);
users.add(u4);
request.setAttribute("users",users);
request.getRequestDispatcher("TestEL.jsp").forward(request, response);
}
TestEL.jsp里
<body>
<%
List<User> users=(List<User>)request.getAttribute("users");
User u=users.get(2);
out.print(u.toString());
%>
</body>
2.使用el
TestELServlet.java里
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置字符编码
request.setCharacterEncoding( "utf-8");
response.setCharacterEncoding("utf-8");
//设置生成的属性
response.setContentType("text/html");
List<User> users=new ArrayList<User>();
User u1=new User(1,"张三","123");
User u2=new User(2,"李四","123");
User u3=new User(3,"王五","123");
User u4=new User(4,"赵六","123");
users.add(u1);
users.add(u2);
users.add(u3);
users.add(u4);
request.setAttribute("users",users);
request.getRequestDispatcher("TestEL.jsp").forward(request, response);
}
TestEL.jsp里
<body>
${users[2]}
</body>
EL语法-获取对象属性值
<%=( (User)request.getAttribute("user") ) .getName()%>
相当于如下:
点操作符:
${user.name}
[ ]操作符
${user["name"]}
EL语法-获取集合元素-List
//在Servlet或JSP中保存数据
List names = new ArrayList();names.add(0, "LiYang");
names.add(1,"WangHua");
request.setAttribute("names",names);
//在JSP中访问数据
姓名∶$names[0] }<br/>
姓名:${names[1] }<br/>
//使用[ ]指定元素下标
EL语法-获取集合元素-Map
在Servlet或JSP中保存数据
Map names = new HashMap();
names.put("one","LiYang");
names.put("two", "WangHua");
request.setAttribute("names", names);
//在JSP中访问数据
姓名∶${names.one }<br/>
姓名:${names["two"] }<br/>
//根据键值对里的键
EL语法-执行表达式
了解即可,EL中条件判断一般不用,现在都用JSTL
算术运算符 | 说明 | 示例 | 结果 |
+ | 加 | ${15+2} | 17 |
- | 减 | ${15-2} | 13 |
* | 乘 | ${15*2} | 30 |
/或div | 除 | ${15/2}或${15 div 2} | 7 |
%或mod | 求余 | ${15%2}或${15 mod 2} | 1 |
关系运算符 | 说明 | 示例 | 结果 |
==(或eq) | 等于 | ${23==5}或${23 eq 5} ${"a" =="a"}或${"a" eq "a"} | false true |
!=(或ne) | 不等于 | ${23!=5}或${23 ne 5} | true |
<(或lt) | 小于 | ${23<5}或${23 lt 5} | false |
>(或gt) | 大于 | ${23>5}或${23 gt 5} | true |
<=(或le) | 小于等于 | ${23<=5}或${23 le 5} | false |
>=(或ge) | 大于等于 | ${23>=5}或${23 ge 5} | true |
逻辑运算符 | 说明 | 示例 | 结果 |
&&(或and) | 逻辑与 | 如果A为true,B为false,则${ A && B } (或${ A and B } ) | false |
||(或or) | 逻辑或 | 如果A为true,B为false,则${ A || B} (或 ${ A or B } ) | true |
! (或not) | 逻辑非 | 如果A为true,则${ ! A } ( 或${ not A } ) | false |
EL语法-执行表达式 empty空运算符
若为空或者 null, 返回true,
否则返回 false
用于确定一个对象或者变量是否为 null 或空
${empty name}
EL隐式对象
EL隐式对象是预先定义的,在表达式语言中可以直接使用的对象
取对象:param
复选框取对象:paramValues
三、JSTL概述
EL中条件判断一般不用,现在都用JSTL
解决绝大多数<% %>
定义:
JSTL是Web应用程序中用于编写各种通用核心功能的JSP标准标签库
种差(内涵):
1、在web应用程序中使用
2、用于编写各种通用核心功能
JSTL使用步骤:
1.导包,直接粘贴到项目如图的lib里
2.jsp页面粘贴如下固定指令
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
prefix里的c指所有标签都用c开头,如果里面写m则用m开头
如图位置:
3.写<c:就会出现各个标签提示
例如:(都写body里)
set标签:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- set向域里面添加数据保存数据 -->
<!-- scope=""里面写什么就往哪里填数据 -->
<!-- value=""指想填什么 -->
<!-- var=""指想填在什么名下 -->
<!-- 存数据 -->
<c:set scope="session" var="username" value="淳淳"></c:set>
<!-- 相当于
HttpSession session = request.getSession( );
session.setAttribute("usernamel","淳淳"); -->
<!-- 取数据 -->
${username}
</body>
</html>
out标签:
<!-- 打印数据 -->
<c:out value="淳淳"></c:out>
<!-- 相当于out.print("淳淳") -->
if标签(条件判断)没有else但是可以用另一种形式:
<!-- 如果判断存的是淳淳,就输出在努力 -->
<c:if test="${username=='淳淳'}">
<c:out value="在努力"></c:out>
</c:if>
<!-- 相当于else if -->
<c:choose>
<c:when test="${username=='张三'}">
<c:out value="在学习"></c:out>
</c:when>
<c:when test="${username=='李四'}">
<c:out value="在上课"></c:out>
</c:when>
<!-- 相当于else -->
<c:otherwise>
<c:out value="要加油"></c:out>
</c:otherwise>
</c:choose>
循环标签:
<c:set scope="session" var="cities" value="'北京','上海','杭州'"></c:set>
<!-- 循环 -->
<!-- items属性指你想遍历的集合是什么 -->
<!-- var属性指每一次遍历生成的是什么 -->
<c:forEach items="${cities}" var="city">
<c:out value="${city}"></c:out>
</c:forEach>
遍历集合:
<c:forEach items="${users }" var="user">
<c:out value="${user }"></c:out>
</c:forEach>
对应的Servlet
request.setAttribute("users",users);
//request.getRequestDispatcher("TestEL.jsp").forward(request, response);
request.getRequestDispatcher("TestJSTL.jsp").forward(request, response);
循环标签的起止和步长:
<c:forEach items="${cities }" var="city" begin="1" end="2" step="1">
<c:out value="${city }"></c:out>
</c:forEach>