在使用servlet和jsp的过程中,两者之间的数据流转是十分常见的,jsp实际上也是一种servlet,也就是两个servlet之间的数据流转,我们根据不同的使用场景选择使用,请求转发(在request中写入键值对),session,ServletContext对象来实现。那么在JSP中如何使用这些数据?
一 传统方式的数据获取
传统方式直接在JSP页面中使用java脚本段语句,例如使用请求转发过来的数据:
对于普通的字符串
<p><%=request.getParameter("key")%></p><p><%=request.getAttribute("key")%></p>
对于对象而言
<p><%=((User)request.getAttribute("key")).getName()%></p>
对于字符串List集合而言
<p><%=((List)request.getAttribute("key")).get(0)%></p>
对于对象List集合而言
<p><%=((User)((List)request.getAttribute("key")).get(0)).getName()%></p>//or<p><%=((List<User>)request.getAttribute("key")).get(0).getName()%></p>
对于key和value都是字符串的Map集合而言
<p><%=((Map)request.getAttribute("key")).get("mapKey")%></p>
对于key为字符串value为对象的Map集合而言
<p><%=((User)((Map)request.getAttribute("key")).get("mapKey")).getName()%></p>
使用传统方式,可以看到缺点有以下这些:
需要导入包需要强转获取数据的代码过于麻烦
所以我们可以使用EL表达式来取代上面传统方式,目的在于简化JSP的数据获取,它也可以配合JSTL来使用,JSTL将在下面讲解。
使用EL表达式获取作用域中的数据有一个需要注意的地方:只能使用作用域中的数据,也就是只能取session,pageContext,request,application对象中的数据,他们是JSP九大内置对象中的四种,如果找到则显示,否则不显示,也没有其他动作。
二 使用EL表达式在JSP中获取数据
EL表达式语法:
${表达式}
对于request对象的特殊性:
我们知道,request对象,可能原本就包含一些数据,也就是用户提交的一些数据,对于这些数据我们需要用下面的语法来获取数据:
param.键名
对于同键不同值的情况,例如多选框:paramvalues.键名 返回数组
通过setAttribute方法存储到作用域对象中的数据
如果存储的是普通字符串则直接返回。
${键名}
但是如果是对象,则返回对象
普通对象
$(键名.属性名.属性名…)
集合对象
list集合 ->>>>${键名[角标]}map集合 ->>>>${键名.map集合存储的键名}
所以传统方式的查询可以改成:
对于普通的字符串
<p>${param.uname}</p><p>${str}</p>
对于对象而言
<p>${userName.name}</p>
对于字符串List集合而言
<p>${listName[0]}</p>
对于对象List集合而言
<p>${listName[0].name}</p>
对于key和value都是字符串的Map集合而言
<p>${mapName.mapKey}</p>
对于key为字符串value为对象的Map集合而言
<p>${mapName.mapKey.name}</p>
EL表达式在作用域对象中查找的优先级为(上高下低):
pageContextrequestsessionapplication
如果在高优先级中找到的话,下面的作用域就不再查找了。如果需要指定查找的作用域,则需要这样写:
${pageScope.hello}${requestScope.hello}${sessionScope.hello}${applicationScope.hello}
三 EL表达式的其他作用
EL表达式不单可以用来获取数据,也可以有其他用途
1 运算
逻辑运算
${a?man:woman}
这里到作用域中查看a所对应的值,如果为true则为man,否则为woman
算术运算
${1+"2"} //输出为3
+表示加法运算,不表示字符连接
EL的空值判断
request.setAttribute("s", "");request.setAttribute("s1", new User());request.setAttribute("s2", new ArrayList());request.setAttribute("s3", new HashMap());${empty s} //返回true${empty s1} //返回false,因为User对象中的数据有默认值${empty s2} //返回true${empty s3} //返回true
2 获取请求头数据
${header}//返回所有请求头数据${header["user-agent"]} //返回指定键名的请求头数据//同键不同值${headerVlues["accept-language"][0]}
3 获取Cookie数据
//我们假设cookie中有这么一项: cookie:uid=1${cookie} //返回所有cookie对象的map集合${cookie.uid} //返回指定的cookie对象${cookie.uid.name} //返回cookie对象存储数据的值 uid${cookie.uid.value} //返回cookie对象存储数据的值 1
四 JSTL标签库
我们常常会避免在JSP中的HTML代码域写过多的java逻辑代码,因为在JSP中写业务逻辑的时候比较复杂,不单单是看着复杂,而且写完后也不好修改。因此JSTL就诞生了,JSTL将提升在JSP页面逻辑代码的编码效率。它的作用就像是让我们在JSP中编写代码更加像在编写java代码一样。在学习后JSTL后,你应该不用在JSP的HTML代码域中掺和java代码了。
JSTL是EL表达式的扩展,是一种标签语言,不过它不是JSP的内置标签,所以需要我们自己导入JAR包,来识别这种标签。
关于JSTL标签的使用,下面的网站,给出了总结,其中核心标签使用的比较多,应该作为学习重点
/jsp/jsp-jstl.html