使用el表达式获取request中map值的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用el表达式获取request中map值的问题相关的知识,希望对你有一定的参考价值。
请教大家一个js取值的问题:
在action中有一个map集合:
Map<String,String> pColMap = new HashMap<String,String>();
在map中存入值后再放到request中:
httpServletRequest.setAttribute("endtimeMap",pColMap);
在js中这样获取:
alert("$endtimeMap['"+ff+"']"); //ff是一个参数值,ff的值是8时,map应该有值
得不到值,本来当ff为8的时候应该是有值的。
直接使用字符串8能够获取到
如:alert("$endtimeMap['8']")这样是有值的,
但是我需要用参数的方式获取值,即:alert("$endtimeMap['"+ff+"']"); 这种方式,求赐教!
el表达式实际上是java代码, 即jsp里的java代码, 是servlet执行的
也就是说, 后台看到el表达式的时候就执行了, 然后用执行的结果代替这个el表达式, 然后再返回给前台
你写alert("$endtimeMap['8']");
后台看到的是就是$endtimeMap['8']这个东西, 然后计算从map里得到对应的值, 代替则个东西, 所以你到前台看到的实际上是map里的值了
如果你写alert("$endtimeMap['"+ff+"']");, 后台看到的是$endtimeMap['"+ff+"'], 你觉得后台能把这个解析成什么, 后台会认为你是取map里key值为"\"+ff+\""的value(你要是不信, 你给你的map里添一组这个key-value)
归根结底还是执行顺序的问题, el表达式是servlet是后台执行的, js是得到response后在前台执行的, el优先于js, 你的想法是js先把值穿进去, 然后el表达式再得值, 所以必须不正确了
这样说你应该明白了吧...追问
你太棒了!瞬间让我醍醐灌顶啊! 以解决问题为原则,zgh26782000这位师傅虽然煞费苦心,但是我仍然没能明白,所以分数就给了你了,但是我以同样的心态非常非常感激 zgh26782000。
参考技术A el表达式实际上是java代码, 即jsp里的java代码, 是servlet执行的也就是说, 后台看到el表达式的时候就执行了, 然后用执行的结果代替这个el表达式, 然后再返回给前台
你写alert("$endtimeMap['8']");
后台看到的是就是$endtimeMap['8']这个东西, 然后计算从map里得到对应的值, 代替则个东西, 所以你到前台看到的实际上是map里的值了
如果你写alert("$endtimeMap['"+ff+"']");, 后台看到的是$endtimeMap['"+ff+"'], 你觉得后台能把这个解析成什么, 后台会认为你是取map里key值为"\"+ff+\""的value(你要是不信, 你给你的map里添一组这个key-value)
归根结底还是执行顺序的问题, el表达式是servlet是后台执行的, js是得到response后在前台执行的, el优先于js, 你的想法是js先把值穿进去, 然后el表达式再得值, 所以必须不正确了
这样说你应该明白了吧... 参考技术B 你要用js随时取值,首先你的map数据要转成json,然后输出到页面上赋值个一个js的变量,使用时去这个json对象中取值
其次 你需要明白一点,当页面显示到浏览器上的时候,后端的代码已经执行完了,是永远无法从这次请求中拿到服务器端的内容了,除非你把服务器输出的内容都输出到浏览器上追问
那么,我可以将从后台传过来的一个map集合直接转化成一个json类型?
比如将:var ppp = "$endtimeMap" //endtimeMap是从action中传过来的一个HashMap对象
转化成 var json = ("("+ppp+“)")
然后对json来进行取值操作?
var ppp = "$endtimeMap"
话说你那样写不是json对象吧,你需要转换过去
然后 你也不用 var json = ("("+ppp+“)") 这样写,只接 var json = 转后的json字符串,就行了
取值基本上和map取值一样
不好意思,我大意了书写错误了,我本意是这样写:var json = eval('('+ppp+')');这样来转化成json格式的就可以了吗?
我这样写是报错的,可以的话,希望你可以给出具体转换和取值的代码示例,感激不尽!
java中转换成json对象的话大多数是使用现有的jar包,当然如果你的map对象不是太复杂的话可以自己生成一个json的字符串,只要按照json对象的格式就行了
还有一点,你直接输出到页面上的时候不需要用eval转换,只接输出就好了,只要你的json字符串外边不套个引号,js能只接实现
其实json就是javascript的对象和数组组成的结构,这个你可以看百度百科的json,那有详细的结构写法
其实,说到这一步,我觉得我们没有抓住问题的重点,回到最初的问题上,现在我用alert("$endtimeMap")可以输出整个map集合,是以键值对的形式存在的,并且key和value都没有引号;我用alert("$endtimeMap['8']")可以输出map里面对应的value值,这就说明这里可以通过key正常取值,但是alert("$endtimeMap['"+ff+"']");却取不到值,而我在这句话之前单独输出参数ff,alert(ff);是有值的,等于8,为什么一起写就取不到了呢?
追答话说你不是写el的取值了吗,为什么不能把8换成变量呢,你的需求不清
追问因为我对enditimeMap的取值是动态的,即key是动态的,所以我只能拼接参数(ff)取值,但是这样取不到,如果用静态值'8'就能取到值,但是当我传过来的ff的值等于8的时候,还是取不到值。您明白了吗?
追答http://blog.163.com/c_123xyz/blog/static/770924762010823111928426/你是要el遍历map吧,这个很简单,你需要用到循环,百度一下el遍历map有很多
比如
<c:forEach var="item" items="$map2">
$item.key > $item.value <br>
</c:forEach>
追问非常非常感激您的耐心解答,虽然可能我没有向您表达清楚我的需求导致问题没有解决,但是您的解答仍然对我很有启发,分数不能代表一切!非常感谢。
参考技术C 你该回想一下服务器和客户端的交互流程,首先客户端发送请求》》服务器端回应》》将生成的html代码返回给客户端,这一步生成代码时$endtimeMap['"+ff+"']的参数ff怎么从js中获得?只能在请求时就发过去呗。追问但是我在$endtimeMap['"+ff+"']之前单独alert(ff)是有值的,等于8,这样不就说明ff是有值的吗
参考技术D 那个ff是什么时候赋值的。 必需是jsp/action初始化时,就有值,否则不会得到追问ff是js function在页面得到的一个参数值,调用之前输出了,是有值的。这样的话,应该是可以取出值的吧?
[Java Web] EL
一、概述
使用EL表达式可简化JSP中对象的引用,使代码更加规范,可读性与可维护性更好。
属性范围 | EL实例 | 说明 |
Page | ${pageScope.name} | 获取Page范围的名为name的属性 |
Request | ${requestScope.name} | 获取Request范围的名为name的属性 |
Session | ${sessionScope.name} | 获取Session范围的名为name的属性 |
Application | ${applicationScope.name} | 获取Application范围的名为name的属性 |
无指定范围 | ${name} | 获取以上所有范围的名为name的属性 |
二、运算符
<%@ page import="bean.Student" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page isELIgnored="false" %> <html> <body> <!-- 空判断运算 --> <% session.setAttribute("java", 0); request.setAttribute("javascript", 1); %> ${empty sessionScope.java}<br/> ${empty javascript}<br/> ${empty null}<br/> <!-- 访问数据 --> <jsp:useBean class="bean.Student" id="stu" scope="session"/> <jsp:setProperty name="stu" property="id" value="30"/> <jsp:setProperty name="stu" property="name" value="Yao"/> <% int[] array = {0, 1, 2, 3}; session.setAttribute("array", array); %> ${stu.id}<br/> ${stu["name"]}<br/> ${array[1]}<br/> <!-- 算术运算符 --> <% session.setAttribute("x", 0); session.setAttribute("y", 1); %> ${x+y}<br/> ${x-y}<br/> ${x*y}<br/> ${x/y}<br/> ${x div y}<br/> ${x%y}<br/> ${x mod y}<br/> <!-- 关系运算符 --> ${x==y}<br/> ${x eq y}<br/> ${x!=y}<br/> ${x ne y}<br/> ${x > y}<br/> ${x gt y}<br/> ${x >= y}<br/> ${x ge y}<br/> ${x < y}<br/> ${x lt y}<br/> ${x <= y}<br/> ${x le y}<br/> <!-- 逻辑运算符 --> <% session.setAttribute("x", true); session.setAttribute("y", false); %> ${x && y}<br/> ${x and y}<br/> ${x || y}<br/> ${x or y}<br/> ${!x}<br/> ${not y}<br/> <!-- 条件运算符 --> ${x?x:y}<br/> </body> </html>
三、隐含对象
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page isELIgnored="false" %> <html> <body> <!-- 使用pageContext获取内置对象及其属性 --> 请求:${pageContext.request}<br/> 协议:${pageContext.request.protocol}<br/> <!-- 使用param获取单个参数 --> <!-- 使用paramValues获取多个参数 --> <form action="index.jsp" method="post"> <input type="text" name="user" placeholder=""/><br/> <input type="checkbox" name="like" value="篮球" placeholder=""/>篮球 <input type="checkbox" name="like" value="足球" placeholder=""/>足球 <input type="checkbox" name="like" value="网球" placeholder=""/>网球 <input type="checkbox" name="like" value="棒球" placeholder=""/>棒球 <br/> <input type="submit" value="提交"><br/> </form> 用户:${param.user}<br/> 爱好:<!-- 参数不存在时返回空字符串 --> ${paramValues.like[0]} ${paramValues.like[1]} ${paramValues.like[2]} ${paramValues.like[3]} <br/> <!-- 使用header获取单个头值 --> <!-- 使用headerValues获取多个头值 --> 连接:${header.connection}<br/> 主机:${header["host"]}<br/> 代理:${header["user-agent"]}<br/> <!-- 使用cookie对象获取cookie --> <% Cookie testCookie = new Cookie("testCookie", "cookieContent"); response.addCookie(testCookie); %> Cookie:${cookie.testCookie.value}<br/> <!-- 使用initParam获取初始化参数 --> <!-- <context-param> <param-name>project</param-name> <param-value>java web</param-value> </context-param> <context-param> <param-name>language</param-name> <param-value>java</param-value> </context-param> --> 项目:${initParam.project}<br/> 语言:${initParam.language}<br/> </body> </html>
四、禁用
<!-- index.jsp --> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <!-- 禁用方法1 --> <%@ page isELIgnored="true" %> <html> <body> <!-- 禁用方法2 --> <!-- 显示反斜杠后的全部内容而非EL表达式的结果 --> ${pageContext.session.id} </body> </html> <!-- web.xml --> <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 禁用方法3 --> <jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <el-ignored>true</el-ignored> </jsp-property-group> </jsp-config> </web-app>
以上是关于使用el表达式获取request中map值的问题的主要内容,如果未能解决你的问题,请参考以下文章
JSP ELEL表达式 获取list长度/不用循环,EL在List中直接获取第一项的内容/EL获取Map的键,Map的值