获取各种数据

获取域工具的数据

上面在例子中,我们已经体验到了获取Session域工具的数据是多么地方便!
实在EL表达式可以让我们获取各个域范围的数据在1.jsp中设置ServeltContext属性(也便是application)

<% //向ServletContext设置一个属性 application.setAttribute(\"大众name\"大众, \"大众aaa\公众); System.out.println(\公众向application设置了一个属性\公众);%>在2.jsp中获取application的属性

<% ${name}%>和Session一样,也能获取得到!

jsp数据显示JSP第四篇EL表达式介绍回显数据自界说函数fn办法库等 Node.js

之前我们来讲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,输出空缺字符串\公众\"大众!
这个特点可以让我们数据回显

在1.jsp中仿照场景

<%--仿照数据回显场景--%><% 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