获取各种数据
获取域工具的数据
上面在例子中,我们已经体验到了获取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