获取各种数据
获取域工具的数据
上面在例子中,我们已经体验到了获取Session域工具的数据是多么地方便!实在EL表达式可以让我们获取各个域范围的数据在1.jsp中设置ServeltContext属性(也便是application)
<% //向ServletContext设置一个属性 application.setAttribute(\"大众name\"大众, \"大众aaa\"大众); System.out.println(\"大众向application设置了一个属性\"大众);%>在2.jsp中获取application的属性
<% ${name}%>和Session一样,也能获取得到!
之前我们来讲ServletContext工具的时候讲过一个方法findAttribute(String name),EL表达式语句在实行的时候会调用该方法,用标识符作为关键字分别从page、request、session、application四个域中查找相应的工具。这也阐明了为什么EL表达式可以仅仅通过标识符就能够获取到存进域工具的数据!
findAttribute()的查找顺序:从小到大,也便是page->request->session->application
获取JavaBean的属性
以前在JSP页面获取JavaBean的数据是这样子的:1.jsp页面Session存进一个Person工具,设置age的属性为22<jsp:useBean id=\公众person\公众 class=\公众domain.Person\"大众 scope=\"大众session\公众/><jsp:setProperty name=\"大众person\"大众 property=\"大众age\"大众 value=\公众22\"大众/>
在2.jsp中取出Session的属性
<% Person person = (Person) session.getAttribute(\"大众person\"大众); System.out.println(person.getAge());%>效果如下
现在我利用了EL表达式读取数据又会非常方便了//等同于person.getAge()${person.age}
上面的代码 等同于调用工具的getter方法,内部是通过反射机制完成的!获取凑集的数据
凑集操作在开拓中被广泛地采取,在EL表达式中也很好地支持了凑集的操作!可以非常方便地读取Collection和Map凑集的内容为了更好地看出EL表达式的强大之处,我们也来比拟一下利用EL表达式和不该用EL表达式的差异下面不该用EL表达式输出凑集的元素在1.jsp页面中设置session的属性,session属性的值是List凑集,List凑集装载的又是Person工具
<% List<Person> list = new ArrayList(); Person person1 = new Person(); person1.setUsername(\"大众zhongfucheng\"大众); Person person2 = new Person(); person2.setUsername(\公众ouzicheng\公众); list.add(person1); list.add(person2); session.setAttribute(\"大众list\公众,list);%>在2.jsp中获取到session的属性,并输出到页面上
<% List<Person> list = (List) session.getAttribute(\"大众list\"大众); out.write(list.get(0).getUsername()+\"大众<br>\"大众); out.write(list.get(1).getUsername());%>
利用EL表达式又是怎么样的效果呢?我们来看看!
<%--取出list凑集的第1个元素(下标从0开始),获取username属性--%>${list[0].username}<br><%--取出list凑集的第2个元素,获取username属性--%>${list[1].username}同样也可以有相同的效果:
我们再来利用一下Map凑集在1.jsp中session属性存储了Map凑集,Map凑集的关键字是字符串,值是Person工具<% Map<String, Person> map = new HashMap<>(); Person person1 = new Person(); person1.setUsername(\"大众zhongfucheng1\"大众); Person person2 = new Person(); person2.setUsername(\"大众ouzicheng1\"大众); map.put(\"大众aa\公众,person1); map.put(\"大众bb\"大众,person2); session.setAttribute(\公众map\公众,map);%>看起来彷佛取出数据的时候是会有点繁芜,但是有了EL表达式也是非常轻松的!
${map.aa.username}<br>${map.bb.username}效果:
如果Map凑集存储的关键字是一个数字,就不能利用\"大众.\公众号运算符了,如下所示对付这种情形,我们可以利用\"大众[]\"大众的形式读取Map凑集的数据${map[\"大众1\"大众].username}<br>${map[\"大众2\"大众].username}EL表达式合营JSTL标签可以很方便的迭代凑集,后面讲到JSTL标签的时候会用到!这里就不详细解释了。
EL运算符
EL表达式支持大略的运算符:加减乘除取摸,逻辑运算符。empty运算符(判断是否为null),三目运算符empty运算符可以判断工具是否为null,用作于流程掌握!
三目运算符简化了if和else语句,简化代码书写
<% List<Person> list = null;%>${list==null?\公众list凑集为空\公众:\公众list凑集不为空\"大众}效果:
EL表达式11个内置工具
EL表达式紧张是来对内容的显示,为了显示的方便,EL表达式供应了11个内置工具。
pageContext 对应于JSP页面中的pageContext工具(把稳:取的是pageContext工具)pageScope 代表page域中用于保存属性的Map工具requestScope 代表request域中用于保存属性的Map工具sessionScope 代表session域中用于保存属性的Map工具applicationScope 代表application域中用于保存属性的Map工具param 表示一个保存了所有要求参数的Map工具paramValues表示一个保存了所有要求参数的Map工具,它对付某个要求参数,返回的是一个string[]header 表示一个保存了所有http要求头字段的Map工具headerValues同上,返回string[]数组。cookie 表示一个保存了所有cookie的Map工具initParam 表示一个保存了所有web运用初始化参数的map工具下面测试各个内置工具<%--pageContext内置工具--%><% pageContext.setAttribute(\"大众pageContext1\"大众, \"大众pageContext\"大众);%>pageContext内置工具:${pageContext.getAttribute(\"大众pageContext1\公众)}<br><%--pageScope内置工具--%><% pageContext.setAttribute(\"大众pageScope1\公众,\"大众pageScope\"大众);%>pageScope内置工具:${pageScope.pageScope1}<br><%--requestScope内置工具--%><% request.setAttribute(\公众request1\"大众,\"大众reqeust\"大众);%>requestScope内置工具:${requestScope.request1}<br><%--sessionScope内置工具--%><% session.setAttribute(\公众session1\公众, \"大众session\公众);%>sessionScope内置工具:${sessionScope.session1}<br><%--applicationScope内置工具--%><% application.setAttribute(\公众application1\"大众,\"大众application\"大众);%>applicationScopt内置工具:${applicationScope.application1}<br><%--header内置工具--%>header内置工具:${header.Host}<br><%--headerValues内置工具,取出第一个Cookie--%>headerValues内置工具:${headerValues.Cookie[0]}<br><%--Cookie内置工具--%><% Cookie cookie = new Cookie(\"大众Cookie1\"大众, \公众cookie\"大众);%>Cookie内置工具:${cookie.JSESSIONID.value}<br><%--initParam内置工具,须要为该Context配置参数才能看出效果【jsp配置的无效!
亲测】--%>initParam内置工具:${initParam.name}<br>效果图:
把稳事变:
测试headerValues时,如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]测试cookie时,例`${cookie.key}`取的是cookie工具,如访问cookie的名称和值,须`${cookie.key.name}`或`${cookie.key.value}`测试initParam时,初始化参数要的web.xml中的配置Context的,仅仅是jsp的参数是获取不到的上面已经测过了9个内置工具了,至于param和parmaValues内置工具一样平常都是别的页面带数据过来的(表单、地址栏)!表单页面
<form action=\公众/zhongfucheng/1.jsp\"大众 method=\"大众post\"大众>用户名:<input type=\"大众text\"大众 name=\"大众username\公众><br>年事:<input type=\"大众text \"大众 name=\公众age\"大众><br>爱好:<input type=\"大众checkbox\"大众 name=\"大众hobbies\"大众 value=\公众football\"大众>足球<input type=\公众checkbox\"大众 name=\"大众hobbies\"大众 value=\"大众basketball\"大众>篮球<input type=\"大众checkbox\公众 name=\公众hobbies\"大众 value=\公众table tennis\"大众>兵乓球<br><input type=\公众submit\公众 value=\"大众提交\"大众><br></form>处理表单页面:
${param.username}<br>${param.age}<br>//没有学习jstl之前就一个一个写吧。${paramValues.hobbies[0]}<br>${paramValues.hobbies[1]}<br>${paramValues.hobbies[2]}<br>效果:
当然了,利用地址栏办法提交数据给处理页面也是用param内置工具去获取数据的!EL表达式回显数据
EL表达式最大的特点便是:如果获取到的数据为null,输出空缺字符串\"大众\"大众!
这个特点可以让我们数据回显
<%--仿照数据回显场景--%><% User user = new User(); user.setGender(\"大众male\"大众); //数据回显 request.setAttribute(\公众user\公众,user);%><input type=\"大众radio\公众 name=\公众gender\"大众 value=\公众male\"大众 ${user.gender=='male'?'checked':'' }>男<input type=\公众radio\公众 name=\"大众gender\"大众 value=\公众female\公众 ${user.gender=='female'?'checked':'' }>女效果:
EL自定义函数EL自定义函数用于扩展EL表达式的功能,可以让EL表达式完成普通Java程序代码所能完成的功能
开拓HTML转义的EL函数我们有时候想在JSP页面中输出JSP代码,但是JSP引擎会自动把HTML代码解析,输出给浏览器。此时我们就要对HTML代码转义。步骤:
编写一个包含静态方法的类(EL表达式只能调用静态方法),该方法很常用,Tomcat都有此方法,可在\webapps\examples\WEB-INF\classes\util中找到public static String filter(String message) { if (message == null) return (null); char content[] = new char[message.length()]; message.getChars(0, message.length(), content, 0); StringBuilder result = new StringBuilder(content.length + 50); for (int i = 0; i < content.length; i++) { switch (content[i]) { case '<': result.append(\"大众<\"大众); break; case '>': result.append(\公众>\"大众); break; case '&': result.append(\"大众&\"大众); break; case '\"大众': result.append(\"大众\"大众\公众); break; default: result.append(content[i]); } } return (result.toString());}在WEB/INF下创建tld(taglib description)文件,在tld文件中描述自定义函数
<?xml version=\公众1.0\"大众 encoding=\"大众ISO-8859-1\公众?><taglib xmlns=\"大众http://java.sun.com/xml/ns/javaee\"大众 xmlns:xsi=\"大众http://www.w3.org/2001/XMLSchema-instance\"大众 xsi:schemaLocation=\"大众http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd\公众 version=\"大众2.1\公众> <tlib-version>1.0</tlib-version> <short-name>myshortname</short-name> <uri>/zhongfucheng</uri> <!--函数的描述--> <function> <!--函数的名字--> <name>filter</name> <!--函数位置--> <function-class>utils.HTMLFilter</function-class> <!--函数的方法声明--> <function-signature>java.lang.String filter(java.lang.String)</function-signature> </function></taglib>在JSP页面中导入和利用自定义函数,EL自定义的函数一样平常前缀为\公众fn\"大众,uri是\公众/WEB-INF/tld文件名称\公众
<%@ page language=\公众java\"大众 contentType=\"大众text/html\公众 pageEncoding=\"大众UTF-8\"大众 %><%@taglib prefix=\"大众fn\"大众 uri=\"大众/WEB-INF/zhongfucheng.tld\"大众 %><html><head> <title></title></head><body>//完成了HTML转义的功能${fn:filter(\公众<a href='#'>点我</a>\公众)}</body></html>效果:
EL函数库(fn方法库)由于在JSP页面中显示数据时,常常须要对显示的字符串进行处理,SUN公司针对付一些常见处理定义了一套EL函数库供开拓者利用。实在EL函数库便是fn方法库,是JSTL标签库中的一个库,也有人称之为fn标签库,但是该库长得不像是标签,以是称之为fn方法库既然作为JSTL标签库中的一个库,要利用fn方法库就须要导入JSTL标签!要想利用JSTL标签库就要导入jstl.jar和standard.jar包!
以是,要对fn方法库做测试,首先导入开拓包(jstl.jar、standard.jar)在JSP页面中指明利用标签库
<%@taglib prefix=\"大众fn\"大众 uri=\公众http://java.sun.com/jsp/jstl/functions\"大众 %>
fn方法库全都是跟字符串有关的(可以把它想成是String的方法)fn:toLowerCasefn:toUpperCasefn:trimfn:lengthfn:splitfn:join 【吸收字符数组,拼接字符串】fn:indexOffn:containsfn:startsWithfn:replacefn:substringfn:substringAfterfn:endsWithfn:escapeXml【忽略XML标记字符】fn:substringBefore测试代码:contains:${fn:contains(\公众zhongfucheng\"大众,zhong )}<br>containsIgnoreCase:${fn:containsIgnoreCase(\"大众zhongfucheng\公众,ZHONG )}<br>endsWith:${fn:endsWith(\公众zhongfucheng\"大众,\"大众eng\"大众 )}<br>escapeXml:${fn:escapeXml(\"大众<zhongfucheng>你是谁呀</zhongfucheng>\公众)}<br>indexOf:${fn:indexOf(\"大众zhongfucheng\"大众,\公众g\"大众 )}<br>length:${fn:length(\"大众zhongfucheng\"大众)}<br>replace:${fn:replace(\公众zhongfucheng\公众,\"大众zhong\"大众 ,\"大众ou\"大众 )}<br>split:${fn:split(\"大众zhong,fu,cheng\公众,\"大众,\公众 )}<br>startsWith:${fn:startsWith(\"大众zhongfucheng\公众,\"大众zho\"大众 )}<br>substring:${fn:substring(\公众zhongfucheng\公众,\公众2\公众 , fn:length(\"大众zhongfucheng\"大众))}<br>substringAfter:${fn:substringAfter(\公众zhongfucheng\"大众,\"大众zhong\"大众 )}<br>substringBefore:${fn:substringBefore(\公众zhongfucheng\"大众,\"大众fu\公众 )}<br>toLowerCase:${fn:toLowerCase(\"大众zhonGFUcheng\"大众)}<br>toUpperCase:${fn:toUpperCase(\公众zhongFUcheng\"大众)}<br>trim:${fn:trim(\公众 zhong fucheng \"大众)}<br><%--将分割成的字符数组用\"大众.\"大众拼接成一个字符串--%>join:${fn:join(fn:split(\公众zhong,fu,cheng\"大众,\"大众,\公众 ),\公众.\"大众 )}<br>效果:
利用fn方法库数据回显<% User user = new User(); String likes[] = {\"大众sing\公众}; user.setLikes(likes); //数据回显 request.setAttribute(\"大众user\"大众,user);%><%--java的字符数组以\公众,\公众号分割开,首先拼接成一个字符串,再判读该字符串有没有包含关键字,如果有就checked--%><input type=\"大众checkbox\公众${ fn:contains(fn:join(user.likes,\"大众,\"大众),\公众sing\"大众)?'checked':'' }>唱歌<input type=\"大众checkbox\"大众${ fn:contains(fn:join(user.likes,\公众,\公众),\公众dance\"大众)?'checked':'' }>舞蹈效果:
原文链接:https://dwz.cn/bOdF7S6R
作者:Java3y