使用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表达式是在什么时候执行的
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>
View Code

 

三、隐含对象

技术分享图片
<%@ 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]} &nbsp;
${paramValues.like[1]} &nbsp;
${paramValues.like[2]} &nbsp;
${paramValues.like[3]} &nbsp;
<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>
View Code

 

四、禁用

技术分享图片
<!-- 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>
View Code

 

以上是关于使用el表达式获取request中map值的问题的主要内容,如果未能解决你的问题,请参考以下文章

EL表达式怎么获取Map的动态key?

EL表达式怎么获取Map的动态key?

如何用EL表达式获取map的值

JSP ELEL表达式 获取list长度/不用循环,EL在List中直接获取第一项的内容/EL获取Map的键,Map的值

JSP中 EL表达式 JSTL表达式

在jsp中使用el表达式通过键获得后台的一个map<Long,String>的值