【问题标题】:paramValues not working in JSTL and throwing an exception?paramValues 在 JSTL 中不起作用并引发异常?
【发布时间】:2014-03-26 11:44:19
【问题描述】:

这是我的第一页

    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSP Page</title>
     </head>
     <body>
        <form action="newjstl.jsp" method="post">  
     FirstName:<input type="text" name="fname"/><br/>  
     LastName:<input type="text" name="lname"/><br/>  
     <input type="submit" value="submit"/>  
     </form>  
      </body>
      </html>

第二页是

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  

    <c:forEach var='value' items='${paramValues}'>
          First Name:<c:out value="${value.fname}"></c:out><br/>  
          Last Name:<c:out value="${value.lname}"></c:out>  
        </c:forEach>

它抛出异常 org.apache.jasper.JasperException: javax.el.PropertyNotFoundException: 类'java.util.HashMap$Entry'没有属性'fname'。 我不知道为什么它不起作用。

【问题讨论】:

    标签: jstl


    【解决方案1】:

    http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPIntro7.html#wp71044

    paramValues是参数的映射。它将参数名称(映射的键)映射到它们的值(字符串数组)。

    您正在迭代此地图。因此,forEach 循环遍历映射的条目,这些条目的类型为Map.Entry&lt;String, String[]&gt;。而且 Map.Entry 没有任何getFname() 方法。

    你真正想要的是

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  
    
    First Name:<c:out value="${param.fname}" /><br/>  
    Last Name:<c:out value="${param.lname}" />  
    

    没有理由循环,您只想获取给定参数的单个值。这就是param 的用途。

    【讨论】:

    • 我知道我已经使用 param.fname 完成了此操作,但现在我想使用 paramValues 执行此操作,因此如果可以帮助我使用 paramValues 实现相同的输出,我将非常感激。
    • 这基本上就像想用螺丝刀敲钉子一样。但是paramValues.fname[0] 应该可以工作。
    • 然后尝试 paramValues['fname'][0]。但是你为什么要使用它而不是 param.fname 呢?
    • 作为 Map.Entry,也许 value.getValue().fname 有效?
    • hmm,我不熟悉 JSP,只是认为它可能会起作用,另一个尝试的选项是 value.value.fname
    【解决方案2】:

    JB Nizet 说对了。

    假设在“第一页”中“fname”设置为“George”,“lname”设置为“Smith”。

    'paramValues' 是HashMap,所以当你在'forEach' 中使用它时,你在'value' 中得到的是Map.Entry,而Map.Entry 没有'fname' 字段,因此没有可供 JSP 调用的“getFname”方法。

    如果你坚持,'value' 可以用作 '${value.key}' 和 '${value.value}',但这会让你得到对:

    'fname', "George"
    'lname', "Smith"
    

    分别。我怀疑这就是你想要的。使用“forEach”的唯一原因是您期待多个答案并且需要遍历所有答案。这不是作为示例给出的内容。

    以下内容是从Implicit Objects 复制而来的,几乎展示了我上面的建议。

      <%-- For every String[] item of paramValues... --%>
      <c:forEach var='parameter' items='${paramValues}'> 
         <ul>
            <%-- Show the key, which is the request parameter
                 name --%>
            <li><b><c:out value='${parameter.key}'/></b>:</li>
    
            <%-- Iterate over the values -- a String[] -- 
                 associated with this request parameter --%>
            <c:forEach var='value' items='${parameter.value}'>
               <%-- Show the String value --%>
               <c:out value='${value}'/>   
            </c:forEach>
         </ul>
      </c:forEach>
    

    【讨论】:

    • TruePS 让我看看这个。
    • 我完全理解你在说什么,但我只是想获得一个参数值的例子。应该有一些方法可以让 George Smith 使用参数值。
    • @TruePS 好吧,因为我没有方便测试的 JSP 站点,我不知道这是否可行,但您可以尝试在 ${ 的结果上使用 'forEach'参数值。值}。 HashMap 的 'values' 方法返回一个集合,所以 'forEach' 应该对它感到满意。问题是,我不确定 JSP 是要调用 HashMap 的“values”方法,还是去寻找“getValues”方法。如果是后者,这是行不通的。此外,无法保证您获取值的顺序。它可能很容易成为 Smith George,就像 George Smith 一样。
    • 那就没办法了。对不起!
    • 没关系,我最后一次帮助我搜索了许多 paramValues 示例,但找不到任何有价值的示例。如果您能找到任何关于使用 paramvalues 的 10-20 行的简单示例,那么我很乐意结束这个问题并将您的答案标记为已接受的答案。
    【解决方案3】:

    将参数传递给jsp jstl:

    /* JSP PARENT */
    
    <jsp:include page="../../templates/options.jsp">                    
        <jsp:param name="action" value="${myValue}"/>       
    </jsp:include>
    
    
    /* JSP CHILD (options.jsp)*/
    
    <div id="optionButtons left">       
        <span>${param.action}</span>
    </div>
    

    【讨论】:

      【解决方案4】:

      因为表单中的字段名称不同,所以不能使用“forEach”标签。我认为这会奏效!

      First Name:${param.fname}
      Last Name:${param.lname}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-01
        • 2019-05-28
        • 2019-12-21
        • 2021-12-16
        • 1970-01-01
        • 2012-07-15
        • 1970-01-01
        相关资源
        最近更新 更多