Servlet和jsp数据流转获取方式
- 问题:
在servlet进行请求处理后,使用作用域对象作为数据流转的载体。将数据流转给对应的jsp文件。那么怎么在jsp中获取做哟用于中的数据呢? - 使用:
一、传统方式:使用request作用域进行数据流转,在jsp页面中使用java脚本段语句。
(1)普通字符串
request.setAttribute("str", "今天天气很好");
<%=request.getAttribute("str") %>
(2)对象类型
User u = new User(1, "柳岩", "拍电影", new Address("河南","商丘","虞城县"));
req.setAttribute("user", u);
需要导User包<page>指令中
<%=((User)request.getAttribute("user")).getAddr().getTown() %>
(3)集合类型
//list集合
//存储普通字符串
List<String> list = new ArrayList<String>();
list.add("渣渣辉");
list.add("关晓彤");
list.add("刘诗诗");
req.setAttribute("list", list);
//存储对象
User u2 = new User(2, "古力娜扎", "拍电影", new Address("新疆","乌鲁木齐", "乌鲁木齐"));
List<User> list2 = new ArrayList<User>();
list2.add(u2);
req.setAttribute("list2", list2);
//map集合
//存储普通字符
Map<String, String> map = new HashMap<String, String>();
map.put("a","北京");
map.put("b","上海");
map.put("c","广州");
req.setAttribute("map", map);
//存储对象
Map<String, User> map2 = new HashMap<String, User>();
map2.put("a1", new User(2, "迪丽热巴", "拍电影", new Address("新疆","乌鲁木齐", "乌鲁木齐")));
req.setAttribute("map2", map2);
list集合:
<%=((ArrayList)request.getAttribute("list")).get(2) %>
<%=((User)((ArrayList)request.getAttribute("list2")).get(0)).getAddr().getPre() %>
map集合:
<%=((HashMap)request.getAttribute("map")).get("b") %>
<%=((User)((HashMap)request.getAttribute("map2")).get("a1")).getUname() %>
(4)获取URL中的请求数据
http://localhost:8080/EL/ELService?uname=12&pwd=123
<%=request.getParameter("uname") %>
- 传统方式获取作用域数据:
缺点一:导入包。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="com.test.pojo.*, java.util.*"%>
缺点二:需要强制转换类型。
缺点三:获取数据的代码过于麻烦。
二、使用EL表达式方式获取作用域数据
(1) 获取请求数据
http://localhost:8080/EL/ELService?uname=12&pwd=123&fav=1&fav=2
${param.uname}
${paramValues.fav[0] }
(2) 获取普通字符串
${str }
(3) 获取对象类型
${user.addr.town }
(4) 获取集合类型
${list[2] }
${list2[0].addr.pre }
${map.b }
${map2.a1.uname }
EL表达式学习
-
什么是EL表达式?
全称:Expression Language,一种写法非常简洁的表达式。语法简单易懂,便于使用。表达式语句的灵感来自于ECMAScript和XPath表达式语言。 -
EL表达式的作用:
作用:让jsp书写起来更加的方便。简化在jsp中获取作用或者请求数据的写法。也会搭配JSTL来进行使用。 -
使用EL表达式:
语法结构${expression},提供 .(点) 和 [ ] 两种运算符来存取数据; -
使用:
a):使用EL表达式获取请求数据
获取用户请求数据
获取请求头数据
获取cookie数据
b)使用EL表达式获取作用域数据
获取作用域数据
作用域查找顺序
获取指定作用域中的数据
c)使用EL表达式进行运算
算术运算
关系运算
逻辑运算
d)EL表达式空值判断empty -
作用:获取作用域对象中的数据
注意:
获取的是pageContext、request、session、application四个对象中的数据,其他数据
一概不理会。找到了则获取返回,找不到则什么都不做,也不报错。
- 语法
${表达式} - 请求数据
Request对象存储了请求数据→param.键名,直接返回值
Request对象存储了请求数据→paramValues.键名[0],返回的是数组
- 通过setAttribute方法存储到作用域对象中的数据
${键名} 返回键名所对应的值
注意:
如果存储的是普通字符串则直接返回
如果存储的是对象,则返回的是对象
获取对象中的数据:
普通对象:${键名.属性名.属性名….}
集合对象:
List集合:
${键名[0]}
Map集合:
${键名.map集合存储的键名}
EL的作用域查找顺序
- 作用域查找顺序:
默认:
PageContext→request→session→applicatoin
注意:
每次查找都是从小作用域到大作用域进行查找,找到了则获取,不再继续找了。
自定义:
<h1>EL的作用域查找顺序</h1>
<%
pageContext.setAttribute("hello", "hello pageContext");
request.setAttribute("hello", "hello request");
session.setAttribute("hello", "hello session");
application.setAttribute("hello", "hello application");
%>
<b>${hello }</b><br>
<b>${pageScope.hello }</b><br>
<b>${requestScope.hello }</b><br>
<b>${sessionScope.hello }</b><br>
<b>${applicationScope.hello }</b><br>
EL表达式的逻辑运算
-
${逻辑表达式}:&&,||,!
-
${算术表达式}:+,-
-
${关系表达式}:>,<,三目运算
http://localhost:8080/EL/ELService? a=6&b=1
<h1>EL表达式的逻辑运算</h1>
${param.a+param.b }
${1+2 }--${1*2 }--${4/2 }--${4-2 }--${4%3 }
${3==3 }--${4>2 }--${sex==1?'男':'女' }--${1+'2' }
以此类推
注意: + 表示加法运算,不表示字符连接;
+ 不能做字符串连接,否则会报错;
EL表达式-空值判断、获取请求头、cookie数据
一、空值判断
- 表达式:
${empty 键名} - 作用:
判断键名对象的值是否存有数据 - 例子
//空值判断
req.setAttribute("s", "");
req.setAttribute("s1", new User());
req.setAttribute("s2", new ArrayList());
req.setAttribute("s3", new HashMap());
<h1>EL表达式的控制判断</h1>
${empty s }<br>
<!-- User对象有默认值,所以为false -->
${empty s1 }<br>
${empty s2 }<br>
${empty s3 }<br>
二、EL获取请求头数据(相当于获取Map)
- ${header}
返回所有的请求头数据 - ${header[“键名”]}
返回指定的键名的请求头数据 - ${headerValues[“键名”]}
返回指定的键名(同键不同值)的请求头数据数组
三、EL获取cookie数据(相当于获取Map)
-
${cookie }
返回存储了所有的cookie对象的map集合 -
${cookie.键名 }
返回指定的cookie对象 -
${cookie.键名.cookie存储数据的键名 }
返回指定的cookie对象存储的数据的键名 -
${cookie.JSESSIONID }
-
${cookie .JSESSIONID.name } 返回键名
-
${cookie.JSESSIONID.value } 返回值
注意:获取请求头数据使用频率高,获取cookie数据使用频率低