两个Servlet之间的数据流转:靠的是作用域
作用域是数据流转的载体
- 用request举例
传统方式:在jsp界面中使用java脚本段
servlet的流程:
- 设置请求编码格式
req.setCharacterEncoding("utf-8");
- 设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
- 获取请求信息
String msg = req.getParameter("msg")
- 处理请求信息
System.out.println("根据"+msg+"与数据库进行数据交互...");
- 响应处理结果
进 行 数 据 流 转 进行数据流转 进行数据流转
请 求 转 发 请求转发 请求转发//普通字符串的流转 req.setAttribute("msg1","msg1普通字符串的流转"); //对象类型 User user = new User(1, "闪电", "打电动"); req.setAttribute("user",user); //集合类型 /*--------------------List集合----------------------------------------*/ //List集合 //存储普通字符串 List<String> list1 = new ArrayList<String>(); list.add("沙妖str"); list.add("雪妖str"); list.add("火人str"); req.setAttribute("listStr", list1); //存储对象 List<User> list2 = new ArrayList<User>(); User user2 = new User(2, "美队", "打电动", new Address("美国")); User user3 = new User(3, "钢铁侠", "打电动", new Address("美国")); list.add(user2); list.add(user3); req.setAttriute("listObj", list2); /*---------------------Map集合----------------------------------------*/ //Map集合 //存储普通字符串 Map<String, String> map1 = new HashMap<String, String>(); map.put("k1", "北京str"); map.put("k2", "上海str"); map.put("k3", "广州str"); req.setAttribute("mapStr", map1); //存储对象 Map<String, User> map2 = new HashMap<String, User>(); map2.put("ok1", new User(3, "成龙", "打电动")); map2.put("ok2", new User(4, "小玉", "打电动")); map2.put("ok3", new User(5, "特鲁", "吃")); map2.put("ok4", new User(6, "老爹", "古老魔法")); req.setAttribute("mapObj", map2);
重 定 向 重定向 重定向req.geRequestDispatcher("msg.jsp").forward(req,resp); return;
req.sendRedirect("main.jsp");
get请求中传数据:
localhost:8080/Myservlet/MySource?fm1=你好&fm2=JSP世界
jsp中获取数据:
<b><%=request.getAttribute("msg1")%></b><br/> //界面输出:msg1普通字符串的流转
<%=((User)request.getAttribute("user")).getName()%><br/> //界面输出:闪电
<%!-- ********************************List集合********************** --%>
<%=((ArrayList)req.getAttribute("listStr")).get(1)%><br/> //界面输出:雪妖str
<%=((User)((ArrayList)req.getAttribute("listObj")),get(1)).getName()%><br/> //界面输出:钢铁侠
<%=(ArrayList<User>)req.getAttribute("listObj").get(0).getName()%><br/> //界面输出:美队
<%!-- *******************************Map集合************************* --%>
<%=((HashMap)req.getAttribute("mapStr")).get("k1")%> //界面输出:北京str
<%=((User)((HashMap)req.getAttribute("mapObj")).get("ok4")).getSkill()%> //界面输出:古老魔法
传统作用域数据:
缺点:
1. 需要导包
2. 需要强转
3. 获取数据麻烦
所以使用EL表达式
EL表达式
1、全称:Expression Language,一种写法非常简介的表达式。
2、作用:让 jsp 书写起来更加的方便。不需要导包、不需要强转、方便
3、语法结构:${表达式}
,提供{}
和[]
两种运算符来存取数据。
- 获取请求数据:
request对象存储了请求数据 => param.键名 直接返回值
request对象存储了请求数据 => paramValues.键名 返回的是数组 - 通过setAttribute方法存储到作用域对象中的数据
${键名} 返回所对应的值
注意:如果是普通字符串,则直接返回
如果是对象,则返回的是对象
使用:
a) 获取请求数据
i. 获取用户请求数据
ii. 获取请求头数据
${header}
iii. 获取 Cookie 数据
${cookie}
b) 获取作用域数据
i. 获取作用域数据
ii. 作用域查找顺序
=> 从小到大查找,找到就不再获取;
pageContext:当前界面
request:一次请求
session:一次会话
application:项目内,服务器启动时创建,服务器关闭 是消亡
iii. 获取指定作用域中的数据
${pageScope.msg1}
${requestScope.msg1}
${sessionScope.msg1}
${applicationScope.msg1}
c) 运算操作
i. 算术运算
${1+2}—— ${2*2} —— ${4/2} —— ${4%3}
${1+“2”} => 输出:3
ii. 关系运算
${4== 4} —— ${4>2}
${sex==1 ? ‘男’ : ‘女’ }
iii. 逻辑运算
&& 、|| 、!
d) 空值判断 empty
${empty obj} //输出true、false
EL 中获取数据 :
${param.fm1} //获取get请求中的数据;界面输出:你好
<b>${msg1}</b><br/> //界面输出:msg1普通字符串的流转
<%=((User)request.getParameter("user")).getName()%><br/>
${user.name}<br/> //界面输出:闪电
<%!-- ********************************List集合************ --%>
<%=((ArrayList)req.getAttribute("listStr")).get(1)%><br/>
${listStr[1]}<br/> //界面输出:雪妖str
<%=((User)((ArrayList)req.getAttribute("listObj")),get(1)).getName()%><br/>
${listObj[1].name}<br/> //界面输出:钢铁侠
<%=(ArrayList<User>)req.getAttribute("listObj").get(0).getName()%><br/>
${listObj.name}<br/> //界面输出:美队
<%!-- *******************************Map集合*************** --%>
<%=((HashMap)req.getAttribute("mapStr")).get("k1")%>
${mapStr.k1} //界面输出:北京str
<%=((User)((HashMap)req.getAttribute("mapObj")).get("ok4")).getSkill()%>
${mapObj.k1.skill} //界面输出:古老魔法
JSTL 标签库
1、 什么是 JSTL 标签库
JSTL 是 apache 对 EL 表达式的扩展(也就是说 JSTL 依赖 EL)
JSTL 是标签语言!JSTL 标签使用以来非常方便,它与 JSP 动作标签一样,只不过它不是 JSP 内置的标签,需要我们自己导包,以及指定标签库而已!
如果你使用 MyEclipse 开发 JavaWeb,那么在把项目发布到 Tomcat 时,你会发现,MyEclipse 会在 lib 目录下存放 jstl 的Jar 包!如果你没有使用 MyEclipse 开发那么需要自己来导入这个JSTL 的 Jar 包:jstl-1.2.jar。
2、 JSTL 标签库的作用
用来提升在 JSP 页面的逻辑代码的编码效率, 使用标签来替换逻辑代码的直接书写,高效,美观,整洁,易读。
3、 使用 JSTL 标签库
a) 内容:
i. 核心标签库(学习)
ii. 格式化标签库(了解)
iii. 函数标签库(了解)
iv. XML 标签库(了解)
v. SQL 标签库(了解)
b) 使用:
i. 导包
ii. 使用 taglib 标签引入资源 ( 核心标签库 )
<%taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
iii. 核心标签库
<%request.setAttribute("str", "I'm OK!");%>
//1. 基本标签<c:out ></c:out> => 输出
<c:out value="哈哈"></c:out><br/> //界面输出:哈哈
<c:out value="${str}" default="hiahia"></c:out><br/> //界面输出:I'm OK!
${str}
//2. 基本标签<c:set ></c:set> => 设置域中的数据
<c:set var="msg" value="msg:I’m pageContext" scope="page"><c:set> //向当前作用域中设置值
<c:set var="msg" value="msg:I’m request" scope="request"><c:set>
<c:set var="msg" value="msg:I’m session" scope="session"><c:set>
<c:set var="msg" value="msg:I’m application" scope="application"><c:set>
<c:out value="${msg}"></c:out><br/> //界面输出:I’m pageContext
<c:out value="${requestScope.msg}"></c:out><br/> //界面输出:I’m requestContext
<c:out value="${sessionScope.msg}"></c:out><br/> //界面输出:I’m sessionContext
<c:out value="${applicationScope.msg}"></c:out><br/> //界面输出:I’m applicationContext
//3. 基本标签<c:remove />
<c:remove var="msg" scope="request" /> //在不指定作用域的情况下,4个作用域全删
<c:out value="${msg}"><c:out><br/>
//4. 逻辑标签<c:if test="${表达式}"> 前端代码 <c:if>
<c:set var="a" value="4"></c:set>
<c:if test="${a>2}">
<h4>今天天气有点凉 ·…· </h4><br/>
</c:if>
//5. 逻辑标签<c:choose ><c:when test=""></c:when>...<c:otherwhise></c:otherwhise></c:choose>
<c:set var="score" value="90"></c:set>
<c:choose >
<c:when test="${score>=95}">A+</c:when>
<c:when test="${score>=90}">A</c:when>
...
<c:otherwhise>
<c:set var="msg" value="不及格"></c:set>
<c:out value="${msg}"></c:out>
</c:otherwhise>
</c:choose>
//6.循环标签<c:forEach begin="1" end="4" step="2"></c:forEach>
<c:set var="info"
value="jc:记录循环脚标、次数、是否为第一次、是否为最后一次;存在作用域中">
</c:set>
<c:out value="${info}"></c:out>
<!--常量循环 -->
<c:forEach begin="0" end="4" step="2" varStatue="jc">
循环体<br/>
${jc.index}---${jc.count}---${jc.first}---${jc.last}
</c:forEach>
<!--动态循环 -->
<c:forEach items="${list}" var="user">
循环体<br/>
var:声明每次循环变量的值
${user.name}
</c:forEach>
iv. 格式化标签库